Hallo zusammen.
Bei meiner (bewegungsabhängige) Außenleuchte lässt sich durch zweimaliges Aus- und Einschalten ein 4-stündiges Dauerleuchten aktivieren. Nachdem der Schalter jetzt durch einen Funk-Schaltaktor (HM-LC-Sw1PBU-FM) ersetzt wurde, möchte ich das Dauerlicht gern automatisch 30 Minuten nach Sonnenuntergang aktivieren. Aktuell habe ich wie folgt getestet (die Uhrzeit wird noch durch "sunset" ersetzt):
define E_Aussenlicht_4h at *22:45 {\
fhem("set E_Aussenlicht off");;\
fhem("set E_Aussenlicht on");;\
fhem("set E_Aussenlicht off");;\
fhem("set E_Aussenlicht on");;\
}
Die Schaltvorgänge sind aber extrem kurz und die Außenleuchte scheint sich "zu verschlucken". Gibt es einen Möglichkeit, Pausen zwischen den Schaltvorgängen einzufügen oder evtl. eine alternative Lösung für mein Vorhaben.
Danke und Grüße!
Nach etwas googeln und probieren habe ich eine Lösung gefunden, die zu funktionieren scheint:
define E_Aussenlicht_4h at *{sunset_abs("REAL")} {\
fhem("set E_Aussenlicht off;;\
define pause1 at +00:00:02 set E_Aussenlicht on;;\
define pause2 at +00:00:02 set E_Aussenlicht off;;\
define pause3 at +00:00:02 set E_Aussenlicht on");;\
}
Ich bin mir aber nicht sicher, ob's eine elegantere Methode gibt?!
define E_Aussenlicht_4h at *22:45 set E_Aussenlicht off ; sleep 1.0 ; set E_Aussenlicht on ; sleep 1.0 ; set E_Aussenlicht off ; sleep 1.0 ; set E_Aussenlicht on
Der Befehl "Sleep" ist aber nicht ganz ungefährlich.
Deine Methode ist auch okay und vermeidet sleep. Die Einkapselung in erst
{
(= jetzt kommt PERL ) nur um dann zu sagen:
fhem("...
(= ach nee, doch kein PERL, ich meinte FHEM Kommandos) ist aber natürlich überflüssig, auch wenn das hier im Forum Folklore geworden ist, das so zu schreiben.
Danke für die Aufklärung bezüglich PERL/FHEM-Kommando! Wieder etwas gelernt :-).
Wenn "sleep" nicht ganz ungefährlich ist, dann werde ich sicherheitshalber bei "meiner" Variante bleiben. Die "Einkapselung" werde ich auch beibehalten (müssen), da in Kürze noch ein "if"-Statement hinzu kommt.
In der obigen Form hat das Ganze aber noch nicht ganz funktioniert, weil die Schaltvorgänge 3 und 4 immer noch ohne Pause gesendet wurden (da ja immer "+00:00:02"). Nach einer kleinen Anpassung funktioniert's jetzt aber wie gewünscht:
define E_Aussenlicht_4h at *{sunset_abs("REAL",1800)} { \
fhem("set E_Aussenlicht off;; \
define pause1 at +00:00:02 set E_Aussenlicht on;; \
define pause2 at +00:00:04 set E_Aussenlicht off;; \
define pause3 at +00:00:06 set E_Aussenlicht on") \
}
Ein sleep() in perl direkt ist deswegen "gefaehrlich", weil FHEM waehrend der Ausfuehrung von sleep() blockiert ist, und irgendwelche Events verschlaeft, Acks nicht sendet, bestimmte Geraete wie HMLAN nicht "am-Leben erhalten" kann (keepalive), usw.
Das FHEM sleep Kommando, so wie von Zrrronggg! gezeigt, ist ungefaehrlich, da es alles, was nach dem sleep kommt mit einem InternalTimer ausfuehrt. Fuer Aufgaben wie diese empfehle ich das FHEM-sleep statt at, da es manche Probleme (Fehlermeldung beim wiederholtes Anlegen eines ats mit dem gleichen Namen) vermeidet.
Dass es ungefaehrlich ist, steht auch in http://fhem.de/commandref.html#sleep (//fhem.de/commandref.html#sleep)
Einfacher geht das oben beschriebene mit dem blink-Kommando (siehe http://fhem.de/commandref.html#setExtensions (//fhem.de/commandref.html#setExtensions), bzw. set E_Aussenlicht bink 2 2), was aber leider von CUL_HM (noch?) nicht angeboten wird. setExtensions werden z.Zt. von EnOcean, FBDECT, FS20 und ZWave unterstuetzt.
Vlt. sollte Martin (CUL_HM Maintainer) darauf aufmerksam gemacht werden: auch wenn das bei CUL_HM per register direkt programmiert werden kann, ist blink, usw. vmtl. einfacher fuer die Einsteiger.
Danke für die Informationen!!!
Ich werde die verschiedenen Varianten mal ausprobieren - hilft ja alles beim Lernen und Verstehen.
Ich gebe zu, sleep "gefährlich" zu nennen ist ungenau.
Problem ist nur, das sich hier im Forum eine bestimmte Notation breit macht und oft empfohlen wird, die in etwa so aussieht:
define irgendwas notify irgendwas { \
fhem("set blub on");; } { \
fhem("set blub2 on");; } { \
fhem("set blub3 on");; } \
}
In dieser (in meinen Augen Cargo-Cult-Programming-)Schreibweise ist es sehr einfach, aus Versehen ein sleep zwischendrin an die falsche Stelle zu schreiben, oder durch Vereinfachung an die falsche Stelle zu rücken. Vielen Leuten sind die Funktionen der diversen Klammerebenen absolut nicht bewusst und daher wissen sie auch nicht, wann das sleep im perl-Bereich liegt.
Auch ErdBaers Schreibweise enthält ja eine überflüssige Einkapselung in Perl (gut, er hat später gesagt, das ist weil er noch ein "IF" nutzen will, das ist natürlich dann richtig). Wenn immer ich hier Beispielcode sehe, der geschweifte Klammern enthält obwohl man keine braucht, gehen bei mir was "sleep" betrifft die Alarmglocken an ... und ich von der Nutzung rate ab.
Das ändert natürlich nichts daran, dass sleep innerhalb Fhem 1a verwendet werden kann und keinerlei Probleme macht.
Ich müsste also anstatt "Der Befehl "Sleep" ist aber nicht ganz ungefährlich." genauer sagen:
"Wenn man nicht genau weiss, wo man sleep einsetzen kann und wo nicht, rate ich von einer Nutzung ab, und dein Beispielcode sieht so aus als ob du es eventuell nicht genau wüsstest."
Wenn ich das schreibe, kriege ich aber wieder negative Reputationspunkte ;-)
Ich hab dann mal auf "sleep" umgestellt ... funktioniert perfekt.
Die Lösung (noch ohne IF-Bedingung) sieht dann so aus:
define E_Aussen_4h_aut at *{sunset_abs("REAL",1200)} {\
fhem("set E_Aussenlicht off;; sleep 2;;\
set E_Aussenlicht on;; sleep 2;;\
set E_Aussenlicht off;; sleep 2;;\
set E_Aussenlicht on")\
}
Danke an euch beide für die Unterstützung und Hinweise!
Hallo zusammen.
Nach dem aktuellen FHEM-Update funktioniert meine obige Lösung irgendwie nicht mehr?! Bei jeder Ausführung bekomme ich im Log die Meldung "After sleep: Unknown command, try help.".
Hat sich an der Verwendung des "sleep" etwas geändert - laut Commandref sieht alles aus, wie immer?
Danke und Grüße.
Ich habe vorgestern ein Fix eingebaut, bitte nach einem update erneut testen.
Update ist drauf ... und es läuft wieder! :)
Danke für die schnelle Hilfe!