Hallo,
ich habe folgende Situation:
2 FHEM-Server, einer zum Schalten mit PCA301, RFXTRX und HMLAN (FHEM1) und der zweite(FHEM2) mit LaCrosse und Ausgabe an Tablet.
Ich möchte mit TabletUI einige Switche bedienen, die auf FHEM1 angeschlossen und geschaltet werden. Dabei sind alle 3 Übertragungsmodule im Einsatz.
Dabei soll aber am Tablet immer der Aktuelle Switch-Zustand angezeigt werden: z.B.
Ich komme nach Hause schalte Lampe1 am Tablet an, FHEM1 schlatet Lampe1 in der Nacht wieder aus und dieses soll zurück an die Tabletanzeige.
Dafür habe ich folgendes Konstrukt gebaut: (läuft alles am FHEM2)
Dummy fürs Tablet zum Schalten
define swBaum dummy
attr swBaum setList on off
Notify gibt Schaltbefehl vom Tablet an FHEM1 weiter
define notify_swBaum notify swBaum {system ("echo 'set PCA301_036055 $EVENT' | socat - TCP:192.168.100.232:7072");;}
AT checkt alle Minute über system-get-Funktion in 99_myUtils den Zustand des PCA-Switches an FHEM1
define atGet_swBaum at +*00:01:00 { if (MyGetStatus("PCA301_036055") eq "on") {fhem("set Get_swBaum on")} else {fhem("set Get_swBaum off")}}\
Dummy und Notify geben den Zustand weiter an Tablet-Switch
define Get_swBaum dummy
attr Get_swBaum setList on off
define notify_GetswBaum notify Get_swBaum set swBaum $EVENT
Das funktioniert soweit alles ganz gut.
Das schein mir aber sehr umständlich ?! Ich hab aber keine andere Lösung, mit allen drei Übertragungs-Devices funktioniert gefunden. Das Problemkind waren HMLAN und RFXTRX, PCA ging über FHEM2FHEM.
Jetzt die Frage an die Profis. Gibt dafür vielleicht doch eine elegantere Lösung.
LG Tom
Ich habe genau das mit meinen BT Candles.
Auf Fhem2 sind die Devices. Auf fhem1 die Dummys. Beide fhems sind mit fhem2fhem auf beiden fhem Instanzen verbunden. Wichtig ist das Du eine enge RegEx für das Log auf beiden Instanzen verwendest.
Ja und genau das wird das Prblem sein, die RegEx (nicht mein Spezialgebiet).
Muss dann auf beiden Fhem-Servern je eine FHEM2FHEM-Kopplung laufen? Und wie könnte man die RegEx z.B. für obiges Beispiel gestalten?
Danke
Ja auf beiden Seiten muss dann fhem2fhem laufen.
Ganz einfach. set Befehle haben im Gegensatz zu Readings keine :
Somit also unterschiedliche Events.
Dein Device ist eingerichtet auf fhem2 und schalten willst du von fhem1
set dummy1 on
Als Event würde kommen
dummy1 dummy1 on
Deine Log Regex wäre also dummy1.on
Deine Regex für ein Notify auf fhem2 wäre also
define bla Notify dummy1.on set Device on
Als Event vom Device auf fhem2 kommt nun
Device device: on
Also ist deine Regex für Log auf fhem1
Device:.on
Ich habe sowas in Betrieb und kann versuchen dir ein Beispiel später zu posten.
Ja, das wäre schön.
D.h. aber auch, ich brauche für jeden dummy je eine FHEM2FHEM-Kopplung auf jedem FHEM-Server, also bei 3 Dummys 3 FHEM2FHEM auf FHEM1 und 3 FHEM2FHEM auf FHEM2, oder versteh ich da was falsch?
Nein. Nur eine Verbindung pro Richtung. Welche Daten er dann auf schnappt entscheidet deine RegEx.
Wenn zum Beispiel alle Dummys mit Licht beginnen. Dann halt
LichtDummy[1-9].*
So lauscht die Verbindung auf alle Lichtdummys von 1-9
Ich gebe zu es ist nicht einfach und man muss etwas überlegen. Aber es geht.
Ok. Das werd ich mal heute Abend mit einem Dummy zu Hause testen.
Ich dachte die FHEM2FHEM-Kopplung ist nur unidirektional, weil in vielen Postings immer die Rede von Rückkopplungen und Endlosschleifen die Rede ist.
Vielleicht könntest Du mir doch noch ein Beispiel posten.
Danke
Wenn man nicht auf passt dann kann sowas passieren. Du musst halt eben ganz genau darauf achten wie Du was machst.
Das hier ist mein FHEM01 Hauptgerät
Internals:
CFGFN
DEF 10.6.6.20:7072 LOG:(ELANKlm|ESSOTeltow|JETMahlowerStr|JETReihnstr|SHELLStahnsdorf|SPRINTBerlin|SYSMON_Webapp01|calendarBrbGermanyFeiertage|calendarBrbFerien|Candle[1-9].(on|off|unreachable|rgb:|color:|battery:|onoff:|effect:|sat:|speed:)).*
FD 36
Host 10.6.6.20:7072
NAME FHEM01toFHEM02
NR 505
PARTIAL
STATE connected
TYPE FHEM2FHEM
informType LOG
regexp (ELANKlm|ESSOTeltow|JETMahlowerStr|JETReihnstr|SHELLStahnsdorf|SPRINTBerlin|SYSMON_Webapp01|calendarBrbGermanyFeiertage|calendarBrbFerien|Candle[1-9].(on|off|unreachable|rgb:|color:|battery:|onoff:|effect:|sat:|speed:)).*
Attributes:
room EDV
Hier beachten wir bitte nur den Eintrag für Candle[1-9] mit samt der Readings. Die entsprechenden Devices liegen ja auf dem FHEM02 Server
Internals:
BTMAC AC:E6:4B:07:93:DD
DEF AC:E6:4B:07:93:DD
NAME Candle2
NR 22
STATE off
TYPE PlayBulbCandle
VERSION 0.8.1
Readings:
2016-11-12 18:28:19 battery 100
2016-11-12 18:28:19 color on
2016-11-12 18:28:19 effect Candle
2016-11-12 18:28:19 onoff 0
2016-11-12 16:54:14 rgb ff0000
2016-11-12 16:54:14 sat 0
2016-11-12 18:28:19 speed 120
2016-11-12 18:28:19 state off
Helper:
effect Candle
onoff 0
rgb ff0000
sat 0
speed 120
Attributes:
alias Candle green
devStateIcon unreachable:light_question
event-on-change-reading .*
model BTL300_v5
room PLAYBULB
webCmd rgb:rgb FF0000:rgb 00FF00:rgb 0000FF:rgb FFFFFF:rgb F7FF00:rgb 00FFFF:rgb F700FF:effect
bedeutet. Wenn sich auf FHEM02 der Status des Devices Candle2 ändert wird ein Event aus gelöst welches dann von der FHEM2FHEM Verbindung auf FHEM01 erfasst wird und auf FHEM01 als Event wieder gegeben wird. Man kann auch sagen es wird durchgereicht wenn man so will. So nun haben wir auf FHEM01 Events welche wir weiter verarbeiten können. So konnen wir zum Beispiel ein Notify bauen das die Events vom FHEM02 triggert.
Internals:
CFGFN
DEF Candle[1-9].* {
my @v = split(':',$EVENT);
my $reading = $v[0];
my $value = $v[1];
my $device = "dummy".$NAME;
fhem "setreading $device $reading $value" if( defined($v[1]) );
}
NAME notifyPlayBulbCandle
NR 519
NTFY_ORDER 50-notifyPlayBulbCandle
REGEXP Candle[1-9].*
STATE 2016-11-12 18:42:18
TYPE notify
Readings:
2016-11-08 13:41:32 state active
Attributes:
und die erhaltenen Werte des Events in ein dummy schreibt
Internals:
CFGFN
NAME dummyCandle2
NR 520
STATE off
TYPE dummy
Readings:
2016-11-06 21:42:10 battery 100
2016-11-05 09:49:54 color on
2016-11-05 09:49:54 effect Candle
2016-11-12 18:28:22 onoff 0
2016-11-06 21:42:47 rgb ff0000
2016-11-05 09:49:54 sat 0
2016-11-06 21:42:10 speed 120
2016-11-12 18:28:08 state off
Attributes:
alias Candle green
room Licht to Go
setList on:noArg off:noArg rgb:colorpicker,RGB sat:slider,0,5,255 effect:Flash,Pulse,RainbowJump,RainbowFade,Candle,none speed:slider,170,50,20 color:on,off statusRequest:noArg
webCmd rgb:rgb FF0000:rgb 00FF00:rgb 0000FF:rgb FFFFFF:rgb F7FF00:rgb 00FFFF:rgb F700FF sat:sat:effect
In die andere Richtung ist es dann einfacher ;D
Aber versuch mal ob Du hier erstmal durch siehst.
Eiegntlich musst Du wirklich nur darauf achten welche Events Deine Devices auslösen. Angefangen auf der FHEM Instanz wo sich das tatsächliche Moduldevice befindet. Du schaltest also on, schaust im Eventmonitor wie der Event aus schaut und baust Dir auf Deiner anderen FHEM Instanz den entsprechenden LOG RegEx für FHEM2FHEM.
Soweit so gut
Ich hab folgendes gemacht:
define FHEM3toFHEM1 FHEM2FHEM 192.168.100.232:7072 LOG:(Flurlaterne.(on|off)).*
define notifyFlurlaterne notify Flurlaterne set swFlur $EVENT
define swFlur dummy
attr swFlur setList on off
Erklärung: FHEM3 ist der TabletFhem, FHEM1 (100.232) der DeviceFHEM, der Switch ist die Flurlaterne, welche auf dem FHEM3/Tablet als swFlur abgebildet werden soll.
Geht das auch so, oder muss ich den Status (mehr readings gibt es nicht) auch in ein reading des Dummy swFlur schreiben?
Auf jeden Fall, wenn ich jetzt auf dem FHEM1 schalte, ändert sich der Status auf FHEM3 :)
Mach mal bei dem Dummy noch ein setList onoff:0,1 und readingslist onoff
Dann machst du die Gegenseite fertig und schreibst aber ins Notify nicht set on oder off als Befehl für den Dummy sondern set Dummy onoff 1 für on und 0 für off. So kommst du nicht in eine Schleife und in Dein TabletUI nimmst als data-get onoff und data-get-on 1
Sorry bin erst heute wieder zum weiterbasteln gekommen.
Ich habe jetzt auf der Gegenseite folgendes definiert:
define FHEM1toFHEM3 FHEM2FHEM 192.168.100.241:7072 LOG:(swFlur.(onoff:)).*
und das Notify (schein aber so nicht zu gehen)
define notifyswFlur notify swFlur:(onoff).1 set swFlurlaterne 1
ich steh da ein bisschen auf dem Schlauch.
Das Notify soll ja eigentlich die Flurlaterne (s.o) anschalten, also brauche ich doch den dummy swFlurlaterne gar nicht und kann direkt die Flurlaterne schalten?? Aber wie komme ich da von onoff:1 zu on?
Zitat von: fretti am 16 November 2016, 19:22:34
Sorry bin erst heute wieder zum weiterbasteln gekommen.
Ich habe jetzt auf der Gegenseite folgendes definiert:
define FHEM1toFHEM3 FHEM2FHEM 192.168.100.241:7072 LOG:(swFlur.(onoff:)).*
und das Notify (schein aber so nicht zu gehen)
define notifyswFlur notify swFlur:(onoff).1 set swFlurlaterne 1
ich steh da ein bisschen auf dem Schlauch.
Das Notify soll ja eigentlich die Flurlaterne (s.o) anschalten, also brauche ich doch den dummy swFlurlaterne gar nicht und kann direkt die Flurlaterne schalten?? Aber wie komme ich da von onoff:1 zu on?
Das mit : haben nur Readings. Du machst jetzt einfach on|off Ohne :
Ich schaue heute Abend in Ruhe noch mal und schreibe dir dann noch mal
define FHEM3toFHEM1 FHEM2FHEM 192.168.100.232:7072 LOG:(Flurlaterne.(on|off)).*
define notifyFlurlaterne notify Flurlaterne set swFlur $EVENT
define swFlur dummy
attr swFlur setList on off
Um sicher zu gehen das wir keine Schleife bauen machen wir bitte folgende Änderung
define FHEM3toFHEM1 FHEM2FHEM 192.168.100.232:7072 LOG:(Flurlaterne.(on|off))
define notifyFlurlaterne notify Flurlaterne.(on|off) { fhem("setreading swFlur onoff " . ($EVENT == "on" ? "1" : "0")) }
define swFlur dummy
attr swFlur setList on off
attr swFlur stateFormat onoff
attr swFlur devStateIcon 0:light_light_dim_00:on 1:light_light_dim_100:off
Nun wird der Status der Lampe vom anderen Pi auf unserem FTUI Pi im Dummy als Reading onoff star gestellt und durch den stateFormat und das devStateIcon korrekt dargestellt und sogar schaltbar.
Probiere bitte erstmal aus ob das so geht. Also auf dem anderen Pi das Device schalten und schauen ob sich auf dem FTUI Pi das Reading und die Darstellung ändert.
soweit so gut.
In der notifyDefinition war ein kleiner Fehler :-) eq statt ==
Das Icon ändert sich, das Reading onoff auch.
stimmt hast Recht. Sorry.
Super dann haben wir das schon mal korrekt.
Im TabletUI musst du dann
data-get=onoff machen.
So nun die andere Seite. Hier müssen wir nur dafür sorgen das on off vom dummy an kommt und ein notify machen welches $EVENT als set Befehl an Dein tatsächliches Device sendet.
Das scheint jetzt zu funktionieren, ich werde das mal eine zeitlang testen und dann auf die anderen Switche erweitern.
Ein Problem ist noch, dass das TabletUI das Schalten vom FHEM1 erst nach einem reload der Seite anzeigt, ich werd das mal beobachten.
ich hab da folgendes definiert:
data-get="onoff"
data-get-on="1"
data-set-on="on"
Schau mal bitte im Eventmonitor ob das setzen des Readings onoff ein Event auslöst.
Ja macht es.
Ich hab jetzt noch
data-get-off="0"
data-set-off="off"
dazugenommen und siehe da, alles hübsch.
Ich kann jetzt schalten und machen sowohl am TabletUI als auch am DeviceFHEM, alle Stati und Anzeigen sind richtig.
Vielen Dank.
Ich werde mich dann mal am WE an die weiteren Schalter machen, mal sehen ob ich es allein hinbekomme ;D
Schau mal das du die Benennung der Dummys und Switches so machst du das die RegEx für fhem2fhem und Notify breit auslegen kannst. So das du alle abdeckst und nur ein Notify pro Seite brauchst.