FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ConRod am 08 Juni 2020, 21:26:58

Titel: Probleme beim Lichtwecker Eindimmen (Brightness) lässt sich nicht abbrechen
Beitrag von: ConRod am 08 Juni 2020, 21:26:58
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 :)
Titel: Antw:Probleme beim Lichtwecker Eindimmen (Brightness) lässt sich nicht abbrechen
Beitrag von: amenomade am 09 Juni 2020, 00:08:38
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;;




Titel: Antw:Probleme beim Lichtwecker Eindimmen (Brightness) lässt sich nicht abbrechen
Beitrag von: ConRod am 09 Juni 2020, 14:45:20
Vielen herzlichen Dank.
Mit den Hinweisen habe ich es hinbekommen.
Ich weiß auch nicht, warum mir das nicht sofort ins Auge gefallen ist....