[gelöst] Offenbar Verständnisproblem: Mein DOIF tut nicht, wie ich will

Begonnen von Manul, 21 Juli 2017, 11:24:58

Vorheriges Thema - Nächstes Thema

Manul

Ich habe folgendes DOIF:

defmod di_EntfeuchterAnAus DOIF ([kg_li_sco_kellerfenster] eq "open")\
\
  (set kg_li_steckdose_entfeuchter_Sw off)\
\
DOELSEIF ([klima_keller:humidity] < 56)\
\
  (set kg_li_steckdose_entfeuchter_Sw off)\
\
DOELSEIF ([klima_keller:humidity] > 56)\
\
  (set kg_li_steckdose_entfeuchter_Sw on)\
\
DOELSE
attr di_EntfeuchterAnAus initialize initialized
attr di_EntfeuchterAnAus room Automatisierung

setstate di_EntfeuchterAnAus cmd_4
setstate di_EntfeuchterAnAus 2017-07-21 11:18:56 Device klima_keller
setstate di_EntfeuchterAnAus 2017-07-21 11:11:14 cmd 4
setstate di_EntfeuchterAnAus 2017-07-21 11:11:14 cmd_event klima_keller
setstate di_EntfeuchterAnAus 2017-07-21 11:11:14 cmd_nr 4
setstate di_EntfeuchterAnAus 2017-07-21 11:07:34 e_kg_li_sco_kellerfenster_STATE closed
setstate di_EntfeuchterAnAus 2017-07-21 11:18:56 e_klima_keller_humidity 56
setstate di_EntfeuchterAnAus 2017-07-21 11:11:14 state cmd_4


Das soll den Entfeuchter im Keller ausschalten, wenn das Fenster offen ist, und ihn ansonsten so ein- und ausschalten, daß die relative Feuchte nahe 56% bleibt.

Gestern abend habe ich das Fenster geöffnet, während der Entfeuchter lief. Dieser ging daraufhin sofort aus. So weit, so gut.

Heute morgen komme ich in den Keller und der Entfeuchter läuft, das Fenster ist immer noch offen. Mir leuchtet nicht ein, wie es dazu kommen konnte. Irgendjemand eine Idee?

nils_

Irgendjemand eine Idee?
ja.
deine luftfeuchte ist über 56 gewesen!


du fragst in dem zweig den zustand des Fensters nicht ab.
viele Wege in FHEM es gibt!

darkness

Klar,

DOELSEIF ([klima_keller:humidity] > 56.

Da fehlt noch eine Bedingung, dass da Fenster nicht auf sein darf

Edit:

Zu langsam  :)

Manul

Okay, da habe ich offenbar tatsächlich ein Verständnisproblem: Ich dachte, das DOIF läuft in den DOELSEIF-Zweig nur, wenn die davorstehende Bedingung nicht erfüllt ist. Ist das nicht so?

nils_

viele Wege in FHEM es gibt!

Manul


nils_

https://forum.fhem.de/index.php/topic,72668.msg642935.html#msg642935

da hat das mal jemand erklärt.


einfach mal hier im subforum nach "do always" suchen, da gab es schon ne menge fragen zu.
viele Wege in FHEM es gibt!

Manul

Danke. Aus dem link ist  mir allerdings nicht ersichtlich, wie ein "do_always" in meinem Fall helfen sollte.

Ich versuche mal kurz zusammenzufassen, was ich glaube, verstanden zu haben.

- In dem Moment, in dem das Fenster geöffnet wird, ist Bedingung 1 wahr und der Entfeuchter wird abgeschaltet. DOIF ist im Zustand cmd_1
- Wenn dann die relative Feuchte über 56% steigt, wird Bedingung 1 nicht mehr geprüft, da sie das Device, das die Feuchte misst, nicht enthält. Bedingung 2 ist wahr, daher wechselt das DOIF in den Zustand cmd_2 und schaltet den Entfeuchter an, obwohl Bedingung 1 immer noch wahr ist.

Ist das so richtig, insbesondere der fette Teil?

Ein do_always würde doch Bedingung 1 trotzdem nur auswerten, wenn der Fensterkontakt ein Event triggert, oder habe ich das auch falsch verstanden?

Thyraz

DOIF triggert auf Events die in irgendeinem der Zweige drin sind (solange sie nicht mir "?" als nicht-triggernd markiert sind).
Es ist meines Wissens egal ob das auslösende Event in einem Zweig vorkommt oder nicht. Geprüft wird dennoch alles der Reihenfolge nach.
Es wird (ohne do always) nur der Zweig nicht überprüft, der gerade aktiv ist.

Willst du, dass ein Zweig nur bei einem bestimmten Event aktiv werden kann darfst du nicht auf Zustände abfragen, sondern musst direkt auf Events checken.

Wäre dann wahrscheinlich in der Art

([kg_li_sco_kellerfenster:"open"])

anstatt

([kg_li_sco_kellerfenster] eq "open")
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Ellert

Zitat von: Manul am 21 Juli 2017, 12:34:12
Danke. Aus dem link ist  mir allerdings nicht ersichtlich, wie ein "do_always" in meinem Fall helfen sollte.

Ich versuche mal kurz zusammenzufassen, was ich glaube, verstanden zu haben.

- In dem Moment, in dem das Fenster geöffnet wird, ist Bedingung 1 wahr und der Entfeuchter wird abgeschaltet. DOIF ist im Zustand cmd_1
- Wenn dann die relative Feuchte über 56% steigt, wird Bedingung 1 nicht mehr geprüft, da sie das Device, das die Feuchte misst, nicht enthält. Bedingung 2 ist wahr, daher wechselt das DOIF in den Zustand cmd_2 und schaltet den Entfeuchter an, obwohl Bedingung 1 immer noch wahr ist.

Ist das so richtig, insbesondere der fette Teil?

Ein do_always würde doch Bedingung 1 trotzdem nur auswerten, wenn der Fensterkontakt ein Event triggert, oder habe ich das auch falsch verstanden?

Beides Mal ja.

Du müsstest die Zweige gegeneinander verrigeln, z.B.

in die DOELSEIF Zweige

and $cmd != 1 einbauen, dann wird der Lüfter über die Feuchte nur geschaltet, wenn das Reading cmd  des DOIF ungleich 1 ist, also nur wenn das Fenster nicht offen ist.


Manul

Danke, dann habe ich's, denke ich, verstanden. Die Bezeichnung DOELSE[IF] finde ich dann allerdings etwas irreführend gewählt. Ich hätte nicht erwartet, daß das System in einen ELSE-Zweig laufen kann, solange die IF-Bedingung noch erfüllt ist.

Ellert

Zitat von: Manul am 21 Juli 2017, 13:43:24
Danke, dann habe ich's, denke ich, verstanden. Die Bezeichnung DOELSE[IF] finde ich dann allerdings etwas irreführend gewählt. Ich hätte nicht erwartet, daß das System in einen ELSE-Zweig laufen kann, solange die IF-Bedingung noch erfüllt ist.

Das ist in der Commandref aber so beschrieben - bereits in der Einleitung, da hättest Du nichts anderes erwarten müssen  ;)

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

Manul

Mag sein, aber das scheinen auch andere nicht mitbekommen zu haben:

Zitat von: Thyraz am 21 Juli 2017, 12:54:49
Es ist meines Wissens egal ob das auslösende Event in einem Zweig vorkommt oder nicht. Geprüft wird dennoch alles der Reihenfolge nach.

Damian

Zitat von: Manul am 21 Juli 2017, 15:01:05
Mag sein, aber das scheinen auch andere nicht mitbekommen zu haben:

Daher als erste Referenz die Commandref nehmen. Sätze, die mit "Meines Wissens nach..." anfangen, sind dann schon mal mit Vorsicht zu genießen ;)

Wer das Verhalten des DOIF-Modul ändern möchte, der kann gerne mit dem Attribut https://fhem.de/commandref_DE.html#DOIF_checkall experimentieren.

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

Manul

Cool, checkall macht's zumindest für mich intuitiver. Danke!

Thyraz

Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Per

Zitat von: nils_ am 21 Juli 2017, 12:14:24
da fehlt dann das "do always"
Netter Versuch ;)
Warum gibt es für zwei Zustände 3 DOIF Fälle? Dampf das auf zwei ein und der Fehler ist mit weg.
Allerdings auch der Lerneffekt ;D