Hallo,
Ich habe auf Basis des Codes von https://forum.fhem.de/index.php?topic=67645.0 versucht einen Licht-Wecker mit meinen Müller-Licht Tint Lampen zu bauen.
Im Gegensatz zum Original-Code wo die Lampen einfach plötzlich einschalten, möchte ich, dass sich die Lampen langsam eindimmen.
Das ganze funktioniert auch eigentlich, allerdings funktioniert der "Abbruch" durch cancel_wul nur, wenn die Eindimm Phase abgeschlossen ist.
Könnt ihr mir einen Tip geben, was ich falsch mache?
sub myUtils_wakup() {
my $cmd = "";
my @lamps = ('szlampe', 'szlampe2');
# increase brightness in 10 steps
for (my $j=1; $j < 255; $j = $j + 10){
foreach $lamp (@lamps) {
$cmd .= "sleep 1 slwul_$lamp$j; set $lamp brightness $j;";
$cancel .= "cancel slwul_$lamp$j quiet;;";
}
}
# set all lamps to brightness 255
$j++;
foreach $lamp (@lamps) {
$cmd .= "sleep 1 slwul_$lamp$j; set $lamp brightness 255;";
}
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 $dauer = 15 * 60; # 15 Minuten
my $sleepPerStep = $dauer/@sonne;
foreach my $rgb (@sonne) {
foreach $lamp (@lamps) {
$cmd .= "set $lamp color $rgb;";
$cmd .= "sleep $sleepPerStep slwul_$j;";
}
$cancel .= "cancel slwul_$j quiet;;";
$j++;
}
fhem "cancel_wul";
# alias cancel_wul neu anlegen
fhem "defmod cancel_wul cmdalias cancel_wul AS $cancel";
# WUL starten
fhem $cmd if $cmd ne "";
}
Herzlichen Dank für jeden Hinweis :)
Der original Code baut parallel:
- eine kette für $cmd, die genannte sleep Timers enthält
- eine kette für $cancel, die diese sleep Timers löscht.
Also folgendes ist ok:
foreach $lamp (@lamps) {
$cmd .= "sleep 1 slwul_$lamp$j; set $lamp brightness $j;";
$cancel .= "cancel slwul_$lamp$j quiet;;";
}
Aber danach machst Du nicht mehr beide parallel. Am Ende ist dein $cancel Befehl nicht passend zu den $cmd Befehl.
Dazu kommt irgendwann ein
$j++;
Ein $i = 1; hätte das gleiche Ergebnis. Das führt dazu, dass deine Befehle mit Brightness 255 wiederum die Namen slwul_szlampe1 und slwul_szlampe21 benutzen.
Und Du hast noch das Problem, dass eine deiner Lampen eine Nummer am Ende hat. Das heisst slwul_szlampe2 in step 1 und szlampe in step 2 (mit Zähler 21) haben den gleichen Name, sprich slwul_szlampe21.
Usw...
Ergebnis (ich habe auf 3 steps im ersten for, und nur 3 Farben im 2. reduziert, damit man was sieht): $cmd:
sleep 1 slwul_szlampe1; set szlampe brightness 1;
sleep 1 slwul_szlampe21; set szlampe2 brightness 1; #1. Mal lampe21 (das ist lampe2 mit Zähler 1)
sleep 1 slwul_szlampe11; set szlampe brightness 11;
sleep 1 slwul_szlampe211; set szlampe2 brightness 11; #bisher war alles OK
sleep 1 slwul_szlampe21; set szlampe brightness 21; #hier wieder 21 (das ist lampe mit Zähler 21)
sleep 1 slwul_szlampe221; set szlampe2 brightness 21;
sleep 1 slwul_szlampe1; set szlampe brightness 255;
sleep 1 slwul_szlampe21; set szlampe2 brightness 255; # und noch eine 21
set szlampe color 030100;
sleep 0.333333333333333 slwul_1;set szlampe2 color 030100;
sleep 0.333333333333333 slwul_1;set szlampe color 0B0300;
sleep 0.333333333333333 slwul_2;set szlampe2 color 0B0300;
sleep 0.333333333333333 slwul_2;set szlampe color 190601;
sleep 0.333333333333333 slwul_3;set szlampe2 color 190601;
sleep 0.333333333333333 slwul_3;
Man sieht schon, dass die sleep Timers sich überschreiben.
Ergebnis $cancel:
cancel slwul_szlampe1 quiet;;
cancel slwul_szlampe21 quiet;;
cancel slwul_szlampe11 quiet;;
cancel slwul_szlampe211 quiet;;
cancel slwul_szlampe21 quiet;;
cancel slwul_szlampe221 quiet;;
cancel slwul_1 quiet;;
cancel slwul_2 quiet;;
cancel slwul_3 quiet;;
Vielen herzlichen Dank.
Mit den Hinweisen habe ich es hinbekommen.
Ich weiß auch nicht, warum mir das nicht sofort ins Auge gefallen ist....