FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: AB1970 am 04 Januar 2018, 15:01:03

Titel: [gelöst] Sleep wird ignoriert
Beitrag von: AB1970 am 04 Januar 2018, 15:01:03
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

Titel: Antw:Sleep wird ignoriert
Beitrag von: kaihs am 04 Januar 2018, 21:14:08
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 "";

}
Titel: Antw:Sleep wird ignoriert
Beitrag von: Wzut am 05 Januar 2018, 09:23:24
oder man macht sich klar das ein FHEM sleep in Wahrheit auch nur ein temporäres at ist und definiert sich das gleich selbst :) 
Titel: Antw:Sleep wird ignoriert
Beitrag von: KölnSolar am 05 Januar 2018, 09:26:08
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
Titel: Antw:Sleep wird ignoriert
Beitrag von: AB1970 am 05 Januar 2018, 18:32:45
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.