Trigger-Problem bei "verketteten" Events

Begonnen von vbs, 09 März 2018, 21:05:14

Vorheriges Thema - Nächstes Thema

vbs

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

Damian

Durch sleep hast du es korrekterweise entkoppelt, wait hätte es auch getan.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

vbs

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).

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

vbs