sleep in while-schleife keine Wirkung?

Begonnen von hmtec99, 02 Dezember 2023, 14:45:49

Vorheriges Thema - Nächstes Thema

hmtec99

#15
d.h.

jeder befehl wird zwar um 2s verzögert, aber jeweils mit nur minimalen versatz solange wie die while-schleife insgesamt braucht, um 60x durchzulaufen - also ein paar millisekunden, oder so??

hab ich's jetzt??  ;D

MadMax-FHEM

#16
Zitat von: hmtec99 am 02 Dezember 2023, 18:59:58jeder befehl wird zwar um 2s verzögert, aber jeweils mit nur minimalen versatz solange wie die while-schleife insgesamt braucht, um 60x durchzulaufen - also ein paar millisekunden, oder so??

hab ich's jetzt??

Gratuliere! :)

EDIT: bzw. mit dem Versatz -> nicht bis die ganze Schleife durch ist, sondern eben von Durchlauf zu Durchlauf des nächsten Elementes ist dann der Versatz ziwschen den Befehlen (also Millisekunden)... 8)

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)

hmtec99

Danke für die Blumen!  ;D  ;D  ;D

Gibt es eine (integrierte) Schleifen-Funktion, in der man die Ausführung jedes Durchlaufs verzögern kann?

hmtec99

Zitat von: hmtec99 am 02 Dezember 2023, 19:09:28Danke für die Blumen!  ;D  ;D  ;D

Gibt es eine (integrierte) Schleifen-Funktion, in der man die Ausführung jedes Durchlaufs verzögern kann?

Bzw. wie kann ich mein Ziel mit minimalem Umbau des Codes erreichen?

hmtec99


Jamo

So sollte es funktionieren:
my $t=0;
while(@array=each(%state))
    {
      Log 4, "$array[1]\n";
#   fhem ("sleep 0.1;set $device $array[1]");
  fhem ("sleep $t ;set $device $array[1]");
    $t = $t + 2;
    }
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

hmtec99

Danke für die Hilfe...

Hat mein Problem so nicht gelöst, aber "Ehre wem Ehre gebührt"...  ;D

Oli

P.S. Es funktioniert natürlich wie von dir vorgeschlagen, aber da liegt wohl noch was anderes im Argen... (Signalqualität o.ä.).

betateilchen

Vielleicht fehlt Dir einfach das Grundverständnis, dass

fhem("sleep 0.1; irgendein FHEM Befehl");

etwas völlig anderes ist, als der perl code

{
  sleep 0.1;
  irgendeine perl Funktion;
}

Im ersten Fall ist das einfach eine Kette von FHEM Befehlen (!), auch sleep ist in diesem Kontext ein Befehl und keine Funktion. Dieser Befehl sorgt dafür, dass FHEM einen internen Timer erzeugt, nach dessen Ablauf der gewünschte "irgendein FHEM Befehl" ausgeführt wird. Du kannst das in etwa so vergleichen: 

define tempAt at +<wartezeit aus dem sleep befehl> 'irgendein FHEM Befehl'
Deshalb wartet FHEM in diesem Fall überhaupt nicht mit der weiteren Verarbeitung, sondern der Timer wird parallel abgearbeitet und dann der Befehl ausgeführt.

Im zweiten Fall hast Du einen perl Codeblock, dort ist das sleep() eine perl Funktion, die die Verarbeitung tatsächlich "anhält", deshalb ist das in FHEM ein blockierender Aufruf.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!