Hauptmenü

Sleep System

Begonnen von mrbreil, 23 September 2018, 19:28:49

Vorheriges Thema - Nächstes Thema

mrbreil

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

fiedel

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.
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Kurt77

hallo,
code:
---------------------
{fhem ("sleep 300")}
{sleep 300}
---------------------
Beide Varianten bringen hier das gleiche Ergebnis: Sie blockieren fhem!
Was übersehe ich?

Danke und Gruß,
Kurt

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kurt77

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

jhohmann

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\"}");
Raspberry Pi 4 - bookworm / EnOcean - Rollo+Licht, deCONZ - Licht+Sensoren, ZWave - CO Messung, HMCCU mit piVCCU - Heizung+Rollo
plus dovecot, minidlna

MadMax-FHEM

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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kurt77

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


MadMax-FHEM

#9
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)
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Kurt77

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

MadMax-FHEM

#11
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
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)