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
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 "";
}
oder man macht sich klar das ein FHEM sleep in Wahrheit auch nur ein temporäres at ist und definiert sich das gleich selbst :)
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
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.