DOIF wait_timer wird ungewollt zurückgesetzt

Begonnen von billiloumez, 19 März 2021, 15:23:00

Vorheriges Thema - Nächstes Thema

billiloumez

Hallo zusammen,

ich habe eigentlich eine ganz triviale Anforderung, aber stoße nun bei der Umsetzung auf Probleme. Mir ist das hier im Winter öfters mal passiert, dass ich z.B. im Schlafzimmer in der früh das Fenster zum Lüften aufgemacht habe und es dann über Stunden vergessen habe zu schließen, mit dem Effekt, dass der Raum komplett ausgekühlt war. Jetzt hab ich meine HomeMatic Fensterkontakte wieder aus der Schublade gekramt und wollte ganz einfach umsetzen "Wenn das Fenster 1 Stunde lang geöffnet bleibt und die Außentemperatur unter 15 Grad ist, verschick eine Email an mich"

Mit DOIF sieht das bei mir nun so aus:
define di_SchlafzimmerFenster DOIF ([HM_4E1E54:"open|tilted"] and [Wetter:temperature] < 15) ({DebianMail("bla\@bla.de","FHEM Fensterwarnung Schlafzimmer")})
attr di_SchlafzimmerFenster wait 3600


Wobei sich "Wetter" auf das weather Modul bezieht.

Nun hab ich das erst mal mit 30 Sekunden wait ausprobiert und alles lief super, bei 3600 Sekunden (aka 1 Stunde) wurde aber nie eine Email verschickt. Nun hab ich gemerkt, dass der wait_timer auf "no timer" zurückgesetzt wird, sobald das weather Modul das nächste mal einen Event generiert. Die Temperatur ist in dem Fall aber immer noch unter 15 Grad. Ich will ja nur, dass der wait_timer zurückgesetzt wird, wenn der Fensterkontakt wieder auf "closed" geht. Oder von mir aus auch, wenn die Temperatur über 15 Grad steigt innerhalb der Stunde. Aber es reicht schon einzig der Event aus, um den wait_timer zurückzusetzen. Wie kann ich das denn verhindern?

Danke und Gruß


holle75

#1

define di_SchlafzimmerFenster DOIF ([Wetter:temperature] < 15 and [HM_4E1E54] eq "open" or [HM_4E1E54] eq "tilted") ({DebianMail("bla\@bla.de","FHEM Fensterwarnung Schlafzimmer")})
DOELSEIF ([Wetter:temperature] >= 15 or  [HM_4E1E54] eq "closed") ()
attr di_SchlafzimmerFenster wait 3600:0


... so mal ins Blaue. Aber da gibts Menschen, die sich besser auskennen. Das "closed" vermute ich ... sonst ein

DOELSEIF ([Wetter:temperature] >= 15 or ([HM_4E1E54] ne "open" and [HM_4E1E54] ne "tilted"))

PS: da gibts auch, gerade was Fenster angeht, fulminante Beispiele in der commandref wo der Meister himself Hand an die Fenstergriffe gelegt hat.

billiloumez

Danke für den Input, ich habs jetzt mal dahingehend angepasst und jetzt funktioniert es tatsächlich wie gewünscht:
define di_SchlafzimmerFenster DOIF ([HM_4E1E54:"open|tilted"] and [Wetter:temperature] < 15) ({DebianMail("bla\@bla.de","FHEM Fensterwarnung Schlafzimmer")})\
DOELSEIF ([Wetter:temperature] >= 15 or [HM_4E1E54:"closed"]) ()
attr di_SchlafzimmerFenster wait 3600:0


Mir ist nur von der Logik her nicht ganz klar, wieso das DOELSEIF hier den Unterschied macht, aber sei's drum, Hauptsache es läuft ;)

holle75

#3
Du prüfst auf events von HM_4E1E54 und nicht auf den state. Ich könnte mir vorstellen, dass dann der Teil vom Zweig wenn Wetter die Temperatur liefert nicht wahr ist -> wait timer wird zurückgesetzt ... und wenn das nächste mal HM_4E1E54 einen event erzeugt (und  temperature unter 15 ist) läuft das Spiel von vorne los.

Das DOELSEIF hält das DOIF in cmd_2 für die Länge des timers und wahrscheinlich funktioniert es deswegen.

so könnte es evtl auch funktionieren
define di_SchlafzimmerFenster DOIF ([Wetter:temperature] < 15 and [HM_4E1E54] eq "open" or [HM_4E1E54] eq "tilted") ({DebianMail("bla\@bla.de","FHEM Fensterwarnung Schlafzimmer")})
attr di_SchlafzimmerFenster do always
attr di_SchlafzimmerFenster wait 3600


Und damit nicht jede Stunde die Mail kommt sonder nur x mal gibts noch das attr repeatsame.
Oder, damit die Mail nur einmal kommt, das do always weg.

Aber ich bin nicht so der DOIF Chef. Beiß mir auch regelmäßig an der Logik die Zähne aus.