Probleme beim Lichtwecker Eindimmen (Brightness) lässt sich nicht abbrechen

Begonnen von ConRod, 08 Juni 2020, 21:26:58

Vorheriges Thema - Nächstes Thema

ConRod

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 :)

amenomade

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;;




Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

ConRod

Vielen herzlichen Dank.
Mit den Hinweisen habe ich es hinbekommen.
Ich weiß auch nicht, warum mir das nicht sofort ins Auge gefallen ist....