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