Hallo,
ich habe da zwei setList's: Group und Pos:
attr WZ_Rollo setList Group:Alle,Rollo1,Rollo2,Rollo3 Pos:Close,20%,40%,60%,80%,Open
attr WZ_Rollo webCmd Group:Pos
und ein Notify
define n_WZ_Rollo notify WZ_Rollo set TerrasseControl $EVENT
Im $EVENT steht aber nur der Wert aus der gerade selektierten Liste.
Ich benötige aber, für ein komplettes Kommando, auch den Wert aus der
jeweils anderen Liste. Wie greift man denn darauf zu?
Gruß Crania
Ein Event (Ereignis) ist immer nur eine einzelne Aktualisierung eines Readings.
Ein notify reagiert auf diese Ereignisse.
Du musst überlegen: Event triggert Massnahme
Wenn ich richtig verstanden habe, möchtest Du nur "triggern" wenn Pos sich ändert, und dabei dann Group benutzen
Das heisst: notifu auf "Pos" Trigger bauen, und im Befehl, mit ReadingsVal("WZ_Rollo","Group","defaultval") oder SetMagic greifen.
Z.B.:
define n_WZ_Rollo notify WZ_Rollo:Pos.* set TerrasseControl [WZ_Rollo:Group] $EVENT
Hallo amenomade,
was Du geschrieben hast ist genau das was ich vorhabe.
Ich habe das Notify jetzt daraufhin geändert.
Dieser Teil funktioniert jetzt. Es wird nur noch auf Änderungen in Pos getriggert.
Weiterhin wird in $EVENT nur ,,Pos" weitergegeben, hier musste ich $EVTPART0 $EVTPART1 reinsetzen.
define n_WZ_Rollo notify WZ_Rollo:Pos.* set TerrasseControl $EVTPART0-$EVTPART1
Dann erscheint im Log: DEBUG>Set:Pos-80% das ist soweit ok.
Aber zum zweiten Teil – Zugriff auf Group - habe ich immer noch ein massives Verständnisproblem.
define n_WZ_Rollo notify WZ_Rollo:Pos.* set TerrasseControl $EVTPART0-$EVTPART1-ReadingsVal("WZ_Rollo", "Group", "def")
bringt mir im Log:
DEBUG>Set:Pos-80%-ReadingsVal("WZ_Rollo","Group","def")
Der Ausdruck ReadingsVal("WZ_Rollo","Group","def") wird gar nicht ausgewertet, sondern 1:1 als Kommando weitergegeben.
Was ich hier benötige, ist der aktuell selektierte Wert aus Group.
Was Beispielhaft letztendlich rauskommen soll ist:
DEBUG>Set:Pos-80%-Group-Rollo1
Was mir auch unklar ist, das die zwei Listen - Group und Pos - ja keine Readings sind, sondern Attribute von WZ_Rollo.
Gruß Crania
ReadingsVal ist eine Perlfunktion. Daher musst Du alles in Perl schreiben oder SetMagic verwenden
define n_WZ_Rollo notify WZ_Rollo:Pos.* set TerrasseControl $EVTPART0-$EVTPART1-[WZ_Rollo:Group]
Hoffe ich habe Dich da richtig verstanden wie Du es brauchst
Hallo CoolTux,
ja, genauso wäre es richtig, ja wenn es denn funktionieren würde.
Es hat mich aber auch ein Stück weitergebracht.
define n_WZ_Rollo notify WZ_Rollo:Pos.* set TerrasseControl $EVTPART0-$EVTPART1-[WZ_Rollo:Group]
Dies bringt mir jetzt im Log
DEBUG>Set:Pos-40%-[WZ_Rollo:Group]
Die Erkenntnis ist: Egal was ich hinter $EVTPART1 eintrage, es wird 1:1 als Kommando übertragen.
Es werden nur $NAME, $EVENT, $EVTPART, $TYPE akzeptiert/umgesetzt.
Werde mich noch mal mit den Unterschieden {xx}, [xx], fhem(xx) beschäftigen.
Gruß Crania
Dann in Perl. Zusammen mit
fhem()
define n_WZ_Rollo notify WZ_Rollo:Pos.* { CommandSet(undef,'TerrasseControl '. $EVTPART0 . '-' . $EVTPART1 . '-' . ReadingsVal('WZ_Rollo', 'Group', undef)
Hallo,
also die Lernkurve von Fhem und Perl ist wirklich sehr, sehr steil.
Vielleicht interessiert es den Einen oder Anderen wie die Lösung aussieht.
Wie in den vorigen Post's beschrieben, habe ich zwei Listen im Device dummy: Group und Pos.
Diese sollen über ein notify zu EINEM Kommando zusammengeführt werden.
Hier also die Lösung zum obigen Problem:
1. Das Notify muss auf BEIDE Listen ein Event erzeugen
2. Der Name der jeweils selektierten Liste steht in $EVTPART0
3. Der Wert aus der jeweils selektierte Liste steht in $EVTPART1
4. Der Wert aus der Liste Group wird in einem Reading zwischengespeichert
5. Wenn die Liste Pos ein Event erzeugt, wird das Kommando zusammengebaut und versendet.
6. That's it
Hier das Notify
WZ_Rollo {
if ($EVTPART0 eq "Group" ) {
fhem("setReading WZ_Rollo group $EVTPART1");
}
if ($EVTPART0 eq "Pos" ) {
my $cmd = "Group-[WZ_Rollo:group]-$EVTPART0-$EVTPART1" ;
fhem("set TerrasseControl $cmd");
}
}
Man lernt nur dazu, wenn etwas nicht funktioniert.
Vielen Dank an alle für die kreativen Hinweise.
Gruß Crania