Hauptmenü

sleep in myUtils.pm

Begonnen von satprofi, 16 Mai 2025, 11:06:29

Vorheriges Thema - Nächstes Thema

satprofi

Hallo.
Habe hier ein SUB, mit 3 befehlen und dazwischen ein sleep von 1 sec. Aber beim ausführen sehe ich keine Zeitverzögerung. Funktioniert das nicht?
sub laden_off(){

  fhem("set Lader off");
  fhem("\"python2 /usr/local/bin/ladung_off.py\"");
  sleep(1);
  fhem("\"python2 /usr/local/bin/WR1/02Amp_1.py\"");
  sleep(1);
  fhem("\"python2 /usr/local/bin/WR2/00Amp_2.py\"");
  fhem("setreading Wert_I A 0");
}
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Otto123

#1
Hi,

doch das funktioniert, aber deine Befehle sind für FHEM Shell Befehle, d.h. die werden im Hintergrund ausgeführt. Aber FHEM wird durch das Perl sleep blockiert.

Brauchst Du denn die exakte Reihenfolge der Scripts oder einfach nur die Pause zwischen dem Start der Scripts? Im Zweifel würde ich die gesamten Aufrufe in ein Shell script packen und dies aufrufen (siehe unten).

  fhem("\"python2 /usr/local/bin/ladung_off.py\""); wird ausgeführt und in den Hintergrund geschickt, egal wie lange das Script läuft
  sleep(1); wartet 1 sec im Hauptprozess
  fhem("\"python2 /usr/local/bin/WR1/02Amp_1.py\"");wird ausgeführt und in den Hintergrund geschickt, egal wie lange das Script läuft

Das heisst, der Start der beiden Script sollte schon im Abstand von 1 sec erfolgen (setzt doch zum debuggen einfach noch einen Log Befehl ab!) aber wenn das erste Script 2 sec läuft wird das zweite Script schon vorher gestartet.
Wenn Du das so machst:
sub laden_off(){

  fhem("set Lader off;
  \"python2 /usr/local/bin/ladung_off.py\";
  sleep 1;
  \"python2 /usr/local/bin/WR1/02Amp_1.py\";
  sleep 1;
  \"python2 /usr/local/bin/WR2/00Amp_2.py\";
  setreading Wert_I A 0  ");
}
sollte alles in FHEM (mit fhem sleep) ausgeführt werden und nicht blockieren. Das oben beschriebene Verhalten bleibt allerdings.
Ich habe es allerdings nicht getestet!
Edit:
Ich habe noch ein paar Varianten getestet:
Die funktioniert wie Deine und schreibt im Sekundenabstand die Zeit ins Logfile. FHEM ist spürbar für 2 Sekunden blockiert.
(Deine )Variante mit perl sleep
sub laden_off(){

  fhem("set Lampe1 off");
  fhem("\"date\"");
  sleep(1);
  fhem("\"date\"");
  sleep(1);
  fhem("\"date\"");
  fhem("setreading Lampe1 A 0");
}

Variante mit fhem sleep
So wird FHEm nicht blockiert, das Ergebnis ist das gleiche.
sub laden_off(){

  fhem("set Lampe1 off;
  \"date\";
  sleep 1;
  \"date\";
  sleep 1;
  \"date\";
  setreading Lampe1 A 0");
}

Variante mit shell sleep
So werden die (date )Befehle wirklich mit 1 sec Pause gestartet (egal wie lange der einzelne Befehl - dein py Script - läuft), FHEM wird aber nicht blockiert. Der set Befehl am Ende wird allerdings sofort ausgeführt.
sub laden_off(){

  fhem("set Lampe1 off;
  \"date &&
  sleep 1 &&
  date &&
  sleep 1 &&
  date\";
  setreading Lampe1 A 0");
}

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Anstatt mit sleep() zu arbeiten, würde ich einfach at definieren, damit läßt sich die Reihenfolge sehr einfach steuern.

Also etwas in der Art:

sub laden_off(){
  fhem("set Lader off");
  `python2 /usr/local/bin/ladung_off.py`;
  fhem("defmod at1 at +00:00:01 {`python2 /usr/local/bin/WR1/02Amp_1.py`}");
  fhem("defmod at2 at +00:00:02 {`python2 /usr/local/bin/WR2/00Amp_2.py`}");
  fhem("defmod at3 at +00:00:03 setreading Wert_I A 0");
}

Auf die Thematik blockierend/nicht blockierend beim Ausführen von Betriebssystemaufrufen habe ich jetzt keine Rücksicht genommen, mir ging es primär um die zeitliche Ablaufsteuerung.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

satprofi

Zitat von: Otto123 am 16 Mai 2025, 11:52:56Hi,

doch das funktioniert, aber deine Befehle sind für FHEM Shell Befehle, d.h. die werden im Hintergrund ausgeführt. Aber FHEM wird durch das Perl sleep blockiert.

Brauchst Du denn die exakte Reihenfolge der Scripts oder einfach nur die Pause zwischen dem Start der Scripts? Im Zweifel würde ich die gesamten Aufrufe in ein Shell script packen und dies aufrufen (siehe unten)

Ich brauche die Pause zwischen den Scripts, weil der xtender zwei Befehle irgendwie sonst verschluckt.
Danke für die Beispiele, werd's umsetzen
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram