DOIF Löst aus obwohl es eigentlich nicht sollte...

Begonnen von misux, 06 Februar 2021, 22:48:43

Vorheriges Thema - Nächstes Thema

misux

Hallo

Ich habe ein kleines Problemchen mit einem DOIF...

Es geht explizit um die Sequenz 3... 

Um 22.25 wurde die Sequenz 1 ordnungsgemäß durchgeführt nachdem TVTime state off gegangen ist. (set WZEZ_WZFLed on)

Um 22.30 wurde die Sequenz 4 auch ordnungsgemäß durchgeführt. (set WZEZ_WZFLed off) (set WZBodenLed off)

Aber warum wurde um 22.32 die Sequenz 3 durchgeführt obwohl alles so zutraf wie es sein sollte? (set WZEZ_WZFLed on-for-timer 900)???
Er sollte doch nur auf [PartyTime:state] eq "off" and [TVTime:state] eq "off" triggern dabei waren diese Werte schon längst off... Verstehe ich nicht.

Hat jemand eine Idee?

Vielen Dank!


Internals:
   DEF        ([?15:00-22:30] and [TVTime:state] eq "off" and [LichtSensor:brightness] < 20.0 and [?WZEZ_WZFLed] eq "off")
(set WZEZ_WZFLed on)
DOELSEIF
([PartyTime:state] eq "on" and [?LichtSensor:brightness] < 20.0 and [?WZEZ_WZBodenLed] eq "off")
(set WZBodenLed on)
DOELSEIF
([?22:30-05:00] and [PartyTime:state] eq "off" and [TVTime:state] eq "off")
(set WZEZ_WZFLed on-for-timer 900) (set WZBodenLed off)
DOELSEIF
([22:30-05:00] and [?TVTime:state] eq "off" and [?PartyTime:state] eq "off" and ([?WZEZ_WZFLed] eq "on" or [?WZEZ_WZBodenLed] eq "on"))
(set WZEZ_WZFLed off) (set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "on" or [LichtSensor:brightness] > 20.0)
(set WZBodenLed off) (set WZEZ_WZFLed off)

   FUUID      5c4afdc5-f33f-84b4-c97a-b1cab802f56248da
   MODEL      FHEM
   NAME       DOIFWzEzBeleuchtung
   NOTIFYDEV  TVTime,PartyTime,global,LichtSensor
   NR         46
   NTFY_ORDER 50-DOIFWzEzBeleuchtung
   STATE      cmd_3
   TYPE       DOIF
   VERSION    23640 2021-01-30 10:49:48
   READINGS:
     2021-02-06 22:37:32   Device          TVTime
     2021-02-06 22:32:32   cmd             3.2
     2021-02-06 22:32:32   cmd_event       TVTime
     2021-02-06 22:32:32   cmd_nr          3
     2021-02-06 22:32:32   cmd_seqnr       2
     2021-02-06 22:31:12   e_LichtSensor_brightness 0.04
     2020-12-13 18:52:16   e_PartyTime_state off
     2021-02-06 22:37:32   e_TVTime_state  off
     2020-12-08 11:41:38   mode            enabled
     2021-02-06 22:32:32   state           cmd_3
     2021-02-06 22:30:00   timer_01_c01    07.02.2021 15:00:00
     2021-02-06 22:30:00   timer_02_c01    07.02.2021 22:30:00
     2021-02-06 16:08:53   timer_03_c03    06.02.2021 22:30:00
     2021-02-06 16:08:53   timer_04_c03    07.02.2021 05:00:00
     2021-02-06 16:08:53   timer_05_c04    06.02.2021 22:30:00
     2021-02-06 16:08:53   timer_06_c04    07.02.2021 05:00:00
   Regex:
     accu:
     cond:
       LichtSensor:
         0:
           brightness ^LichtSensor$:^brightness:
         1:
         2:
         3:
         4:
           brightness ^LichtSensor$:^brightness:
       PartyTime:
         1:
           state      ^PartyTime$:^state:
         2:
           state      ^PartyTime$:^state:
       TVTime:
         0:
           state      ^TVTime$:^state:
         1:
         2:
           state      ^TVTime$:^state:
         3:
         4:
           state      ^TVTime$:^state:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::ReadingValDoIf($hash,'LichtSensor','brightness') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "off"
     1          ::ReadingValDoIf($hash,'PartyTime','state') eq "on" and ::ReadingValDoIf($hash,'LichtSensor','brightness') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "off"
     2          ::DOIF_time($hash,2,3,$wday,$hms) and ::ReadingValDoIf($hash,'PartyTime','state') eq "off" and ::ReadingValDoIf($hash,'TVTime','state') eq "off"
     3          ::DOIF_time($hash,4,5,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::ReadingValDoIf($hash,'PartyTime','state') eq "off" and (::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "on" or ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "on")
     4          ::ReadingValDoIf($hash,'TVTime','state') eq "on" or ::ReadingValDoIf($hash,'LichtSensor','brightness') > 20.0
   days:
   do:
     0:
       0          set WZEZ_WZFLed on
     1:
       0          set WZBodenLed on
     2:
       0          set WZEZ_WZFLed on-for-timer 900
       1          set WZBodenLed off
     3:
       0          set WZEZ_WZFLed off
       1          set WZBodenLed off
     4:
       0          set WZBodenLed off
       1          set WZEZ_WZFLed off
     5:
   helper:
     DEVFILTER  ^global$|^PartyTime$|^TVTime$|^LichtSensor$
     NOTIFYDEV  global|PartyTime|TVTime|LichtSensor
     event      off
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev   TVTime
     timerevent off
     triggerDev TVTime
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   internals:
     all         WZEZ_WZFLed:STATE WZEZ_WZBodenLed:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   intervaltimer:
   localtime:
     0          1612706400
     1          1612733400
     2          1612647000
     3          1612670400
     4          1612647000
     5          1612670400
   perlblock:
   readings:
     all         TVTime:state LichtSensor:brightness PartyTime:state
   realtime:
     0          15:00:00
     1          22:30:00
     2          22:30:00
     3          05:00:00
     4          22:30:00
     5          05:00:00
   time:
     0          15:00:00
     1          22:30:00
     2          22:30:00
     3          05:00:00
     4          22:30:00
     5          05:00:00
   timeCond:
     0          0
     1          0
     2          2
     3          2
     4          3
     5          3
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     3           4  5
   trigger:
   triggertime:
     1612670400:
       localtime  1612670400
       hash:
     1612706400:
       localtime  1612706400
       hash:
     1612733400:
       localtime  1612733400
       hash:
   uiState:
   uiTable:
Attributes:
   room       DOIF

misux

Niemand eine Idee? Das DOIF schint richtig zu sein, oder? Oder habe ich was übersehen...?

laberlaib

Zitat von: misux am 06 Februar 2021, 22:48:43
Aber warum wurde um 22.32 die Sequenz 3 durchgeführt obwohl alles so zutraf wie es sein sollte? (set WZEZ_WZFLed on-for-timer 900)???
Er sollte doch nur auf [PartyTime:state] eq "off" and [TVTime:state] eq "off" triggern dabei waren diese Werte schon längst off... Verstehe ich nicht.

Das stimmt nicht.
Du lässt auf den Status prüfen, nicht auf Events.
Gibt es ein Event von irgendeinem abhängigen Device, dann schaut das DOIF alles mal durch. PartyTime war auf dem status "off", TVTime auch, also wird der Zweig ausgeführt.
Willst Du auf Events prüfen, dann commandref => DOIF => Eventsteuerutn:
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

misux

Ouha... OKay... das ist mir so noch komischerweise nie aufgefallen...

Vielen Dank! Werde es dann mal anpassen.


misux

Ich raff es nicht...

Kann mir jemand helfen und sagen warum nun um 22.57 die 3. Sequenz NICHT ausgeführt wird wenn TVTime "off" geht?
Im ersten Post hat es funktioniert, aber nicht richtig, nun habe ich das DOIF angepasst und in dem TVTime Dummy    event-on-change-reading .*
   event-on-update-reading .* gesetzt... aber irgendwie will es nicht...

Hat jemand eine Idee warum das nicht funktioniert? Das DOIF erkennt jedenfalls das TVTime "Off" geht, aber es interessiert ihn nicht, er schaltet mir das Licht nicht an wie er es in der Sequenz 3 tun sollte...

Im Screenshot sieht man das Reading vom DOIF das es den Zustand um 22.57 von TVTime erkannt hat. PartyTime war schon "Off".

List DOIF
Internals:
   DEF        ([?15:00-22:30] and [TVTime:state] eq "off" and [LichtSensor] < 20.0 and [?WZEZ_WZFLed] eq "off")
(set WZEZ_WZFLed on)
DOELSEIF
([PartyTime:state] eq "on" and [?LichtSensor] < 20.0 and [?WZEZ_WZBodenLed] eq "off")
(set WZBodenLed on)
DOELSEIF
([?22:30-05:00] and [PartyTime:"off"] and [TVTime:"off"])
(set WZEZ_WZFLed on-for-timer 900) (set WZBodenLed off)
DOELSEIF
([22:30-05:00] and [?TVTime:state] eq "off" and [?PartyTime:state] eq "off" and ([?WZEZ_WZFLed] eq "on" or [?WZEZ_WZBodenLed] eq "on"))
(set WZEZ_WZFLed off) (set WZBodenLed off)
DOELSEIF
([TVTime:"on"] or [LichtSensor] > 20.0)
(set WZBodenLed off) (set WZEZ_WZFLed off)

   FUUID      603a67dc-f33f-e7ed-0a6a-f5c4652c84a60b43
   MODEL      FHEM
   NAME       DOIFWzEzBeleuchtung
   NOTIFYDEV  PartyTime,global,TVTime,LichtSensor
   NR         128
   NTFY_ORDER 50-DOIFWzEzBeleuchtung
   STATE      cmd_5
   TYPE       DOIF
   VERSION    23640 2021-01-30 10:49:48
   READINGS:
     2021-04-17 22:59:48   Device          LichtSensor
     2021-04-17 20:48:28   cmd             5.2
     2021-04-17 20:48:28   cmd_event       TVTime
     2021-04-17 20:48:28   cmd_nr          5
     2021-04-17 20:48:28   cmd_seqnr       2
     2021-04-17 22:59:48   e_LichtSensor_STATE 0.1
     2021-04-17 22:57:33   e_TVTime_events off
     2021-04-17 22:57:33   e_TVTime_state  off
     2021-04-10 22:57:38   mode            enabled
     2021-04-17 20:48:28   state           cmd_5
     2021-04-17 22:30:00   timer_01_c01    18.04.2021 15:00:00
     2021-04-17 22:30:00   timer_02_c01    18.04.2021 22:30:00
     2021-04-17 05:00:00   timer_03_c03    17.04.2021 22:30:00
     2021-04-17 05:00:00   timer_04_c03    18.04.2021 05:00:00
     2021-04-17 05:00:00   timer_05_c04    17.04.2021 22:30:00
     2021-04-17 05:00:00   timer_06_c04    18.04.2021 05:00:00
   Regex:
     accu:
     cond:
       LichtSensor:
         0:
           &STATE     ^LichtSensor$
         1:
         2:
         3:
         4:
           &STATE     ^LichtSensor$
       PartyTime:
         1:
           state      ^PartyTime$:^state:
         2:
           &STATE     ^PartyTime$
       TVTime:
         0:
           state      ^TVTime$:^state:
         1:
         2:
           &STATE     ^TVTime$
         3:
         4:
           &STATE     ^TVTime$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::InternalDoIf($hash,'LichtSensor','STATE') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "off"
     1          ::ReadingValDoIf($hash,'PartyTime','state') eq "on" and ::InternalDoIf($hash,'LichtSensor','STATE') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "off"
     2          ::DOIF_time($hash,2,3,$wday,$hms) and ::EventDoIf('PartyTime',$hash,'off',1) and ::EventDoIf('TVTime',$hash,'off',1)
     3          ::DOIF_time($hash,4,5,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::ReadingValDoIf($hash,'PartyTime','state') eq "off" and (::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "on" or ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "on")
     4          ::EventDoIf('TVTime',$hash,'on',1) or ::InternalDoIf($hash,'LichtSensor','STATE') > 20.0
   days:
   do:
     0:
       0          set WZEZ_WZFLed on
     1:
       0          set WZBodenLed on
     2:
       0          set WZEZ_WZFLed on-for-timer 900
       1          set WZBodenLed off
     3:
       0          set WZEZ_WZFLed off
       1          set WZBodenLed off
     4:
       0          set WZBodenLed off
       1          set WZEZ_WZFLed off
     5:
   helper:
     DEVFILTER  ^global$|^PartyTime$|^TVTime$|^LichtSensor$
     NOTIFYDEV  global|PartyTime|TVTime|LichtSensor
     event      CURRENT_ILLUMINATION: 0.1,AVERAGE_ILLUMINATION_STATUS: NORMAL,CURRENT_ILLUMINATION_STATUS: NORMAL,LOWEST_ILLUMINATION: 0.1,AVERAGE_ILLUMINATION: 0.1,HIGHEST_ILLUMINATION: 0.1,HIGHEST_ILLUMINATION_STATUS: NORMAL,LOWEST_ILLUMINATION_STATUS: NORMAL,activity: alive,devstate: ok,rssipeer: 0,rssidevice: -54,battery: ok
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev   TVTime
     timerevent on
     triggerDev LichtSensor
     timerevents:
       on
     timereventsState:
       state: on
     triggerEvents:
       CURRENT_ILLUMINATION: 0.1
       AVERAGE_ILLUMINATION_STATUS: NORMAL
       CURRENT_ILLUMINATION_STATUS: NORMAL
       LOWEST_ILLUMINATION: 0.1
       AVERAGE_ILLUMINATION: 0.1
       HIGHEST_ILLUMINATION: 0.1
       HIGHEST_ILLUMINATION_STATUS: NORMAL
       LOWEST_ILLUMINATION_STATUS: NORMAL
       activity: alive
       devstate: ok
       rssipeer: 0
       rssidevice: -54
       battery: ok
     triggerEventsState:
       CURRENT_ILLUMINATION: 0.1
       AVERAGE_ILLUMINATION_STATUS: NORMAL
       CURRENT_ILLUMINATION_STATUS: NORMAL
       LOWEST_ILLUMINATION: 0.1
       AVERAGE_ILLUMINATION: 0.1
       HIGHEST_ILLUMINATION: 0.1
       HIGHEST_ILLUMINATION_STATUS: NORMAL
       LOWEST_ILLUMINATION_STATUS: NORMAL
       activity: alive
       devstate: ok
       rssipeer: 0
       rssidevice: -54
       battery: ok
   internals:
     all         LichtSensor:STATE WZEZ_WZFLed:STATE WZEZ_WZBodenLed:STATE
   interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   intervalfunc:
   intervaltimer:
   localtime:
     0          1618750800
     1          1618777800
     2          1618691400
     3          1618714800
     4          1618691400
     5          1618714800
   perlblock:
   readings:
     all         TVTime:state PartyTime:state
   realtime:
     0          15:00:00
     1          22:30:00
     2          22:30:00
     3          05:00:00
     4          22:30:00
     5          05:00:00
   time:
     0          15:00:00
     1          22:30:00
     2          22:30:00
     3          05:00:00
     4          22:30:00
     5          05:00:00
   timeCond:
     0          0
     1          0
     2          2
     3          2
     4          3
     5          3
   timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   timers:
     3           4  5
   trigger:
     all         PartyTime TVTime
   triggertime:
     1618714800:
       localtime  1618714800
       hash:
     1618750800:
       localtime  1618750800
       hash:
     1618777800:
       localtime  1618777800
       hash:
   uiState:
   uiTable:
Attributes:
   room       DOIF


List TVTime
Internals:
   FUUID      60159b77-f33f-e7ed-6e34-dcc6f0c86daa832a
   NAME       TVTime
   NR         47
   STATE      off
   TYPE       dummy
   READINGS:
     2021-04-17 23:02:33   state           off
Attributes:
   alexaName  Tv Time
   devStateIcon on:general_an@green off:general_aus@grey
   event-on-change-reading .*
   event-on-update-reading .*
   gassistantName TVTime
   genericDeviceType switch
   room       Dummy,GoogleAssistant
   setList    on off
   webCmd     on:off

laberlaib

Schnell per Handy :

Du verbindest zwei events mit and.
Das kann nie wahr werden.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

Sany


ZitatKann mir jemand helfen und sagen warum nun um 22.57 die 3. Sequenz NICHT ausgeführt wird wenn TVTime "off" geht?

steht in der cref:
ZitatEreignissteuerung über Auswertung von Events 


..... Die logische Verknüpfung "and" mehrerer Ereignisse ist nicht sinnvoll, da zu einem Zeitpunkt immer nur ein Ereignis zutreffen kann.

deine 3. Sequenz:
Zitat([?22:30-05:00] and [PartyTime:"off"] and [TVTime:"off"])

Ein Event-Trigger im DOIF läßt einen Ausdruck wie [TVTime:"off"] nur für den Moment, in dem das Ereignis auftritt, wahr werden. Mehr ist das nicht.1) Das eignet sich hervorragend um DOIF-Zweige auszulösen. Sollen noch andere Bedingungen mit geprüft werden muss man mit == oder eq arbeiten, oder Zeiträume. Wenn diese nicht triggernd wirken sollen dann am besten mit [?....] als nicht-triggernd einbauen. Ist aber ein Event-trigger mit dabei spielt es keine Rolle (denn der ist ja immer "false", ausser er tritt ein).
Ein Ausdruck wie [TVTime:state] eq "off" funktioniert dagegen so: das Device "TVTime" meldet irgendeinen Event. Das DOIF erkennt das und schaut dann nach, ob es damit was anfangen kann: ist im Device TVTime der state "off", obwohl zum Beispiel das Reading blalba von TVTime irgendwas gemeldet hat, so wird die Abfrage dennoch wahr und, wenn die restlichen Bedingungen zutreffen, wird der Zweig ausgelöst. Du musst Dir also genau im Klaren sein, welches Device wie einen auslösenden Trigger liefern soll (den dann als Event-trigger einbauen) und welche Bedingungen zusätzlich abgefragt werden sollen. Je mehr, desto komplexer.


event-on-change-reading sowie event-on-update-reading dienen dazu, einem Device die Events abzugewöhnen, sollte es viele davon senden. Sie dienen nicht dazu, irgendwelche Events zu erzeugen. Bei einem Dummy werden eher keine überzähligen Events erzeugt, so dass Du das hier auch weglassen könntest. Beide mit ".*" dahinter anzugeben ist gleichbedeutend mit die Attribute wegzulassen.

Jetzt nochmal genau überlegen, wer, wann was triggern soll und dann die Bedingungen entsprechend schreiben. Eine große Hilfe ist hier der Eventmonitor. Am triggernden Device Events auslösen, im Eventmonitor analysieren, wie die aussehen, die entsprechende Zeile vollständig markieren und oben rechts auf "create/modify.." klicken. Dort DOIF auswähen und den Trigger kopieren.

Viel Erfolg!



1) Es gibt auch Event-trigger, die Werte liefern und verglichen werden können. Nur der Vollständigkeit halber.

Auch interessant: https://forum.fhem.de/index.php/topic,115785.msg1100628.html#msg1100628
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....