[gelöst] Sleep wird ignoriert

Begonnen von AB1970, 04 Januar 2018, 15:01:03

Vorheriges Thema - Nächstes Thema

AB1970

Hallo,
wahrscheinlich bin ich von Blindheit geschlagen, aber ich sehe den Fehler nicht.

define SZ.Act_on_sonnenaufgang notify SZ.Sonnenaufgang {\
if ("$EVENT" eq "on") {\
my @sonne = ('BF3F00','C14502','C34B03','C55205','C75807','C95E08','CB640A','CD6A0C','D0710D','D2770F','D47D10','D68312','D88914','DA9015','DC9617','DE9C19','E0A21A','E2A81C','E4AE1E','E6B51F','E8BB21','EAC123','ECC724','EECD26','F1D427','F3DA29','F5E02B','F7E62C','F9EC2E','FBF330','FDF931','FFFF33','FBFB3E','F8F848','F4F453','F1F15E','EDED69','EAEA73','E6E67E','E2E289','DFDF94','DBDB9E','D8D8A9','D4D4B4','D0D0BF','CDCDC9','C9C9D4','C6C6DF','C2C2EA','BFBFF4','BBBBFF');;\
my $counter = 42;;\
my $pct = 5;;\
for(my $i = 0;; $i < @sonne;; $i++) {\
Log 3, ("Time to sleep:$counter, Farbe:$sonne[$i], Dimm Level:$pct:");;\
if ($pct < 100) {$pct=$pct+5};;\
fhem("sleep ".$counter.";; set SZ.Spot rgb ".$sonne[$i].", SZ.Spot pct ".$pct.";;");;\
}\
}\


Mein Sonnenaufgang ist nach knapp 1 Sekunde zu Ende, sollte aber 30 min dauern. Das sleep wird schlicht ignoriert. Irgendeine Idee ?

Danke Andreas


kaihs

Du führst jedes
sleep x; set pct
als einzelnes fhem Kommando aus. Damit haben die keinen Bezug zueinander und werden quasi gleichzeitig ausgeführt.
Du muss ein langes fhem Kommando mit allen
sleep x; set pct; sleep x; set pct
aufbauen und dann einmal absetzen.

Sieht bei mir so aus (als sub in der 99_myUtils.pm):

sub myUtils_wakeuplight {
  my ($duration, $reverse, @lamps) = @_;
 
  $duration = 30*60 if !defined $duration;
  $reverse = 0 if !defined $reverse;
  @lamps = ('struc_sz_leds') if !@lamps;
 

      my @sonne = ('030100','0B0300','190601','230902','2F0D03','370F03','401204','481405','521806',
       '591007','622108','6E2508','772809','7F2A09','882D0A','90300A','96320A','9D330A','A6360A','B0390A',
       'B0450A','B9480B','C1580B','CB610B','D3650C','D6740C','DC770B','DC810B','E5860B','ED8E12','F2A113',
       'F2B013','F5B51A','F9BA22','FBBD29','FEC232','FFC742','FECC55','FED166','FDD473',
       'FDD880','FEDD8C','FDDF97','FDE4A7','FDEABC','FDEEC8','FDF0D1','FDF3DA','FCF4E2');
      my $sleepPerStep = $duration/$#sonne; # berücksichtigt nicht die Laufzeit der Lampenanweisungen
      #Log 1, "sleepPerStep $sleepPerStep";
      my $cmd = "";
      my $cancel = "";
      my $i = 1;
      my $lamp = "";
     
      if ($reverse) {
        @sonne = reverse @sonne;
      }

      foreach my $rgb (@sonne) {
        foreach $lamp (@lamps) {
          $cmd .= "set $lamp rgb $rgb;"; 
        }
        $cmd .= "sleep $sleepPerStep slwul_$i;" if ($i < $#sonne);
        $cancel .= "cancel slwul_$i quiet;;";
        $i++;
      }

      foreach $lamp (@lamps) {
        $cancel .= "set $lamp off;;"; 
        $cmd .= "set $lamp off" if $reverse;
      }
      # mglw. bereits laufendes WUL beenden
      fhem "cancel_wul";
      # alias cancel_wul neu anlegen
      fhem "defmod cancel_wul cmdalias cancel_wul AS $cancel";
      # WUL starten
      #Log 1, "cmd $cmd";
      fhem $cmd if $cmd ne "";

}
Banana Pi, Add-On Board mit 1.8" TFT LCD und IR-Sender, CULFW V1.61, div. Homematic Komponenten, Pollin Funksteckdosen, Selbstbau CUL433 MHz, Jeelink Clone, EC3000
Selbstbau CUL868MHz für Wireless M-Bus, SIGNALduino mit Logilink Temp.-sensoren und Auriol Wetterstation

Wzut

oder man macht sich klar das ein FHEM sleep in Wahrheit auch nur ein temporäres at ist und definiert sich das gleich selbst :) 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

KölnSolar

Pling ! Glühbirne an  ;D Du hast es mir klargemacht  ;D Jetzt kann ich auch den Unterschied zum Perl-sleep in meinem Kopf speichern  ;D
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

AB1970

Danke!
Was dann konkret heißt:

for(my $i = 0;; $i < 5;; $i++) {\
fhem("sleep "5";; set SZ.Spot rgb FFFFFF;;");;\
}\


setzt in diesem Fall nicht alle 5 Sekunden einen Befehl ab (und hält damit den Programmcode und FHEM an, wie beim Perl Sleep )
sondern direkt alle Befehle in 5 Sekunden, weil in diesem Fall 5 temporäre "at" defines mit einer Verzögerung von 5 Sekunden angelegt werden.