Benutzen des auslösenden Events im Ausführungsteil ($EVTPart)

Begonnen von Garbsen, 29 Dezember 2016, 13:27:59

Vorheriges Thema - Nächstes Thema

Garbsen

Moin


Wie löse ich folgende Aufgabe:

Ich habe in einem DOIF vier readings (Modus,SollAktuell,Tag,Nacht), immer wenn sich ein Reading ändert, soll an ein anderes Device ein set Befehl gegeben werden und zwar genau für das identische Reading und mit dem geänderten Wert.

Derzeit habe ich folgendes definiert:

Code: [Auswählen]
##CMD1
(["$SELF:.*"])


({fhem ("set FBSetBad Modus ".[$SELF:Modus])})
({fhem ("set FBSetBad SollAktuell ".[$SELF:SollAktuell])})
({fhem ("set FBSetBad Nacht ".[$SELF:Nacht])})
({fhem ("set FBSetBad Tag ".[$SELF:Tag])})

Das führt aber dazu, dass immer für alle vier readings der set befehlt ausgeführt wird. Das ist nicht erwünscht. Es soll beim FBSetBad immer nur das Reading neu gesetzt werden, dass sich im DOIF geändert hat.
Beim FBSetBad handelt es sich um ein httpmod, dass dann die Fußbodenheizung befüllt. Das lässt sich daher nicht direkt im DOIF abbilden.

Klar ich könnte im DOIF für jedes Reading ein eigenen DOELSEIF Zweig anlegen, finde das anders aber eigentlich schlanker, wenn es denn geht.
Ich habe bereits mit $EVTPART "gespielt" bekomme es ber nicht hin.

D.h. Ändert sich z.B. Modus von 0 auf 2, triggert zwar das Doif , ich finde aber keine Möglichkeit im set Befehl das Reading so zu formatieren, dass der Befehl sich auf das Reading Modus von FBSetBad bezieht und nur der neue Wert (2) gesetzt wird.

Irgendeine Lösung?
Danke
K-H
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Per

Könntest du einfach die komplette Definition des DOIF einstellen? Am besten in Code-Tags.

Und: in der CommandRef steht nichts von $EVTPART. Ergo?!

Garbsen

Zitat von: Per am 29 Dezember 2016, 13:59:41
Könntest du einfach die komplette Definition des DOIF einstellen? Am besten in Code-Tags.

Und: in der CommandRef steht nichts von $EVTPART. Ergo?!


defmod FBFlur DOIF ##CMD1\
([$SELF]) \
\
({fhem ("set FBSetFlur Modus ".[$SELF:Modus])})\
({fhem ("set FBSetFlur SollAktuell ".[$SELF:SollAktuell])})\
({fhem ("set FBSetFlur Nacht ".[$SELF:Nacht])})\
({fhem ("set FBSetFlur Tag ".[$SELF:Tag])})\
\
\
\
##CMD2\
DOELSEIF\
([Alpha2:HK5Modus] ne ReadingsVal("$SELF","Modus","")\
\
or\
[Alpha2:HK5Soll] ne ReadingsVal("$SELF","SollAktuell","")\
\
or\
[Alpha2:HK5Tag] ne ReadingsVal("$SELF","Tag","")\
\
or\
[Alpha2:HK5Nacht] ne ReadingsVal("$SELF","Nacht","") \
\
or\
[Alpha2:HK5Batterie] ne ReadingsVal("$SELF","Batterie","") \
\
or\
[Alpha2:HK5Stellantrieb] ne ReadingsVal("$SELF","Stellantrieb","")) \
\
(setreading $SELF Tag [Alpha2:HK5Tag])\
(setreading $SELF SollAktuell [Alpha2:HK5Soll])\
(setreading $SELF Modus [Alpha2:HK5Modus])\
(setreading $SELF Nacht [Alpha2:HK5Nacht])\
(setreading $SELF Batterie [Alpha2:HK5Batterie])\
(setreading $SELF Stellantrieb [Alpha2:HK5Stellantrieb])\
\
\
\
\
\
##CMD3\
DOELSE\

attr FBFlur readingList Modus Tag Nacht SollAktuell Batterie Stellantrieb
attr FBFlur room Heizung
attr FBFlur setList Modus:0,1,2\
SollAktuell:knob,min:5,max:30,step:1\
Tag:knob,min:5,max:30,step:1\
Nacht:knob,min:5,max:30,step:1
attr FBFlur webCmd Modus:SollAktuell:Tag:Nacht
attr FBFlur widgetOverride readingList:textField-long setList:textField-long webCmd:textField-long

setstate FBFlur cmd_3
setstate FBFlur 2016-12-29 11:07:07 Batterie 2
setstate FBFlur 2016-12-29 14:52:00 Device Alpha2
setstate FBFlur 2016-12-29 11:07:07 Modus 0
setstate FBFlur 2016-12-29 11:07:07 Nacht 16.0
setstate FBFlur 2016-12-29 11:07:07 SollAktuell 21.0
setstate FBFlur 2016-12-29 11:07:07 Stellantrieb 0
setstate FBFlur 2016-12-29 11:07:07 Tag 21.0
setstate FBFlur 2016-12-29 11:08:07 cmd 3
setstate FBFlur 2016-12-29 11:08:07 cmd_event Alpha2
setstate FBFlur 2016-12-29 11:08:07 cmd_nr 3
setstate FBFlur 2016-12-29 14:52:00 e_Alpha2_HK5Batterie 2
setstate FBFlur 2016-12-29 14:52:00 e_Alpha2_HK5Modus 0
setstate FBFlur 2016-12-29 14:52:00 e_Alpha2_HK5Nacht 16.0
setstate FBFlur 2016-12-29 14:52:00 e_Alpha2_HK5Soll 21.0
setstate FBFlur 2016-12-29 14:52:00 e_Alpha2_HK5Stellantrieb 0
setstate FBFlur 2016-12-29 14:52:00 e_Alpha2_HK5Tag 21.0
setstate FBFlur 2016-12-28 23:15:14 e_FBFlur_STATE cmd_3
setstate FBFlur 2016-12-29 11:08:07 state cmd_3




Hier die Definition, da ich kein Programmierer bin, ist mir nicht bewusst, was man da mehr zur Problemlösung sieht, sorry.
Meine Erfahrung zeigt leider, dass in der Commandref nicht immer Alles steht ;-)
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Ellert

#3
Ich würde immer die Lösung nehmen, die ich selbst erarbeitet haben und daher auch verstehe, dann kann ich sie auch selbst warten und verändern.

Insofern ist die Lösung mit 4 Zweigen gut.

Ich würde den Set-Befehl schlanker machen:
(set FBSetFlur Modus [$SELF:Modus])

und auch hier stellt sich die Frage, warum Du ReadingsVal verwendest.
([Alpha2:HK5Modus] ne ReadingsVal("$SELF","Modus","")

In der Dokumentation zum DOIF gibt es kein Beispiel das ReadingsVal vorschlägt.

Garbsen

@Ellert

Danke für die Hinweise zur Verschlankung. Gleich umgesetzt. Das waren noch Restanten aus dem Umstellen von alten notify Befehlen und dem Rantasten an das DOIF. nach dem Motto "Läuft - nicht ändern",

Habe es jetzt so gestaltet:



defmod FBBad DOIF ##CMD1\
(["$SELF:Modus"]) \
\
(set FBSetBad Modus [$SELF:Modus])\
\
##CMD2\
DOELSEIF\
(["$SELF:SollAktuell"]) \
\
(set FBSetBad SollAktuell [$SELF:SollAktuell])\
\
##CMD3\
DOELSEIF\
(["$SELF:Nacht"]) \
( set FBSetBad Nacht [$SELF:Nacht])\
\
##CMD4\
DOELSEIF\
(["$SELF:Tag"]) \
(set FBSetBad Tag [$SELF:Tag])\
\
##CMD5\
DOELSEIF\
([Alpha2o:HK8Modus] ne [$SELF:Modus]\
\
or\
[Alpha2o:HK8Soll] ne [$SELF:SollAktuell]\
\
or\
[Alpha2o:HK8Tag] ne [$SELF:Tag]\
\
or\
[Alpha2o:HK8Nacht] ne [$SELF:Nacht]\
\
or\
[Alpha2o:HK8Batterie] ne [$SELF:Batterie]\
\
or\
[Alpha2o:HK8Stellantrieb] ne [$SELF:Stellantrieb]\
\
) \
\
(setreading $SELF Tag [Alpha2o:HK8Tag])\
(setreading $SELF SollAktuell [Alpha2o:HK8Soll])\
(setreading $SELF Modus [Alpha2o:HK8Modus])\
(setreading $SELF Nacht [Alpha2o:HK8Nacht])\
(setreading $SELF Batterie [Alpha2o:HK8Batterie])\
(setreading $SELF Stellantrieb [Alpha2o:HK8Stellantrieb])\
\
\
\
##CMD6\
DOELSE\

attr FBBad readingList Modus Tag Nacht SollAktuell Batterie Stellantrieb
attr FBBad room Heizung
attr FBBad setList Modus:0,1,2\
SollAktuell:knob,min:5,max:30,step:1\
Tag:knob,min:5,max:30,step:1\
Nacht:knob,min:5,max:30,step:1
attr FBBad webCmd Modus:SollAktuell:Tag:Nacht
attr FBBad widgetOverride readingList:textField-long setList:textField-long webCmd:textField-long

setstate FBBad cmd_6
setstate FBBad 2016-12-27 21:17:02 .* 0
setstate FBBad 2016-12-29 16:12:00 Batterie 2
setstate FBBad 2016-12-29 16:16:00 Device Alpha2o
setstate FBBad 2016-12-29 16:12:00 Modus 0
setstate FBBad 2016-12-29 16:12:00 Nacht 18.0
setstate FBBad 2016-12-29 16:12:00 SollAktuell 18.0
setstate FBBad 2016-12-29 16:12:00 Stellantrieb 0
setstate FBBad 2016-12-29 16:12:00 Tag 23.0
setstate FBBad 2016-12-29 16:16:00 cmd 6
setstate FBBad 2016-12-29 16:16:00 cmd_event Alpha2o
setstate FBBad 2016-12-29 16:16:00 cmd_nr 6
setstate FBBad 2016-12-29 16:16:00 e_Alpha2o_HK8Batterie 2
setstate FBBad 2016-12-29 16:16:00 e_Alpha2o_HK8Modus 0
setstate FBBad 2016-12-29 16:16:00 e_Alpha2o_HK8Nacht 18.0
setstate FBBad 2016-12-29 16:16:00 e_Alpha2o_HK8Soll 18.0
setstate FBBad 2016-12-29 16:16:00 e_Alpha2o_HK8Stellantrieb 0
setstate FBBad 2016-12-29 16:16:00 e_Alpha2o_HK8Tag 23.0
setstate FBBad 2016-12-29 16:16:00 state cmd_6





Aber ich würde gerne die ersten 4 Zweige zu einem Verschlanken.
Mit dem "verstehen" damit man es auch ändern kann gebe ich Dir Recht, aber darum geht es mir ja, ich will verstehen, ob es auch schlanker geht. ;-)
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Ellert

Wenn Du die 4 Zweige verallgemeinert schreiben möchtest, dann solltest Du dir den Abschitt Ereignissteuerung_ueber_Auswertung_von_Events ansehen. Dort wird erklärt wie Du über Regex einen allgemeinen Auslöser formulieren und Du auf die passenden Events zugreifen kannst.

Das Beispiel zur Batteriewarnung ist ein gutes Beispiel dafür.

Garbsen

Ok, das hatte ich auch schon mal gesehen, war mit aber nicht sicher, ob das der richtige Weg ist (vermutlich weil ich es nicht ganz verstanden habe) aber das schaue ich mir jetzt nochmal an!
Learning by Doing ist eh das Beste!
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Ellert

Hier mal was für Raw definition, copy&paste das Batteriebeispiel zum spielen:
define battState_Labor DOIF ([":^battery: low"] and [?$SELF:BATT$DEVICE,"init"] ne "low")\
   (setreading $SELF msg {((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Battery is low")}, {Log 1,((AttrVal("$DEVICE","alias","") ? AttrVal("$DEVICE","alias","") : "$DEVICE")." Battery is low")},setreading $SELF BATT$DEVICE low)\
DOELSEIF ([":^battery: ok"] and [?$SELF:BATT$DEVICE,"init"] ne "ok")\
   (setreading $SELF BATT$DEVICE ok, setreading $SELF msg -)
attr battState_Labor alias einmal Statusmeldung je Gerät für ["<;Regex>;:^battery: low"] mit autom. Rücksetzung
attr battState_Labor do always
attr battState_Labor group Labor: Statusabfragen
attr battState_Labor room DOIF_Labor
attr battState_Labor stateFormat msg


define statusBattWndw_Labor0 dummy
attr statusBattWndw_Labor0 alias Fenstersensor
attr statusBattWndw_Labor0 group Labor: Statusabfragen
attr statusBattWndw_Labor0 readingList battery
attr statusBattWndw_Labor0 room DOIF_Labor
attr statusBattWndw_Labor0 setList battery:ok,low
attr statusBattWndw_Labor0 stateFormat Batterie: battery
attr statusBattWndw_Labor0 webCmd battery ok:battery low

define statusBattWndw_Labor1 dummy
attr statusBattWndw_Labor1 group Labor: Statusabfragen
attr statusBattWndw_Labor1 readingList battery
attr statusBattWndw_Labor1 room DOIF_Labor
attr statusBattWndw_Labor1 setList battery:ok,low
attr statusBattWndw_Labor1 stateFormat Batterie: battery
attr statusBattWndw_Labor1 webCmd battery ok:battery low

Garbsen

Danke, das hatte ich mir schon angesehen.
Komme aber nicht weiter. AttrVal hilft kaum, da es um readings geht. ReadingsVal erfordert, dass ich das Reading kenne, aberdarum geht es ja gerade, ich möchte von jedem Reading des DOIF triggers lassen, dann aber wissen, welches getriggert hat und das bei der Ausgabe benutzen um zu bestimmen, welches Reading des zu steuernden Devices angesprochen wird. Ist wohl ein Thema für Wunschliste solange es $EVTPART bei DOIF nicht gibt
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Ellert

Wozu benötigst Du $EVTPART, wenn es doch $EVENT gibt?
z.B.:
setreading $SELF $EVENT

Garbsen

Zitat von: Ellert am 30 Dezember 2016, 07:55:56
Wozu benötigst Du $EVTPART, wenn es doch $EVENT gibt?
z.B.:
setreading $SELF $EVENT

$EVENT gibt als Wert das sich ändernde Reading plus den Wert des Redings zurück: z.B. Modus: 1
setreading $Device Modus: 1 ist aber keine gültige Syntax

Ich bräuchte aus dem Trigger von $Self getrennt das triggered Reading und den jeweiligen Wert um dann setreading $device Reading Wert schreiben zu können also setreading $device $EVTPART0 $EVTPART1

wenn es denn $EVPART im doif geben würde. Oder halt eine andere Lösung.
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

Per

Du könntest einfach den Doppelpunkt durch ein Leerzeichen ersetzen. Entweder im Befehl oder im Device mit stateFormat (beides in Perl).
Wäre das Gleiche wie $EVTPART0." ".$EVTPART1, nur ohne extra Variablen.

Ellert

Vielleicht geht es so:
{($EVENT=~ m/(.*):(.*)/;; "$1 $2")}
oder so
{($event=~ m/(.*):(.*)/;; "$1 $2")}