FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Wolle02 am 01 November 2020, 08:20:08

Titel: [gelöst] Perlfunktion in sleep
Beitrag von: Wolle02 am 01 November 2020, 08:20:08
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?
Titel: Antw:Perlfunktion in sleep
Beitrag von: Otto123 am 01 November 2020, 10:07:52
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
Titel: Antw:Perlfunktion in sleep
Beitrag von: Wolle02 am 01 November 2020, 12:53:53
Otto, mal wieder vielen herzlichen Dank für deine umfangreichen Lösungsansätze. Da muss ich dann jetzt mal rumprobieren.

Gruß
Wolle
Titel: Antw:Perlfunktion in sleep
Beitrag von: betateilchen am 01 November 2020, 13:25:25
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?
Titel: Antw:Perlfunktion in sleep
Beitrag von: Otto123 am 01 November 2020, 13:28:25
nein Du liegst richtig :)
Titel: Antw:Perlfunktion in sleep
Beitrag von: betateilchen am 01 November 2020, 13:34:07
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.
Titel: Antw:Perlfunktion in sleep
Beitrag von: Wolle02 am 01 November 2020, 15:38:00
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?
Titel: Antw:Perlfunktion in sleep
Beitrag von: Otto123 am 01 November 2020, 15:46:28
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
Titel: Antw:Perlfunktion in sleep
Beitrag von: Wolle02 am 01 November 2020, 16:39:13
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ß
Titel: Antw:Perlfunktion in sleep
Beitrag von: Wolle02 am 02 November 2020, 15:58:40
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.
Titel: Antw:[gelöst] Perlfunktion in sleep
Beitrag von: frank am 02 November 2020, 17:40:38
ein "echtes" at sollte auch ein fhem restart überleben. das sleep eher nicht, denke ich.
Titel: Antw:[gelöst] Perlfunktion in sleep
Beitrag von: Wolle02 am 02 November 2020, 17:55:54
Danke für den Hinweis; ist in diesem speziellen Fall aber nicht so wichtig.
Titel: Antw:Perlfunktion in sleep
Beitrag von: betateilchen am 02 November 2020, 19:33:47
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:


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