ich habe folgendes DOIF mit 2x Bedingungen plus DOELSE:
( ([KG_WINDOW:pct]<75) ) ( set ... )
DOELSEIF ([THERM06:humidity_60s:inc10] < 0) ( set ...... )
DOELSE ( set ... )
Wenn das Fenster geschlossen wird, wird "pct" auf den Wert 0 gesetzt und "cmd_1" wird erreicht.
Wenn anschließend "THERM06:humidity" seinen Wert ändert, und inc10 >= 0 ist, dann ist die Bedingung für "cmd_2" ungültig und "cmd_3" wird erreicht.
Die DOIF-Hilfe
"
The commands are always processed from left to right. There is only one command executed, namely the first, for which the corresponding condition in the processed sequence is true. In addition, only the conditions are checked, which include a matching device of the trigger (in square brackets).
"
- insbesondere der Satz ab "in addition"...
Dh. "works as designed" - aber eigentlich falsch, da der Wortbestandteil "ELSE" der Syntax vom DOIF nicht berücksichtigt wird und es intern bearbeitet wird als
DOIF (bedingung1) (cmd1) DOIF (bedingung2) (cmd2) DOELSE
Man muss also die Readings der "hinteren" ELSEIFs mit "Overhead-Vergleichen", die immer erfüllt sind in die vorderen Conditions integrieren.
( ([KG_WINDOW:pct]<75) and ([THERM06:humidity_60s]>=0) ) ( set ... )
DOELSEIF ([THERM06:humidity_60s:inc10] < 0) ( set ...... )
DOELSE ( set ... )
Da sage jemand "and TRUE" könne in boolscher Arithmetik immer weggelassen werden :-)
Gibt es eine elegantere Lösung?
siehe: https://fhem.de/commandref_DE.html#DOIF_checkall
Ausdrücklich Herzlichen Dank für die schnelle und inhaltlich perfekte Hilfe!
...wäre die Anregung vermessen, bei allen neu definierten DOIFs automatisch das Attribut "checkall all" zu setzen, damit ein DOELSEIF auch ein DOELSEIF ist und nicht ein zum ersten DOIF gleichberechtigtes DOIF?
Und im Absatz
"... Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.
"
einen Hinweis ergänzen, dass es eine Möglichkeit gäbe, dieses Verhalten zu ändern - ist schließlich kein Feintuning wie "wait" etc sondern beeinflusst fundamental die Interpretation der Befehlssyntax.
(Ich wäre gerne bereit an der Dokumentation mitzuwirken.)
Das Modul existiert seit über zehn Jahren, da möchte ich nichts an der Grundfunktionalität ändern.
Dass sich das Modul so verhält, ist kein Zufall, sondern das Ergebnis meiner Erfahrung damit. Es handelt sich hier nicht um eine einfache Abarbeitung einer if-elsif Anweisung. Es ist vielmehr eine ereignisgesteuerte Abarbeitung von Befehlen. Die Argumentation ist ganz einfach: Warum sollte man einen Zweig prüfen, wenn es aus Sicht des Ereignisses dort keine Veränderung gibt? Das Wort "ELSE" bedeutet hier, dass zu einem Ereignis nur ein Zweig zu einer Ausführung kommen kann, alle anderen werden ausgeschlossen.
Ich habe bei keinem meiner unzähligen DOIF-Definitionen das checkall-Attribut gesetzt und auch nicht vermisst.
Es gibt allerdings eine einfache Lösung für deinen Wunsch. Benutze einfach DOIF im Perlmodus, hier verhält sich eine if-elsif-... Anweisung genauso, wie du es erwartest.