Guten Abend, ich habe eine sehr allgemeine Frage. Wie rufe ich aus fhem einen Systembefehl oder eine Funktion zeitverzögert auf, ohne zur Laufzeit ein temporäres AT Device zu erzeugen? Ich weiß das ein Fhem sleep gefolgt von einem Befehl
fhem("sleep 10; set gereat irgendwas 0;");
nicht blockiert.
Ein
sleep 10; funktionsaufruf();
oder ein
sleep 10; system("/opt/fhem/machwas.sh &");
würden fhem blockieren?
Ich denke ja, aber wie löst ihr das?
Gruß Christian
Dein letztes Beispiel ist doch auch "fhem- sleep" und sollte nicht blockieren.
Nur innerhalb von Perl blockiert das sleep. Probier es doch einfach aus:
Dein letzes Beispiel mit z.B. 5 Minuten drin starten und dann versuchen
etwas zu schalten oder ein get ausführen...
Übrigens legt das "fhem- sleep" auch ein temp. at an - nur im Hintergrund.
Zitat von: fiedel am 24 September 2018, 04:33:26
Dein letztes Beispiel ist doch auch "fhem- sleep" und sollte nicht blockieren.
Nur innerhalb von Perl blockiert das sleep. Probier es doch einfach aus:
Dein letzes Beispiel mit z.B. 5 Minuten drin starten und dann versuchen
etwas zu schalten oder ein get ausführen...
Übrigens legt das "fhem- sleep" auch ein temp. at an - nur im Hintergrund.
Nein ist es nicht. Hier werden FHEM Befehle (FHEM) mit Funktionsaufrufen (Perl) gemischt. Das geht so nicht.
Was gehen sollte wäre
fhem('sleep10, "/opt/fhem/machwas.sh &"')
Ungetestet.
hallo,
code:
---------------------
{fhem ("sleep 300")}
{sleep 300}
---------------------
Beide Varianten bringen hier das gleiche Ergebnis: Sie blockieren fhem!
Was übersehe ich?
Danke und Gruß,
Kurt
Zitat von: Kurt77 am 03 Februar 2022, 16:45:36
Was übersehe ich?
Vermutlich die commandref ;)
Zitat von: commandref->sleep
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
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.
Ein sleep mit einer <id> ersetzt ein sleep mit der gleichen <id> and can mit cancel entfernt werden. Falls sleep in at/notify/etc aufgerufen wurde, und die nachfolgenden Kommandos einen nicht leeren Text zurückgeliefert haben, dann wird dieser Text mit loglevel 2 protokolliert.
quiet vermeidet diese Protokollierung.
Beispiele:
sleep 0.5
define n3 notify btn3.* set lamp toggle;;sleep 0.5;;set lamp toggle
define a3 at +*00:05 set Windsensor 1w_measure;; sleep 2 quiet;; get Windsensor 1w_temp
Bemerkung: falls sleep von keinem Befehl gefolgt wird, dann wird FHEM blockiert. Das ist unerwünscht, und im FHEM-Log wird eine Warnung protokolliert.
Gruß, Joachim
Hallo Joachim,
das ist doch logisch, dass nach sleep ein Befehl kommen muss. Denn worauf sollte sleep denn sonst warten.
in einer sub meiner 99_myUtils.pm folgt der Befehl
my $minuten = $i * 5;
Was mache ich also falsch?
Danke und Gruß,
Kurt
Ich rufe in einem notify folgendes auf und das blockiert nicht.
Hier hat das sleep noch einen Namen bekommen, aber das sollte keine Rolle spielen.
fhem("sleep 30 slAZHeizungCheckFensterStatus;{wandthermostatPruefen\"ArbeitszimmerWandThermostat\",\"ArbeitszimmerFenster\",\"teleBot\"}");
Zitat von: Kurt77 am 03 Februar 2022, 17:40:39
Was mache ich also falsch?
Zu wenig Info.
Poste doch einfach ALLES!
Dann muss man/wir/ich nicht rätseln!
Weil eben bei dem gezeigten Ausschnitt KEIN Befehl mehr kam!
Gruß, Joachim
Hallo Joachim,
das ist ja der Wahnsinn!
Willst Du mir etwa sagen, dass
code:
----------------------
my $minuten = $i * 5;
----------------------
kein Befehl ist?
meine blockierende sub sah urspr. so aus:
code:
----------------------
fhem ("sleep 300");
my $minuten = $i * 5;
----------------------
jetzt habe ich die sub umgestellt:
code:
----------------------
fhem ("sleep 300");
fhem ("set Sonos_Buero speak 40 de hallo");
----------------------
und wieder wird blockiert!
Danke und Gruß,
Kurt
Zitat
my $minuten = $i * 5;
Ist kein (fhem) Befehl, sondern eine Variablendeklaration.
Zitat
fhem ("sleep 300");
fhem ("set Sonos_Buero speak 40 de hallo");
Sind 2 Perl Befehle hintereinander...
Warum nicht (einfach):
fhem ("sleep 300; set Sonos_Buero speak 40 de hallo");
EDIT: so blockiert auch nichts, weil dem sleep ein fhem Kommando folgt...
Gruß, Joachim
P.S.: wenn du gleich alles gepostet hättest wären wir (und du) schon lange fertig... 8)
Hallo Joachim,
bin jetzt Deinem Vorschlag gefolgt und es gibt keine Blockade mehr. Danke dafür!
Du hast ja dankenswerterweise in Beitrag #4 einen Ausschnitt aus der comman dref gepostet, aber da wird von "Befehl", nicht aber von "fhem-Befehl" gesprochen.
Es hat sicher einen Sinn, warum das so implementiert wurde, aber mir erschließt sich nicht, warum kein beliebiger Befehl kommen darf.
Danke nochmal und Gruß,
Kurt
Es darf/kann auch ein "beliebiger" Befehl kommen, wenn man es richtig macht... ;)
Aber wenn du mit 2 nacheinander folgenden Perl-Befehlen arbeitest dann eben nicht... 8)
Das sleep legt (wie in der commandref erläutert) ein "unsichtbares" at an mit eben dem NACHFOLGENDEN Befehl, darum muss er auch DIREKT NACHFOLGEN...
...damit fhem das eben im fhem-sleep "verarbeiten" kann.
Den nachfolgenden Perl-Aufruf "sieht" das fhem-sleep im vorausgehenden Perl-Befehl ja nicht... ;)
Gruß, Joachim