FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Octopus am 05 Januar 2014, 02:08:41

Titel: [gelöst] Wann werden If-Bedingungen in Notify geprüft?
Beitrag von: Octopus am 05 Januar 2014, 02:08:41
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...
Titel: Antw:Wann werden If-Bedingungen in Notify geprüft?
Beitrag von: justme1968 am 05 Januar 2014, 02:24:39
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
Titel: Antw:Wann werden If-Bedingungen in Notify geprüft?
Beitrag von: Octopus am 05 Januar 2014, 11:17:58
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...
Titel: Antw:[gelöst] Wann werden If-Bedingungen in Notify geprüft?
Beitrag von: justme1968 am 05 Januar 2014, 11:26:10
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