Ich hab das Problem, dass ein DOIF bei mir nicht wie erwartet triggert. Auf ein bestimmtes Event wird einfach nicht reagiert.
Die Konstellation ist, dass ich mit einem PRESENCE detektiere, wenn eine Wifi-Led-Bulb im Netz erreichbar wird (also per Wandschalter eingeschaltet wird). Das DOIF soll dann daraufhin ein "reopen" auf dem zugehörigen Yeelight-Gerät auslösen (um es möglichst zeitnah steuern zu können). Als nächster Schritt soll das gleiche DOIF die Farbe der Bulb konfigurieren, sobald das Yeelight-Gerät connectet ist (als Folge des "reopen").
Sieht dann so aus:
([bd_lightCeil_pres:"^state:.present$"]) (set bd_lightCeil reopen)
DOELSEIF
([bd_lightCeil:"^CONNECTED$"]) (set bd_lightCeil hue 123)
Wenn ich jetzt die Bulb einschalte, wird cmd_1 (reopen) ausgelöst (funktioniert). Das wiederum führt zu einem Event "bd_lightCeil: CONNECTED". Dieses Event sollte im gleichen DOIF "set bd_lightCeil hue 123" auslösen.
Das Event kommt zwar, aber DOIF reagiert nicht darauf. Sieht im Event-Monitor so aus:
2018-03-09 20:46:45.148 YeeLight bd_lightCeil CONNECTED
2018.03.09 20:46:45.150 3 : bd_lightCeil: reopen issued.
2018-03-09 20:46:45.158 DOIF sys_di_bd_lightCeil appeared
2018.03.09 20:46:45.160 3 : <EVENT> bd_lightCeil_pres - state: present
2018-03-09 20:46:45.165 DOIF sys_di_eventLog cmd_1
2018-03-09 20:46:45.168 PRESENCE bd_lightCeil_pres present
2018-03-09 20:46:53.120 YeeLight bd_lightCeil power: on
2018.03.09 20:46:53.121 3 : bd_lightCeil updated readings.
Ich vermute, dass es daran liegt, dass die beiden Events "bd_lightCeil_pres: present" und "bd_lightCeil CONNECTED" sozusagen verkettet sind und innerhalb einer einzigen Sequenz erfolgen. Das DOIF reagiert dann nur auf das erste Event.
Der Verdacht hat sich mMn auch bestätigt, da ich einen Workaround gefunden habe mit dem es funktioniert, indem ich den Ablauf durch ein "sleep 0.1" beim ersten Event aufgebrochen habe:
([bd_lightCeil_pres:"^state:.present$"]) (sleep 0.1;set bd_lightCeil reopen)
DOELSEIF
([bd_lightCeil:"^CONNECTED$"]) (set bd_lightCeil hsv 40 100 2000)
Sieht dann so aus:
2018-03-09 20:53:58.006 DOIF sys_di_bd_lightCeil appeared
2018.03.09 20:53:58.007 3 : <EVENT> bd_lightCeil_pres - state: present
2018-03-09 20:53:58.010 DOIF sys_di_eventLog cmd_1
2018-03-09 20:53:58.012 PRESENCE bd_lightCeil_pres present
2018.03.09 20:53:58.102 3 : YeeLight bd_lightCeil - set bd_lightCeil reopen
2018.03.09 20:53:58.105 1 : 192.168.2.57:55443 reappeared (bd_lightCeil)
2018.03.09 20:53:58.107 3 : YeeLight bd_lightCeil - set bd_lightCeil hsv 40 100 2000
2018-03-09 20:53:58.113 DOIF sys_di_bd_lightCeil cmd_3
2018-03-09 20:53:58.114 YeeLight bd_lightCeil CONNECTED
2018.03.09 20:53:58.115 3 : bd_lightCeil: reopen issued.
2018.03.09 20:53:58.116 3 : bd_lightCeil success sending 109: {"method":"set_hsv","params":[40,100,"smooth",2000],"id":109}
Bin ich da auf dem richtigen Weg mit meiner Vermutung? Und gibt es da evtl. noch eine schönere Lösung als "sleep 0.1"?
Danke euch!
Hier noch das komplette List:
Internals:
CFGFN
DEF ([bd_lightCeil_pres:"^state:.present$"]) (sleep 0.1;set bd_lightCeil reopen)
DOELSEIF
([bd_lightCeil_pres:"^state:.absent$"]) (set bd_lightCeil close)
DOELSEIF
([bd_lightCeil:"^CONNECTED$"]) ({my $ar=getColorByTime();; fhem("set bd_lightCeil hsv $ar->[0] 100 2000;sleep 2;set bd_lightCeil default")})
NAME sys_di_bd_lightCeil
NR 2876
NTFY_ORDER 50-sys_di_bd_lightCeil
STATE cmd_3
TYPE DOIF
READINGS:
2018-03-09 20:54:00 Device bd_lightCeil
2018-03-09 20:53:58 cmd 3
2018-03-09 20:53:58 cmd_event bd_lightCeil
2018-03-09 20:53:58 cmd_nr 3
2018-03-09 20:54:00 e_bd_lightCeil_events default
2018-03-09 20:53:57 e_bd_lightCeil_pres_events state: present
2018-03-09 20:52:21 mode enabled
2018-03-09 20:53:58 state cmd_3
Regex:
condition:
0 EventDoIf('bd_lightCeil_pres',$hash,'^state:.present$',1)
1 EventDoIf('bd_lightCeil_pres',$hash,'^state:.absent$',1)
2 EventDoIf('bd_lightCeil',$hash,'^CONNECTED$',1)
devices:
0 bd_lightCeil_pres
1 bd_lightCeil_pres
2 bd_lightCeil
all bd_lightCeil_pres bd_lightCeil
do:
0:
0 sleep 0.1;set bd_lightCeil reopen
1:
0 set bd_lightCeil close
2:
0 set bd_lightCeil hsv 40 100 2000
3:
helper:
DOIF_Readings_events
DOIF_eventas
event default
globalinit 1
last_timer 0
sleeptimer -1
timerdev bd_lightCeil
timerevent CONNECTED
triggerDev bd_lightCeil
bm:
DOIF_Notify:
cnt 695
dmx -1000
dtot 0
dtotcnt 0
mTS 09.03. 20:53:34
max 0.0273849964141846
tot 0.0781958103179932
mAr:
HASH(0x8e0efe8)
HASH(0x790ab88)
DOIF_Set:
cnt 16
dmx -1000
dtot 0
dtotcnt 0
mTS 09.03. 20:53:34
max 0.000171899795532227
tot 0.000757455825805664
mAr:
HASH(0x8e0efe8)
sys_di_bd_lightCeil
?
timerevents:
CONNECTED
timereventsState:
CONNECTED
triggerEvents:
default
triggerEventsState:
default
internals:
itimer:
readings:
trigger:
all bd_lightCeil_pres bd_lightCeil
uiState:
uiTable:
Attributes:
addStateEvent 1
cmdState appeared,away,connected
do always
event-on-change-reading state
Durch sleep hast du es korrekterweise entkoppelt, wait hätte es auch getan.
Danke für die prompte Antwort!
Habe jetzt versucht, das "sleep 0.1" durch Attribut "wait 0.1" zu ersetzen. Aber damit funktioniert es leider nicht (obwohl ich es sauberer gefunden hätte).
Bei wait braucht man noch:
https://fhem.de/commandref_DE.html#DOIF_selftrigger
Danke ja, damit klappt's!