DOIF: Triggert trotz Verwendung von [?...] bei Abfrage

Begonnen von heiko.ne, 12 Juni 2021, 12:47:25

Vorheriges Thema - Nächstes Thema

heiko.ne

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

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

rabehd

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).
Auch funktionierende Lösungen kann man hinterfragen.

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Ralli

#3
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)
Gruß,
Ralli

Proxmox 8.2 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.75.7.20240420) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.57), FBDECT, Siri und Alexa

Frank_Huber

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.

heiko.ne

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