Hauptmenü

Sleep im Notify Script

Begonnen von pandabear_de, 17 Januar 2017, 18:29:36

Vorheriges Thema - Nächstes Thema

pandabear_de

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

Zrrronggg!

#1
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.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL

viegener

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?


Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können