FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: pandabear_de am 17 Januar 2017, 18:29:36

Titel: Sleep im Notify Script
Beitrag von: pandabear_de am 17 Januar 2017, 18:29:36
Ho,
mir ist bewußt, dass ich Sleep nicht so verwenden sollte, da ich so FHEM 10 Sekunden komplett pausieren lasse.

In den diversen Texten zum Thema steht drin, dass Sleep für den direkt folgenden Befehl quasi ein execute at kurzzeitig einfügt und so aus der Freeze Periode raus kommr.

Wie mache ich das aber im Notify Scripte/Definition?

Nachfolgend ein Auszug aus meinem TelegramBot Notiy Scripts. In Telegram gebe ich das Wort Bahn ein und erhalte 10 Sekunden später die aktuellen Verspätungen.

   ...
   elsif ($evtparts[1] eq 'Bahn') {
    # folgend werden die aktuellen Verspätungen abgeholt
     fhem("set Bahn_Xxx rereadDBInfo; set Bahn_Yyy rereadDBInfo;");
    # Jetzt bitte 10 Sekunden warten, damit die Rereads abgeschlossen sind
     fhem("sleep 10 quiet");
     my $Bahn_YyyZeit1 = ReadingsVal("Bahn_Yyy", "plan_departure_1", "");
      my $Bahn_YyyDelay1 = ReadingsVal("Bahn_Yyy", "plan_departure_delay_1", "");
      ....


Danke für die Unterstützung

Gruß
Jakob
Titel: Antw:Sleep im Notify Script
Beitrag von: Zrrronggg! am 17 Januar 2017, 18:49:35
Ich persönlich vermeide sleep wo's nur geht. Auf der FHEM-Ebene selbst sollte das aber kein Problem sein.
D.H. dein Beispiel sollte FHEM eigentlich NICHT blockieren. Sleep in Perl-Teilen blockiert und sleep ohne nachfolgendes Kommando blockiert ... wenn ich mich recht erinnere.

Ansonsten könnte man das mit einem neuen define at zu lösen.

also anstatt:

Zitat... {fhem("sleep 10"); ...

dann

Zitat{fhem("define spaeter_antworten at +00:00:10 bluber ...

In deinem Fall gibt das aber ne Klammerorgie.

Mal sehen, aus

Zitatfhem("sleep 10 quiet");my $Bahn_YyyZeit1 = ReadingsVal("Bahn_Yyy", "plan_departure_1", "");my $Bahn_YyyDelay1 = ReadingsVal("Bahn_Yyy", "plan_departure_delay_1", ""); ...

müsste werden:

Zitat{fhem("define spaeter_antworten at +00:00:10 {my $Bahn_YyyZeit1 = ReadingsVal("Bahn_Yyy", "plan_departure_1", "") ;; my $Bahn_YyyDelay1 = ReadingsVal("Bahn_Yyy", "plan_departure_delay_1", "") ...

Wie die abschliessenden Klemmern aussehen kann ich dir nicht sagen, da du leider dein Script nur zur Hälfte gepostet hast. Ebenso bin ich mir nicht sicher, ob nicht schon bei deinem Beispiel bereits Semikolons verdoppelt werden müssten. Schwierig zu beurteilen ohne Anfang und Ende deines defines.

Zuletzt:

Zitatfhem("set Bahn_Xxx rereadDBInfo; set Bahn_Yyy rereadDBInfo;");
     fhem("sleep 10 quiet");

ist genau genommen nur eine umständliche Schreibweise von

Zitatfhem("set Bahn_Xxx rereadDBInfo; set Bahn_Yyy rereadDBInfo; sleep 10 quiet");

und ich meine, dass auch hier schon das Semikolon escaped werden muss, da vorher

Zitatelseif  ($evtparts[1] eq 'Bahn') {

Zitatfhem("set Bahn_Xxx rereadDBInfo ;; set Bahn_Yyy rereadDBInfo; sleep 10 quiet");

So oder so: im speziellen Fall sollte sleep kein Problem sein.
Titel: Antw:Sleep im Notify Script
Beitrag von: viegener am 17 Januar 2017, 18:51:13
Zur Erklärung:

Ein sleep in perl würde das ganze FHEM anhalten ein sleep in fhem("") führt dazu, dass der/die nachfolgenden Kommandos entsprechend später ausgeführt werden. Also wird Deine Ausführung nicht angehalten.

Die sauberste Lösung wäre eigentlich auf die Events von dem Reread zu warten und dann zu reagieren, wenn die neuen Daten da sind. Also ein notify auf diese Readings/Events und dann den Teil nach dem Sleep ausführen

Eine andere Lösung wäre ein separates notify mit dem code und dann per trigger aufrufen (der sleep kann dann in dem Ausführungsteil des Notify stehen).

Vielleicht kommt ja noch einer von den Experten auf eine weitere Idee?