FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: -user- am 03 Oktober 2020, 16:27:34

Titel: sleep
Beitrag von: -user- am 03 Oktober 2020, 16:27:34
edit...
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: amenomade am 03 Oktober 2020, 16:40:20
Ein bischen mehr Infos wäre nicht schlecht.
Wie wird die Funktion aufgerufen? Was genau muss verzögert werden? Wie sieht die Funktion aus?
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: MadMax-FHEM am 03 Oktober 2020, 16:46:17
Das geht (verm.) nicht mit sleep.

Sleep blockiert in fhem nur nicht, wenn danach ein fhem-Kommando kommt und kein Perl(Sub)Aufruf...

Aber so geht's:


fhem("defmod atCallLater at +00:05:00 {Test2()}")


Gruß, Joachim
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: betateilchen am 03 Oktober 2020, 17:58:01
Der (simpelstes) Lösungsvorschlag von MadMax-FHEM steht doch da?




Zitat von: MadMax-FHEM am 03 Oktober 2020, 16:46:17
sleep blockiert in fhem nur nicht, wenn danach ein fhem-Kommando kommt

ja, und zwar nur deshalb, weil sleep in diesem Fall selbst ein fhem-Kommando ist und keine perl-Funktion.

Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: Damian am 03 Oktober 2020, 18:04:25
Zitat von: fhempi am 03 Oktober 2020, 17:59:52
Ja, habe ich gesehen, dann wird wieder ein device "at" angelegt oder geht es nicht anders ?

Gibt es keine programmtechnische Lösung in perl ?

Es hängt davon ab, welches Modul du dafür nutzen willst: https://fhem.de/commandref_DE.html#DOIF_set_Exec
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: betateilchen am 03 Oktober 2020, 18:25:43
Zitat von: Damian am 03 Oktober 2020, 18:04:25
Es hängt davon ab, welches Modul du dafür nutzen willst:

Der gewünschte Modulname steht doch im Thread-Titel: 99_myUtils.pm  8)
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: MadMax-FHEM am 03 Oktober 2020, 18:26:32
Zitat von: fhempi am 03 Oktober 2020, 17:59:52
Ja, habe ich gesehen, dann wird wieder ein device "at" angelegt oder geht es nicht anders ?

Gibt es keine programmtechnische Lösung in perl ?

Ja, temporär und was stört daran!?
Es gibt ja nicht mal das "berühmte" rote Fragezeichen ;)

Gruß, Joachim
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: betateilchen am 03 Oktober 2020, 18:26:47
Zitat von: fhempi am 03 Oktober 2020, 17:59:52
Gibt es keine programmtechnische Lösung in perl ?

In perl grundsätzlich schon, aber Du willst das ja in FHEM umsetzen.
Dann solltest Du auch die von FHEM vorgesehenen Mechanismen dafür verwenden.

Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: amenomade am 03 Oktober 2020, 18:47:32
Zitat von: fhempi am 03 Oktober 2020, 17:57:12
Nachdem ich es nochmals ausführlich beschrieben habe, gibt es von Dir jetzt auch einen Vorschlag ?
Ausführlich... naja. Die sub Test1 wird auch selbst aufgerufen und macht irgendwas. Eine sub hängt nicht leer  in der Luft. Und eine sub, die eine andere sub verzögert aufruft... das kann man idR anders lösen, und zwar nicht in myUtils, sondern auf der oberen Ebene.

"einfach warten" ist oft (nicht immer) bei einer schlechten Logik nötig.

Aber gut, wenn das unbedingt so sein soll, ist ja die beste und einfachste Lösung ein at.
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: Damian am 03 Oktober 2020, 19:08:32
Zitat von: amenomade am 03 Oktober 2020, 18:47:32
Ausführlich... naja. Die sub Test1 wird auch selbst aufgerufen und macht irgendwas. Eine sub hängt nicht leer  in der Luft. Und eine sub, die eine andere sub verzögert aufruft... das kann man idR anders lösen, und zwar nicht in myUtils, sondern auf der oberen Ebene.

"einfach warten" ist oft (nicht immer) bei einer schlechten Logik nötig.

Aber gut, wenn das unbedingt so sein soll, ist ja die beste und einfachste Lösung ein at.

ZitatDer gewünschte Modulname steht doch im Thread-Titel: 99_myUtils.pm  8)

... und da hat ein FHEM-at-Modul genauso viel mit 99_myUtils.pm zu tun, wie jedes andere Modul in FHEM ;)
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: betateilchen am 03 Oktober 2020, 19:17:38
Zitat von: Damian am 03 Oktober 2020, 19:08:32
... und da hat ein FHEM-at-Modul genauso viel mit 99_myUtils.pm zu tun, wie jedes andere Modul in FHEM ;)

Stimmt prinzipiell schon.

Eine solche Aufgabenstellung würde ich bei Bedarf weder mit at noch mit DOIF (sowieso nicht) lösen, sondern mit BlockingCall() als FHEM-Bordmittel.

Bisher hatte ich aber noch nie einen Bedarf dafür, eine Funktion aufzurufen, die dann 5 Sekunden sinnlos Zeit totschlägt.
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: Jamo am 03 Oktober 2020, 21:21:58
Das sollte so gehen:
sub meineErsteSub () {
..
fhem("sleep 300;{mySecodSub();;dothisandthat()}")}
..
}
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: MadMax-FHEM am 03 Oktober 2020, 21:48:39
Das würde aber doch blockieren.
Und: es war der Wunsch von 5min Verzögerung... ;)

Gruß, Joachim
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: MadMax-FHEM am 03 Oktober 2020, 21:50:27
@fhempi: ja genau, einfach wieder löschen...

Dann kannst du ja ein [gelöst] vorne an den ersten Post dranpappen... :)

Gruß, Joachim
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: Jamo am 03 Oktober 2020, 21:52:38
Bei mir blockiert das nicht. Einfach mal probieren. Ich habe oben mal das sleep 2 durch sleep 300 ersetzt, damit das 5 Minuten sind.
Die anderen sub ";;dothisandthat()" kann man weglassen, ich wollte nur zeigen, das man die ;; verdoppeln muss wenn man 2 subs hintereinander verzögern will.
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: MadMax-FHEM am 03 Oktober 2020, 22:06:57
Ja, da du wohl mit diesem "Konstrukt" ein fhem-sleep "erzwingst" ;)

Ist nur "gefährlich", da es bei anderer "Anwendung" (mit Sub-Aufruf) eben blockiert...
...und da kann dann ein "Anfänger" drüber stolpern und dann blockiert es eben...

Gruß, Joachim
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: Jamo am 03 Oktober 2020, 22:18:55
Jetzt das ganze mit einem 'named sleep':
sub meineErsteSub () {
..
fhem("sleep 300 myFhemSleepName;{mySecodSub();;dothisandthat()}")}
..
}


Das sleep kann man auch vorher abbrechen, mit
fhem ("cancel myFhemSleepName quiet");
Titel: Antw:sleep in 99_myUtils.pm
Beitrag von: Jamo am 04 Oktober 2020, 16:28:41
Hier nochmal zur Erläuterung:
Zitatsleep

sleep <sec> [<id>] [quiet]

sleep followed by another command is comparable to a nameless at, it executes the following commands after waiting the specified time. The unit is seconds, with millisecond accuracy, as you can specify decimal places.

A sleep with an <id< will replace a sleep with the same <id< and can be canceled by cancel. When called in a notify/at/etc, then nonempty return values of the following commands are logged to the global logfile with loglevel 2.
If quiet is specified, then skip this logging.

Example:
define n3 notify btn3.* set lamp on;;sleep 1.5;;set lamp off
define a3 at +*00:05 set Windsensor 1w_measure;; sleep 2 quiet;; get Windsensor 1w_temp

Note: a sleep not followed by any command will block FHEM, is deprecated, and it issues a WARNING in the FHEM log.