FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ErdBaer am 07 August 2013, 23:01:13

Titel: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 07 August 2013, 23:01:13
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!
Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 08 August 2013, 00:51:31
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?!
Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: Zrrronggg! am 08 August 2013, 01:07:52
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.
Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 08 August 2013, 10:49:40
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") \
}
Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: rudolfkoenig am 09 August 2013, 11:26:56
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.
Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 09 August 2013, 13:02:30
Danke für die Informationen!!!

Ich werde die verschiedenen Varianten mal ausprobieren - hilft ja alles beim Lernen und Verstehen.
Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: Zrrronggg! am 09 August 2013, 13:50:59
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  ;-)

Titel: Aw: Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 11 August 2013, 22:01:19
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!
Titel: Antw:Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 24 November 2013, 22:50:02
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.
Titel: Antw:Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: rudolfkoenig am 25 November 2013, 09:27:13
Ich habe vorgestern ein Fix eingebaut, bitte nach einem update erneut testen.
Titel: Antw:Vier Schaltvorgänge in Serie am selben Aktor ...
Beitrag von: ErdBaer am 25 November 2013, 21:24:26
Update ist drauf ... und es läuft wieder!   :)

Danke für die schnelle Hilfe!