obwohl die erste Bedingung unverändert gültig ist, werden DOELSEIFs ausgewertet

Begonnen von fron, 02 Oktober 2025, 23:58:35

Vorheriges Thema - Nächstes Thema

fron

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?
Cubietruck
2x CUL: CUL-868 (MAX, MAX-Basic, Wandtermostat, ECO-Taster, Türkontakt) ; CUL-433 (4x SomfyRTS Rolladenmotor)
2x Jeelink (div Lacrosse/Technoline TX29DTH) ; (div PCA301)
HMUSB (KFM100 Füllstandssensor, HM-LC-BL1-FM)

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

fron

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.)
Cubietruck
2x CUL: CUL-868 (MAX, MAX-Basic, Wandtermostat, ECO-Taster, Türkontakt) ; CUL-433 (4x SomfyRTS Rolladenmotor)
2x Jeelink (div Lacrosse/Technoline TX29DTH) ; (div PCA301)
HMUSB (KFM100 Füllstandssensor, HM-LC-BL1-FM)