edit...
Ein bischen mehr Infos wäre nicht schlecht.
Wie wird die Funktion aufgerufen? Was genau muss verzögert werden? Wie sieht die Funktion aus?
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
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.
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
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)
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
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.
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.
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 ;)
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.
Das sollte so gehen:
sub meineErsteSub () {
..
fhem("sleep 300;{mySecodSub();;dothisandthat()}")}
..
}
Das würde aber doch blockieren.
Und: es war der Wunsch von 5min Verzögerung... ;)
Gruß, Joachim
@fhempi: ja genau, einfach wieder löschen...
Dann kannst du ja ein [gelöst] vorne an den ersten Post dranpappen... :)
Gruß, Joachim
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.
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
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");
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.