Hallo Zusammen,
habe ein Problem mit notify und Zuständen, welche sich während des Ausführens verändern.
Sprich "Kontakte S1" triggered "notify XY".
Während "notify XY" läuft verändert sich der Zustand von "Kontakt S2"
Ich würde aber gerne den veränderten Zustand von "Kontakt B" während "notify XY" läuft, nach einem kurzen delay, auswerten.
notify XY
(EingangstuerA_S1:open) {
Log 1, "warte 15 Sekunden";
sleep 15;
my $HStest = Value("EingangstuerA_S2");
Log 1, "EingangstuerA_S2: $HStest";
if (Value("EingangstuerA_S2") eq "open") {
fhem("set LichtA on;");
} elsif (Value("EingangstuerA_S2") eq "closed") {
fhem("set LichtB on;");
}
}
fhem.log
2017.11.25 21:38:49 1: EingangstuerA_S2: open
2017.11.25 21:38:49 1: warte 15 Sekunden
2017.11.25 21:39:04 1: EingangstuerA_S2: open
event monitor
2017-11-25 21:38:32 CUL_HM EingangstuerA battery: ok
2017-11-25 21:38:32 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:38:32 CUL_HM EingangstuerA_S1 contact: closed (to HMLAN1)
2017-11-25 21:38:32 CUL_HM EingangstuerA_S1 closed
2017-11-25 21:38:32 CUL_HM EingangstuerA_S1 trigger_cnt: 212
2017-11-25 21:38:34 CUL_HM EingangstuerA battery: ok
2017-11-25 21:38:34 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:39:04 CUL_HM EingangstuerA_S1 contact: open (to HMLAN1)
2017-11-25 21:39:04 CUL_HM EingangstuerA_S1 open
2017-11-25 21:39:04 CUL_HM EingangstuerA_S1 trigger_cnt: 213
2017-11-25 21:39:07 CUL_HM EingangstuerA battery: ok
2017-11-25 21:39:07 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:39:07 CUL_HM EingangstuerA_S2 contact: closed (to HMLAN1)
2017-11-25 21:39:07 CUL_HM EingangstuerA_S2 closed
2017-11-25 21:39:07 CUL_HM EingangstuerA_S2 trigger_cnt: 112
2017-11-25 21:39:20 CUL_HM EingangstuerA battery: ok
2017-11-25 21:39:20 CUL_HM EingangstuerA CMDs_done
2017-11-25 21:39:20 CUL_HM EingangstuerA_S2 contact: open (to HMLAN1)
2017-11-25 21:39:20 CUL_HM EingangstuerA_S2 open
2017-11-25 21:39:20 CUL_HM EingangstuerA_S2 trigger_cnt: 113
2017-11-25 21:39:40 CUL_HM EingangstuerB battery: ok
2017-11-25 21:39:40 CUL_HM EingangstuerB CMDs_done
2017-11-25 21:39:40 CUL_HM EingangstuerB_S2 contact: open (to HMLAN1)
2017-11-25 21:39:40 CUL_HM EingangstuerB_S2 open
2017-11-25 21:39:40 CUL_HM EingangstuerB_S2 trigger_cnt: 95
2017-11-25 21:39:41 CUL_HM EingangstuerB battery: ok
2017-11-25 21:39:41 CUL_HM EingangstuerB CMDs_done
2017-11-25 21:39:41 CUL_HM EingangstuerB_S2 contact: open (to wz_4Kanal_Switch_Zentrale)
2017-11-25 21:39:41 CUL_HM EingangstuerB_S2 open
2017-11-25 21:39:41 CUL_HM EingangstuerB_S2 trigger_cnt: 95
Arbeitet notify/fhem nur rein sequenziell ab, mache ich was falsch oder gibt es bessere Möglichkeiten das zu realisieren?
Komme nach ewigen eingrenzen und probieren nicht weiter.
Hi,
Das sleep blockiert fhem für 15 Sekunden (siehe https://fhem.de/commandref_DE.html#sleep (https://fhem.de/commandref_DE.html#sleep)).
Du kannst im notify ein at definieren, dass in 15 Sekunden etwas beginnt.
Da gerade mit dem Handy getippt den folgenden code wegen falscher Anführungszeichen usw. Nicht kopieren.
ungetestet ...
(EingangstuerA_S1:open) {
defmod doorcheck at 00:00:15 {
my $HStest = Value("EingangstuerA_S2");
Log 1, "EingangstuerA_S2: $HStest";
if (Value("EingangstuerA_S2") eq "open") {
fhem("set LichtA on;");
} elsif (Value("EingangstuerA_S2") eq "closed") {
fhem("set LichtB on;");
}
}
}
Ein fhem-sleep (nicht Perl sleep) wäre nicht blockierend.
InternalTimer wäre in Perl auch möglich.
Gruß
Dan
Man könnte statt des notify auch einen watchdog (http://commandref.fhem.de/commandref_DE.html#watchdog) nehmen, bei dem das 2. Event nie getriggert wird. Dazu regexp2 auf einen Ausdruck setzen, der niemals passen kann (bspw. $.+^).
Also in etwa so:
define watchdog wdWait15Seconds EingangstuerA_S1:open 00:00:15 $.+^ { ... }
(Ggf. auch das Attribut autoRestart setzen)
gb#
PS: Wo bleiben eigentlich die DOIF-Leute? ;D
Habe jetzt etwas rumprobiert.
fhem("sleep 15;");
Funktioniert nicht. Status aktualisiert sich nicht und es wird eine Warnung ausgegeben. WARNING: sleep without additional commands is deprecated and blocks FHEM
Devmod leider auch nicht.
(EingangstuerA_S1:open) defmod doorcheck at +00:00:15 { Log 1, "Done waiting"; }
Alles in {} wird nicht berücksichtigt, sprich nix ausgeführt. Scheint wohl nur mit fhem Befehlen zu funktionieren.
Leider, oder wende ich das falsch an? Doku. ist etwas mau, was defmod angeht.
(EingangstuerA_S1:open) { fhem("defmod doorcheck at +00:00:15 set Licht on"); }
Funktioniert, bringt mir aber nix, da ich komplexere IF ELSIF anwenden will.
Watchdog oder DOIF würde ich ungern einsetzten, da ich mein bestehenden notify komplett umbauen müsste.
Ich guck mir jetzt noch InternalTimer an. Scheint aber auf den ersten Blick etwas komplex zu sein.
Zitat von: sherwood am 26 November 2017, 10:06:14
Watchdog oder DOIF würde ich ungern einsetzten, da ich mein bestehenden notify komplett umbauen müsste.
Nö! Du kannst den cmd-Block von notify 1:1 (ohne das sleep natürlich!) in den cmd-Block von watchdog übernehmen.
Hast du dir den verlinkten Commandref-Eintrag (http://commandref.fhem.de/commandref_DE.html#watchdog) dazu überhaupt angeschaut?)
Zitat von: sherwood am 26 November 2017, 10:06:14
da ich komplexere IF ELSIF anwenden will.
Ich gehe mal davon aus, du meinst
if ... elsif also die Perl-Ausdrücke.
Komplexeren Code lagert man üblicherweise in die 99_myUtils.pm (https://wiki.fhem.de/wiki/99_myUtils_anlegen) aus.
Zitat von: sherwood am 26 November 2017, 10:06:14
fhem("sleep 15;");
Funktioniert nicht. Status aktualisiert sich nicht und es wird eine Warnung ausgegeben. WARNING: sleep without additional commands is deprecated and blocks FHEM
Ja! Die Meldung sagt dir ja auch genau, warum!
Es sollte nach dem Sleep noch ein wieterer (FHEM-)Befehl kommen.
bspw:
fhem("sleep 15;set lampe on");
damit würde das fhem-Kommando "set lampe on" um 15 sekunden verzögert, OHNE zu blockieren. Auch hier würde sich mal ein Blick in die Commandref zu sleep (http://commandref.fhem.de/commandref_DE.html#sleep) lohnen ;)
gb#
Hab ihn mal überflogen. Guck mir das mal genauer an.
Das mit sleep ist mir jetzt auch klar. War lediglich die Antwort auf den Vorschlag es als fhem Befehl zu nutzen.
Sieht gut aus mit Watchdog.
Danke für den Hinweis.
Moin,
defmod ist "nur" ein anderes Wort für define. Der Unterschied besteht darin, dass define nicht funktioniert, wenn es das angelegte device schon gibt. defmod würde es dann überschreiben.
Versuche mal folgendes (jetzt am Rechner war das Nachschlagen einfacher, habe einen wichtigen Teil vergessen ;) ):
(EingangstuerA_S1:open) {
fhem('
defmod doorcheck at 00:00:15 {
my $HStest = Value("EingangstuerA_S2");
Log 1, "EingangstuerA_S2: $HStest";
if (Value("EingangstuerA_S2") eq "open") {
fhem("set LichtA on;");
} elsif (Value("EingangstuerA_S2") eq "closed") {
fhem("set LichtB on;");
}
}
');
}
Wichtig ist, dass du innerhalb des fhem('defmod...') immer nur doppelte Anführungszeichen nimmst.
Danke. Probiere ich bei Gelegenheit mal aus.
Bin mit Watchdog zufrieden und es macht was es soll.