Ich möchte in einem notify 5 Sekunden warten und dann eine Bedingung abprüfen. Ich habe einen Riegelschalter in der Haustür, der den dummy "Hausalarm" ausschaltet. Jedoch kommt mir immer der Türkontakt (Typ:ENOCEAN) zuvor und löst in beigefügten Notify erstmal alarm aus. Umgehen wollte ich das mit einer Zeitverzögerung. Gefunden habe ich, dass man mit sleep N warten kann. Jedoch wird anscheinend bei der Überprüfung der Bedingung immer der bei Eintritt in Notify vorhandene Status ausgewertet. Ist das wirklich so, oder nur einfach Zufall bei mir? Wenns nicht anders funktioniert, dann muss ich den ENOCEAN Kontakt durch einen HM-Kontakt ersetzen, da kann man ja eine Verzögerung setzen.
Danke für eure Hilfe
Zitat
(al.co.*:offen) {
fhem "sleep 5.0";;
if (Value("Hausalarm") eq "on") {
fhem "set al.sw.AU.Sirene on";;
NotifyAlarm($NAME,$EVENT);;
DebianMail("XXX\@t-online.de;XXX\@t-online.de","FHEM Alarmausloesung",$NAME." hat Status ".$EVENT);;
}
}
Warum das so läuft, weiß ich auch nicht. Möglicherweise wird der Perl-Ausdruck (also alles in {...}) tatsächlich direkt komplett ausgewertet, bevor er abgearbeitet wird. Würde mich aber wundern.
Du könntest das Problem beispielsweise umgehen, indem Du statt des notify ein DOIF verwendest. Da kannst Du mit dem wait-Attribut eine Zeitspanne x festlegen. Wenn die definierten Bedingungen eintreten, wartet das DOIF x ab und nur wenn die Bedingungen innerhalb von x bestehen bleiben, wird anschließend die Aktion ausgelöst.
Hallo,
sleep ist keine gute Idee, da das System dann auch für die Zeit steht. Durch das sleep ändert sich auch nichts an dem Wert des notify.
Alternativen:
a) Schau dier mal das Modul sequence an
b) in dem notify einen at-timer definieren, der nach 5 Sekunden gestartet wird und dann Deinen "status" abfragt und abarbeitet.
Gruß
Elektrolurch
eventuell ist watchdog auch eine option.
gruss
andre
Ich würd sagen, das ist der perfekte Einsatzzweck für einen Watchdog :)
lg, Ici
Nach vielen gut gemeinten Ratschlägen, hier mal was Konkretes:
define di_alarm DOIF ([al.co] eq "offen" and [Hausalarm] eq "on")(set al.sw.AU.Sirene on,{NotifyAlarm("al.co","Alarm")}, {DebianMail("XXX\@t-online.de;XXX\@t-online.de","FHEM Alarmausloesung", "al.co hat Status offen")})
attr di_alarm wait 5
Den Namen deines Devices "al.co" musst du evtl. anpassen. $EVENT und $NAME gibt es nicht, ist aber eindeutig durch die Abfrage.
Hier wird nur einmal Alarm ausgelöst und dann wieder, wenn zwischendurch "al.co" oder "Hausalarm" den Zustand gewechselt haben.
Gruß
Damian
ok, danke erstmal dafür. Ich kann es erst morgen ausprobieren.