[gelöst] Perlfunktion in sleep

Begonnen von Wolle02, 01 November 2020, 08:20:08

Vorheriges Thema - Nächstes Thema

Wolle02

Guten Morgen,

in der CommandRef habe ich zu sleep folgendes gefunden:

sleep <sec|timespec|suchmuster> [<id>] [quiet]

sleep gefolgt von weiteren Befehlen ist vergleichbar mit einem namenlosen at oder notify Kommando, es führt die nachfolgenden Befehle aus, nachdem es die spezifizierte Zeitspanne gewartet hat bzw. ein Event welches dem <suchmuster> entspricht aufgetreten ist. Die verzögerung kann
...
    als timespec (HH:MM or HH::MM::SS oder {perlfunc}
...
angegeben werden.


Wenn ich das jetzt richtig verstanden habe müsste in einem Notify doch dann eigentlich folgendes funktionieren:

fhem "set HUEDevice1 pct 100 1200; sleep {sunrise_abs(+3000)}; set HUEDevice1 off";

Aber leider bleibt die Lampe an. Wo mache ich den Fehler?

Otto123

#1
Moin,

laut Doku geht das nicht. sunrise liefert HH:MM:SS die Doku sagt aber HH::MM::SS

Aber ich bekomme jetzt auch kein funktionierendes Beispiel mit dem Syntax
Zitatas a timespec (HH:MM or HH::MM::SS or {perlfunc})
hin :(

Ich hatte das doch schonmal: https://forum.fhem.de/index.php/topic,105963.msg999095.html#msg999095
Das funktioniert zumindest noch.

Edit: Die doppelten :: würde ich momentan als Fehler in der Doku werten? 

Tipp: mit cancel kann man sich anschauen was er für sleeps angelegt hat.

Mit etwas Test ermittelt: der syntax sleep HH:MM; ... addiert offenbar HH Stunden und MM min zur aktuellen Zeit.
Zitatsleep 11:30;set LichtWzLO on
.sleep_1974306 2020-11-01 22:58:12 set LichtWzLO on
sleep 13:00:00;set LichtWzLO on
.sleep_1974708 2020-11-02 00:30:46 set LichtWzLO on

Lösung:
Wer lesen kann ist klar im Vorteil: The delay can be given
Also es ist in jedem Fall eine Verzögerung und keine absolute Zeit. Du musst also die Differenz zwischen sunrise und dem aktuellen Zeitpunkt erzeugen.

Oder viel besser: nimm anstatt sleep einfach ein at :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wolle02

Otto, mal wieder vielen herzlichen Dank für deine umfangreichen Lösungsansätze. Da muss ich dann jetzt mal rumprobieren.

Gruß
Wolle

betateilchen

Zitat von: Otto123 am 01 November 2020, 10:07:52
laut Doku geht das nicht. sunrise liefert HH:MM:SS

sunrise liefert doch einen Zeitpunkt, und sleep erwartet eine Zeitdauer.

Oder liege ich jetzt komplett falsch?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Dann ist die Lösung aber noch viel einfacher:

Man kann mit sunrise_rel() die DAUER bis zum nächsten Sonnenaufgang ermitteln. und sunrise_rel()+3000 funktioniert auch.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wolle02

Zitat von: betateilchen am 01 November 2020, 13:25:25
sunrise liefert doch einen Zeitpunkt, und sleep erwartet eine Zeitdauer.


Jetzt bin ich aber doch verwirrt.
So wie ich die CommandRef verstehe hätte ich erwartet, dass ich sleep auch einen Zeitpunkt übergeben kann bis zu dem es dann wartet. Sleep ist in diesem Fall laut Beschreibung ja wie ein at und dem kann ich ja auch einen Zeitpunkt übergeben zu dem eine Aktion ausgeführt wird.

Oder liege ich jetzt völlig falsch?

Otto123

#7
Zitat von: Wolle02 am 01 November 2020, 15:38:00
Oder liege ich jetzt völlig falsch?
Ja - hab ich/wir doch schon gesagt: sleep erwartet eine Zeitdauer! Siehe CommandRef
ZitatDie verzögerung kann
in Sekunden (Millisekunden genau, da man Nachkommastellen spezifizieren kann)
als timespec (HH:MM or HH::MM::SS oder {perlfunc})
oder als suchmuster (Gerätename oder Gerätename:Event)
angegeben werden.
Verzögerung in Sekunden oder 2 Stunden (02:00) usw.

Das ist genau der Unterschied zum at! Deswegen entweder sunrise() (nicht _abs!!!) in einem at - oder sunrise_rel() in einem sleep.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Wolle02

Ah, ok. Dann hatte ich hier das Verständnisproblem. Die Feinheit mit der Verzögerung habe ich so nicht verstanden, sondern gedacht, dass es sich bei Sleep tatsächlich um eine Alternative zu einem at handelt, dem man einen Zeoitpunkt übergeben kann.

Ich probiere jetzt mal sunrise_rel() wie von betateilchen vorgeschlagen; ansonsten mache ich halt ein at draus wie von dir vorgeschlagen.
Mal schauen ob die Lampe morgen früh ausgeht  :D

Danke und Gruß

Wolle02

Nur als kurze Rückmeldung.
Erwartungsgemäß hat dies hier funktioniert:

fhem "set HUEDevice1 pct 100 1200; sleep {sunrise_rel(+3000)}; set HUEDevice1 off";

Vielen Dank nochmal fürs Wegzeigen.

frank

ein "echtes" at sollte auch ein fhem restart überleben. das sleep eher nicht, denke ich.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Wolle02

Danke für den Hinweis; ist in diesem speziellen Fall aber nicht so wichtig.

betateilchen

Zitat von: Wolle02 am 02 November 2020, 15:58:40
Erwartungsgemäß hat dies hier funktioniert:

Eine wirklich schöne Lösung ist das aber trotzdem nicht.

Bei mir habe ich ähnliche Szenarien so gelöst:


  • es gibt genau EIN wiederholendes at, das mit *{sunrise()} definiert ist.
  • Dieses at ruft eine Funktion in 99_myUtils.pm auf, in der ich dann beliebig viele Befehle auflisten kann, die zum Zeitpunkt "Sonnenaufgang" ausgeführt werden sollen.

Genau auf die gleiche Art gibt es at für Sonnenuntergang und Mitternacht. Vorteil:


  • Die Anzahl der at bleibt überschaubar, insbesondere wenn es in mehreren at um den gleichen Zeitpunkt geht
  • Die auszuführenden Befehle stehen alle an einer Stelle, was die Wartung oder ggf. notwendig werdende Änderungen angeht
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!