FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: heiko.ne am 12 Juni 2021, 12:47:25

Titel: DOIF: Triggert trotz Verwendung von [?...] bei Abfrage
Beitrag von: heiko.ne am 12 Juni 2021, 12:47:25
Hallo zusammen,

ich habe ein Problem, zu dem ich glaubte, in der Commandref auch die entsprechende Lösungen mit Beispiel gefunden zu habe, aber so recht klappt es nicht.
Es geht um das Nicht-Triggern eines DOIF bei Abfragen, die nur zusätzlich erfolgen sollen, wie es hier beschrieben wird:

https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger (https://fhem.de/commandref_DE.html#DOIF_Zeitintervalle_Readings_und_Status_ohne_Trigger)

Mein Listung des DOIF sieht zusammengefasst so aus:


Internals:
   DEF        (([MQTT2_shellyswitch25_BA72BE_CH1:state] eq 'on' and [MQTT2_shellyswitch25_BA72BE_CH1:relay_0_power] >= 10) and ([Heiko_Anwesenheit] == 1 or [Silke_Anwesenheit] == 1)) (set SignalBot send "Hinweis: Pumpe läuft, aber es scheint auch jemand Zuhause zu sein.")
DOELSEIF (([MQTT2_shellyswitch25_BA72BE_CH1:state] eq 'on' and [MQTT2_shellyswitch25_BA72BE_CH1:relay_0_power] >= 10) and ([Heiko_Anwesenheit] == 0 and [Silke_Anwesenheit] == 0)) (set SignalBot send "Achtung: Pumpe läuft, aber niemand scheint Zuhause zu sein!")
DOELSEIF ([MQTT2_shellyswitch25_BA72BE_CH1:state] eq 'off' and [?Heiko_Anwesenheit] == 0 and [?Silke_Anwesenheit] == 0) (set SignalBot send "Hinweis: Pumpe anscheinend wieder ausgeschaltet.")
   FUUID      xxx
   MODEL      FHEM
   NAME       Pumpe_Push
   NOTIFYDEV  MQTT2_shellyswitch25_BA72BE_CH1,Heiko_Anwesenheit,global,Silke_Anwesenheit
   NR         356
   NTFY_ORDER 50-Pumpe_Push
   STATE      cmd_3
   TYPE       DOIF
   VERSION    24595 2021-06-06 17:52:38
   READINGS:
     2021-06-12 12:32:08   Device          MQTT2_shellyswitch25_BA72BE_CH1
     2021-06-12 12:32:08   cmd             3
     2021-06-12 12:32:08   cmd_event       MQTT2_shellyswitch25_BA72BE_CH1
     2021-06-12 12:32:08   cmd_nr          3
     2021-06-12 12:12:51   e_Heiko_Anwesenheit_STATE 0
     2021-06-12 12:32:08   e_MQTT2_shellyswitch25_BA72BE_CH1_relay_0_power 0.00
     2021-06-12 12:32:08   e_MQTT2_shellyswitch25_BA72BE_CH1_state off
     2021-06-12 12:31:45   mode            enabled
     2021-06-12 12:32:08   state           cmd_3
   Regex:
     accu:
     collect:
     cond:
       Heiko_Anwesenheit:
         0:
           &STATE     ^Heiko_Anwesenheit$
         1:
           &STATE     ^Heiko_Anwesenheit$
         2:
       MQTT2_shellyswitch25_BA72BE_CH1:
         0:
           relay_0_power ^MQTT2_shellyswitch25_BA72BE_CH1$:^relay_0_power:
           state      ^MQTT2_shellyswitch25_BA72BE_CH1$:^state:
         1:
           relay_0_power ^MQTT2_shellyswitch25_BA72BE_CH1$:^relay_0_power:
           state      ^MQTT2_shellyswitch25_BA72BE_CH1$:^state:
         2:
           state      ^MQTT2_shellyswitch25_BA72BE_CH1$:^state:
       Silke_Anwesenheit:
         0:
           &STATE     ^Silke_Anwesenheit$
         1:
           &STATE     ^Silke_Anwesenheit$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_BA72BE_CH1','state') eq 'on' and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_BA72BE_CH1','relay_0_power') >= 10) and (::InternalDoIf($hash,'Heiko_Anwesenheit','STATE') == 1 or ::InternalDoIf($hash,'Silke_Anwesenheit','STATE') == 1)
     1          (::ReadingValDoIf($hash,'MQTT2_shellyswitch25_BA72BE_CH1','state') eq 'on' and ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_BA72BE_CH1','relay_0_power') >= 10) and (::InternalDoIf($hash,'Heiko_Anwesenheit','STATE') == 0 and ::InternalDoIf($hash,'Silke_Anwesenheit','STATE') == 0)
     2          ::ReadingValDoIf($hash,'MQTT2_shellyswitch25_BA72BE_CH1','state') eq 'off' and ::InternalDoIf($hash,'Heiko_Anwesenheit','STATE') == 0 and ::InternalDoIf($hash,'Silke_Anwesenheit','STATE') == 0
   do:
     0:
       0          set SignalBot send "Hinweis: Pumpe läuft, aber es scheint auch jemand Zuhause zu sein."
     1:
       0          set SignalBot send "Achtung: Pumpe läuft, aber niemand scheint Zuhause zu sein!"
     2:
       0          set SignalBot send "Hinweis: Pumpe anscheinend wieder ausgeschaltet."
     3:
   helper:
     DEVFILTER  ^global$|^Silke_Anwesenheit$|^MQTT2_shellyswitch25_BA72BE_CH1$|^Heiko_Anwesenheit$
     NOTIFYDEV  global|Silke_Anwesenheit|MQTT2_shellyswitch25_BA72BE_CH1|Heiko_Anwesenheit
     event      relay_0_power: 0.00
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   MQTT2_shellyswitch25_BA72BE_CH1
     timerevent off,relay0: off
     triggerDev MQTT2_shellyswitch25_BA72BE_CH1
     timerevents:
       off
       relay0: off
     timereventsState:
       state: off
       relay0: off
     triggerEvents:
       relay_0_power: 0.00
     triggerEventsState:
       relay_0_power: 0.00
   internals:
     all         Heiko_Anwesenheit:STATE Silke_Anwesenheit:STATE
   perlblock:
   readings:
     all         MQTT2_shellyswitch25_BA72BE_CH1:state MQTT2_shellyswitch25_BA72BE_CH1:relay_0_power
   trigger:
   uiState:
   uiTable:
Attributes:
   group      Signal
   room       IT


Es geht um das letzte DOELSEIF, das eigentlich nur auslösen soll, wenn die Bedingung [MQTT2_shellyswitch25_BA72BE_CH1:state] eq 'off' schaltet.
Aber merkwürdigerweise wird nicht nur dann getriggert, sondern auch, wenn die Statusabfragen [?Heiko_Anwesenheit] == 0 oder [?Silke_Anwesenheit] == 0 sich verändern.


Ich scheine irgendwas zu übersehen ...  :o.

Kann mir jemand den entscheidenden Hinweis geben?

Gruß und Dank
Heiko
Titel: Antw:DOIF: Triggert trotz Verwendung von [?...] bei Abfrage
Beitrag von: rabehd am 12 Juni 2021, 13:33:58
Ein DOIF muss immer einen Zustand haben. Also "sucht" sich bei jedem Trigger z.B. [Heiko_Anwesenheit] und [Silke_Anwesenheit] einen Zweig und da bleibt wohl nur der "ungewünschte".
Häng doch mal ein DOELSE () an (ohne etwas im Ausführungsteil).
Titel: Antw:DOIF: Triggert trotz Verwendung von [?...] bei Abfrage
Beitrag von: MadMax-FHEM am 12 Juni 2021, 13:45:32
Zitat von: rabehd am 12 Juni 2021, 13:33:58
Ein DOIF muss immer einen Zustand haben. Also "sucht" sich bei jedem Trigger z.B. [Heiko_Anwesenheit] und [Silke_Anwesenheit] einen Zweig und da bleibt wohl nur der "ungewünschte".
Häng doch mal ein DOELSE () an (ohne etwas im Ausführungsteil).

Wenn aber der DOELSIF schon passt, dann wird doch ein DOELSE gar nicht mehr beachtet ;)

Ich denke ja (nutze aber kein DOIF): sobald eben z.B. in irgendeinem Zweig [Heiko_Anwesenheit] "triggernd" benutzt wird, wird eben das GANZE DOIF "durchgearbeitet" und ergo passt dann halt der Zweig der zwar nur abfragen soll (was er auch tut), so wie rabehd auch schon angemerkt hat.
Aber da das DOIF "an sich" schon getriggert wurde landest du halt "trotzdem" dort.

Soll heißen: ich denke, dass eben das GESAMTE DOIF Device getriggert wird und NICHT "zweigspezifisch"...

Gruß, Joachim
Titel: Antw:DOIF: Triggert trotz Verwendung von [?...] bei Abfrage
Beitrag von: Ralli am 12 Juni 2021, 13:53:07
Zitat
Mit diesem Modul ist es möglich, einfache wie auch komplexere Automatisierungsvorgänge zu definieren oder in Perl zu programmieren. Ereignisse, Zeittrigger, Readings oder Status werden durch DOIF-spezifische Angaben in eckigen Klammern angegeben. Sie führen zur Triggerung des Moduls und damit zur Auswertung und Ausführung der definierten Anweisungen.

Du hast [Heiko_Anwesenheit] und [Silke_Anwesenheit] in den ersten Zweigen als Trigger drin, damit wird das DOIF aktiv.

Du solltest diesen Weg wählen:

Zitat
Ereignissteuerung über Auswertung von Events 

Eine Alternative zur Auswertung von Status oder Readings ist das Auswerten von Ereignissen (Events) mit Hilfe von regulären Ausdrücken. Der Suchstring wird als regulärer Ausdruck in Anführungszeichen angegeben. Die Syntax lautet: [<devicename>:"<regex>"]

Anwendungsbeispiel: wie oben, jedoch wird hier nur das Ereignis (welches im Eventmonitor erscheint) ausgewertet und nicht der Status von "remotecontrol" wie im vorherigen Beispiel

define di_garage DOIF ([remotecontrol:"on"]) (set garage on) DOELSEIF ([remotecontrol:"off"]) (set garage off)
Titel: Antw:DOIF: Triggert trotz Verwendung von [?...] bei Abfrage
Beitrag von: Frank_Huber am 12 Juni 2021, 13:56:16
Du frägst den Zustand der Pumpe ab, nicht das Ereignis "off"

CMD_3 wurde vom MQTT device ausgelöst.

Ein "event-on-change-reading" im MQTT device sollte helfen.
Oder von Zustand auf Event umbauen.
Titel: Antw:DOIF: Triggert trotz Verwendung von [?...] bei Abfrage
Beitrag von: heiko.ne am 12 Juni 2021, 14:23:24
Danke für die Hinweise und Erklärungen!
Ich glaube, ich hab's jetzt: 1. Auf Event umgebaut [MQTT2_shellyswitch25_BA72BE_CH1:"off"] und 2. event-on-change-reading im MQTT-Device hinzugefügt.

Gerade mal getestet und es scheint zu laufen, wie gewollt.
Daher schließe ich den Beitrag mal.

Gruß
Heiko