In Notify warten und auf Bedingung prüfen

Begonnen von bads, 21 September 2014, 14:02:27

Vorheriges Thema - Nächstes Thema

bads

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);;
}
}
FHEM 5.5 auf Banana-PI, Raspberry PI mit FHEM2FHEM, ENOCEAN PI, ELTAKO FTK, ELTAKO FHF, HMLAN, HM-SEC-MDIR, HM-SEC-SC2, 1-Wire, Fussboden-Heizungssteuerung mit Selbstbau HM-Mod-Re-8 + Stellantriebe 230V

Brockmann

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.

Elektrolurch

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
configDB und Windows befreite Zone!

justme1968

eventuell ist watchdog auch eine option.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Icinger

Ich würd sagen, das ist der perfekte Einsatzzweck für einen Watchdog :)

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bads

ok, danke erstmal dafür. Ich kann es erst morgen ausprobieren.
FHEM 5.5 auf Banana-PI, Raspberry PI mit FHEM2FHEM, ENOCEAN PI, ELTAKO FTK, ELTAKO FHF, HMLAN, HM-SEC-MDIR, HM-SEC-SC2, 1-Wire, Fussboden-Heizungssteuerung mit Selbstbau HM-Mod-Re-8 + Stellantriebe 230V