[gelöst] Wann werden If-Bedingungen in Notify geprüft?

Begonnen von Octopus, 05 Januar 2014, 02:08:41

Vorheriges Thema - Nächstes Thema

Octopus

Hallo,

ich versuche, mit FHEM eine Alarmanlage einzuschalten. Ich habe einen Riegelschaltkontakt, der insgesamt 4 Zustände erzeugt:

Abgeschlossen (open / closed)
Aufgeschlossen (open / closed)

Wenn ich abschließe, geht Aufgeschlossen auf "open", Abgeschlossen auf "closed" (ca. 0,5 sec später). Ich prüfe diese Logik mit einem Notify:

define ANLAGE_EIN_intern notify S_Tuer_aufgeschlossen:open { fhem("define warte2sec at +00:00:02 set ANLAGE_SCHARF_intern on") if (Value("S_Tuer_abgeschlossen") eq "open" && Value("ANLAGE_STATUS") eq "unscharf") }

(Es gibt noch ein ANLAGE_EIN_extern, deshalb ist die Prüfung auf "S_Tuer_aufgeschlossen:open" notwendig. Die Gesamtlogik ist etwas komplizierter).

Mein Problem ist: wenn ich ANLAGE_EIN_extern schalte (also den Zustand Abgeschlossen:closed), wird trotzdem ANLAGE_EIN_intern gezogen, da die Prüfung auf

if (Value("S_Tuer_abgeschlossen") eq "open"

eben immer noch den Wert open liefert, obwohl Abgeschlossen closed ist. Das liegt wohl daran, dass der Zustand closed ca. 0,5 sec nach Aufgeschlossen open erfolgt. Daher war meine Idee, eine Verzögerung von 2 sec einzulegen, so dass in FHEM der Zustand Abgeschlossen closed anliegt und dann erst mit "if" zu prüfen, ob die Bedingung erfüllt ist.

Aber egal ob ich ich ein

define warte2sec at +00:00:02

oder ein

sleep 2

einbaue, es wird immer der Zustand Abgeschlossen open gelesen (im Webinterface wird korrekt "closed" angezeigt, da die Zeitverzögerung mit dem Aktualisieren der Webseite aber recht groß ist, zeigt es nur, dass der Kontakt korrekt arbeitet, die Prüfung der Bedingungen läuft schon vor dem Update der Webseite).

Langer Rede kurzer Sinn: wann werden die Bedingungen in einem "if" im Notify geprüft? Sobald das Notify beginnt oder erst nach Ablauf der Wartezeit (letzteres kann ich mir nicht vorstellen, sonst müßte es ja funktionieren)?

Kennt jemand eine Möglichkeit, zeitverzögert die Bedingungen zu lesen, so dass der Status in FHEM "ankommen" kann und dann erst ausgelesen wird, um dass dann in einer if-Abfrage prüfen zu können?

Gruß
Octopus

PS: wenn es etwas wirr beschrieben ist, schiebe ich es auf die Uhrzeit...
FHEM 5.7 auf Raspi 2 mit FHZ1300 PC, 2 x HM-LAN-Adapter, div. FHT-Thermostate, FS20 FMS, div. HM-Gerät.

justme1968

das if wird in dem augenblick geprüft in dem es ausgefürt wird. wenn du das if erst zwei sekunden später prüfen willst darfst du es nicht im notify auf selber machen sondern eben inerhalb des at das die verzögerung bewirkt.

du musst also eigentlich zweistufig arbeiten. im notify legst du das at für die verzögerung an und im at prüfst du dann ob alle bedingungen zum scharfschalten erfüllt sind. schau mal im wiki. ich glaube da gibt es sogar ein beispiel für das zweistufige vorgehen.

da es ziemlich unübersichtlich wird das if noch mit ins temporäre notify rein zu definieren ist es praktischer alles in eine sub in 99_myUtils.pm auszulagern und nur diese aus dem at aufzurufen.

sleep solltest du gar nicht verwenden weil es einfach fhem komplett für zwei sekunden blockiert.

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

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

Octopus

Danke für den Tip mit der If-Abfrage im at - da bin ich nicht drauf gekommen und das war die Lösung.

Die Zeile sieht jetzt so aus:

define ANLAGE_EIN_intern notify S_Tuer_aufgeschlossen:open define warte2sec_i at +00:00:02 { if (Value("S_Tuer_abgeschlossen") eq "open" && Value("ANLAGE_STATUS") eq "unscharf") { fhem("set ANLAGE_SCHARF_intern on") } }

Damit funktionierts...
FHEM 5.7 auf Raspi 2 mit FHZ1300 PC, 2 x HM-LAN-Adapter, div. FHT-Thermostate, FS20 FMS, div. HM-Gerät.

justme1968

noch eine möglichkeit (je nach randbedingungen) ist auch noch das notify an das event zu hängen das später eintrifft und dann umgekehrt zu prüfen. eventuell brauchst du dann aber zwei notifys.

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

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