Hallo zusammen,
ich würde gerne eine Warnung ausgeben lassen, wenn die Fenster offen sind. Die Wartezeit würde ich gerne von der Temperatur abhängig machen, z.B. bei über 10°C nach 20 Minuten, bei unter 10°C nach 10, bei unter 0°C nach 5 Minuten. Gibt es dafür in DOIF eine elegante Lösung? Aktuell arbeite ich einfach mit dem Attribut wait mit einer fest eingestellten Zeit.
(
[$SELF:mybutton] eq "on" and
(([wc_Kontakt.Fenster] eq "open") or ([bd_Kontakt.Fenster] eq "open") or ([nik_Kontakt.Fenster] eq "open") or ([mar_Kontakt.Fenster] eq "open")) and
[WetterProplanta:temperature] < 10
) (
set MyTTS volume 10, set MyTTS tts "Temperaturwarnung, ein Fenster ist geöffnet"
)
DOELSE ()
attr gb_Warnung.Fenster disable 0
attr gb_Warnung.Fenster do always
attr gb_Warnung.Fenster group Alarme
attr gb_Warnung.Fenster icon message_attention
attr gb_Warnung.Fenster readingList mybutton
attr gb_Warnung.Fenster room 000_Global,26_WC,34_Bad
attr gb_Warnung.Fenster setList mybutton:on,off
attr gb_Warnung.Fenster wait 1200
attr gb_Warnung.Fenster webCmd mybutton
Man kann in wait eine Berechnung angeben:
http://fhem.de/commandref_DE.html#DOIF_wait
Statt direkt in wait zu rechnen, kann man auch mit DOIF_Readings arbeiten:
http://fhem.de/commandref_DE.html#DOIF_DOIF_Readings
attr gb_Warnung.Fenster DOIF_Readings delay:([WetterProplanta:temperature] > 10 ? 1200 ([WetterProplanta:temperature] > 0 ? 600 : 300))
attr gb_Warnung.Fenster wait [$SELF:delay]
Ich habe das so gelöst:
([BD_Fenster:"^offen$"] and [?Heizung] eq "Ein" and [?Wetter_Borsdorf:temperature:d,0]<0)
({FensterAnsage("BD_Fenster")})
(set Nachrichten message Der Rollladen des Badfensters wird in 2 Minuten geschlossen,set WZ_Echo_Dot speak Der Rollladen des Badfensters wird in 2 Minuten geschlossen)
(set BD_Rola_move cmd_7)
DOELSEIF
([BD_Fenster:"^offen$"] and [?Heizung] eq "Ein" and [?Wetter_Borsdorf:temperature:d,0]<16)
({FensterAnsage("BD_Fenster")})
(set Nachrichten message Der Rollladen des Badfensters wird in 2 Minuten geschlossen,set WZ_Echo_Dot speak Der Rollladen des Badfensters wird in 2 Minuten geschlossen)
(set BD_Rola_move cmd_7)
DOELSE ()
attr BD_Fenster_Meldung cmdState Badfenster auf
attr BD_Fenster_Meldung disable 0
attr BD_Fenster_Meldung do always
attr BD_Fenster_Meldung repeatcmd 180:int((2/15*[Wetter_Borsdorf:temperature]+3)*60)
attr BD_Fenster_Meldung repeatsame 2:3
attr BD_Fenster_Meldung room 004Bad
attr BD_Fenster_Meldung wait 300,300,120:int((2/3*[Wetter_Borsdorf:temperature]+5)*60),300,120
In repeatcmd wird der Abstand der Wiederholungen berechnet und in wait die Verzögerung bis zur ersten Meldung.
Unter 0°C bleibt die Verzögerung bei 5 Minuten und der Abstand bei 3 Minuten.
Der Bruch und der Summand kennzeichnen die Geradengleichung: zeit= f(temp)= 2/15 * temp +5
Aus der Commandref zu DOIF-Perl: Eine dynamische Wiederholung mit set_Exec.
Man kann hier auch z. B. die Temperatur einbauen :)
Wenn Fenster geöffnet wird, dann soll eine Benachrichtigung erfolgen, dabei soll die Benachrichtigung bis zu 10 mal jeweils um weitere 60 Sekunden verzögert werden: erste Benachrichtigung nach 5 Minuten, zweite Benachrichtigung nach weiteren 6 Minuten, dritte Benachrichtigung nach weiteren 7 Minuten usw.
defmod di_window DOIF {if ([window:state] eq "open") {\
set_Exec("timer",'300+$count*60','fhem("echo speak window open")','$count < 9')\
} else {\
del_Exec("timer")\
}\
}
Ich danke euch recht herzlich, genau so habe ich mir das vorgestellt :)