FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: rvideobaer am 02 Februar 2025, 19:37:24

Titel: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: rvideobaer am 02 Februar 2025, 19:37:24
Hallo,

ich habe das kleine Programm
use POSIX;

sub xmas(){
    #Der Totensonntag fällt immer auf einen Tag zwischen dem 20. Und 26. November.
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
    $month=10;
    $mday=20;
    ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(timelocal($sec,$min,$hour,$mday,$month,$year));
    if ($wday>0){
        $mday+=7-$wday;
    }
    #Montag nach Totensontag
    $mday+=1;
    my $totensonntag=timelocal(0,0,0,$mday,$month,$year);
    #Weihnachtsbeleuchtungsende ist am 1.Februar
    my $weihnachtsende=timelocal(59,59,23,1,2,$year);
    #War wenn vor dem 12.01 oder nach Totensonntag
    return gettimeofday()<$weihnachtsende ? 1 : gettimeofday() > $totensonntag ? 1 : 0;
}
benutzt um meine Weihnachtsbeleuchtung einzuschalten.
es wird dann mit dem folgenden doif getriggert.
(xmas == 1 and ([14:00-23:08|56] and [HM_Sensor:luminosity] < 12) or (xmas == 1 and ([14:00-22:08|01234] and [HM_Sensor:luminosity] < 12))) ((set L_Gruppe scene Weihnachten)) DOELSE ((set L_Gruppe scene Weihnachten_Aus))
jetzt sollte aber am 2. Februar schuss sein, leider wird die Beleuchtung aber immer noch eingeschaltet. Hat jemand eine Idee was ich hier falsch mache?

Gruß Rolf
Titel: Aw: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: rabehd am 02 Februar 2025, 19:46:55
Wann wird denn xmas() aufgerufen?
Titel: Aw: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: rvideobaer am 02 Februar 2025, 20:09:26
Hallo,

doch eigentlich immer wenn sich der wert "HM_Sensor:luminosity" ändert. Oder?

Gruß Rolf
Titel: Aw: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: betateilchen am 02 Februar 2025, 20:22:25
Es ist völlig egal, wann das aufgerufen wird.

Deine Berechnung für $weihnachtsende ist schlicht falsch, wenn Du den 1. Februar haben möchtest.

Mit Monat=2 in timelocal() berechnest Du den timestamp für den 1. März, weil die Zählung der Monate mit 0 beginnt.
Titel: Aw: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: rabehd am 02 Februar 2025, 20:28:44
Zitat von: rvideobaer am 02 Februar 2025, 20:09:26Hallo,

doch eigentlich immer wenn sich der wert "HM_Sensor:luminosity" ändert. Oder?

Gruß Rolf
Da bist Du Dir wohl nicht sicher?
Ich sehe da keine Neuberechnung getriggert durch dem Sensor.
Falls es durch das DOIF passiert, dann finde ich es nicht schön geschrieben.

Zitat von: betateilchen am 02 Februar 2025, 20:22:25Es ist völlig egal, wann das aufgerufen wird.

Hier egal, aber grundsätzlich sollte man auch wissen wann/wie
Titel: Aw: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: rvideobaer am 02 Februar 2025, 21:24:18
@betateilchen

Danke für den Hinweis habe es geändert. Ich hoffe das es jetzt funktioniert. Werde es dann am Jahresende merken ob er tut wie er soll.
Also nochmal Danke für den Hilfreichen Post.

Gruß Rolf
Titel: Aw: Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung
Beitrag von: betateilchen am 03 Februar 2025, 09:07:44
Zitat von: rvideobaer am 02 Februar 2025, 21:24:18Danke für den Hinweis habe es geändert. Ich hoffe das es jetzt funktioniert. Werde es dann am Jahresende merken ob er tut wie er soll.

Welcher Wert von xmas() zurückgeliefert wird, kannst Du doch jederzeit in Deinem FHEM testen, indem Du {xmas()} in die FHEM Befehlszeile oben eingibst. Da muss je nach Zeitpunkt eine 0 oder eine 1 zurückkommen.

Solchen Problemen auf die Schliche zu kommen, ist auch relativ einfach. Man baut sich einfach zum Testen ein paar passende Debug Ausgaben in den Code.

sub xmas(){
    #Der Totensonntag fällt immer auf einen Tag zwischen dem 20. Und 26. November.
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
    $month=10;
    $mday=20;
    ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(timelocal($sec,$min,$hour,$mday,$month,$year));
    if ($wday>0){
        $mday+=7-$wday;
    }
    #Montag nach Totensontag
    $mday+=1;
    my $totensonntag=timelocal(0,0,0,$mday,$month,$year);
Debug $totensonntag;
    #Weihnachtsbeleuchtungsende ist am 1.Februar
    my $weihnachtsende=timelocal(59,59,23,1,2,$year);
Debug $weihnachtsende;
Debug gettimeofday();
    #War wenn vor dem 12.01 oder nach Totensonntag
    return gettimeofday()<$weihnachtsende ? 1 : gettimeofday() > $totensonntag ? 1 : 0;
}

Damit bekommst Du beim Aufruf von xmas() drei Zahlen ins Log:

2025.02.02 20:16:02 1: DEBUG>1763938800       (das ist $totensonntag)
2025.02.02 20:16:02 1: DEBUG>1740869999       (das ist $weihnachtsende)
2025.02.02 20:16:02 1: DEBUG>1738523762.28387 (das ist gettimeofday())

Daran siehst Du auf einen Blick, dass $weihnachtsende noch nicht erreicht ist.

Dann gibst Du mal {localtime 1740869999} in die FHEM Befehlszeile ein, bekommst als Ergebnis

Sat Mar 1 23:59:59 2025
und schon weißt Du Bescheid, wo das Problem liegt...

Und danach bitte nicht vergessen, die Debug Meldungen wieder auszubauen 8)