[ASC] Bug? Adventssteuerung endet nicht zu Lichtmess (02. Februar)

Begonnen von sukram, 06 Februar 2026, 19:56:20

Vorheriges Thema - Nächstes Thema

sukram

Hallo zusammen,

nachdem meine Rollos nach Lichtmess nicht wieder in den "normalen" Fahrplan zurückwechseln wollten, habe ich mal etwas experimentiert.
Wenn im ASC-Device "attr myASControl ASC_advEndDate EpiphanyDay" gesetzt ist, läuft nach dem 6. Januar alles normal - Rollos werden wieder zu den eingestellten Zeiten gefahren. Stelle ich das Attribut auf "CandlemassDay", werden auch nach den 2. Februar die Rollos offen gehalten.

Daraufhin bin ich mal in den Code eingestiegen und habe in der Helper.pm folgenden Code identifiziert, der für mich einen Logikfehler enthält. Soweit ich das verstehe, rechnet die "localtime()" Funktion die Monate ab 0, d.h. Januar = 0, Februar = 1, März = 2, usw. Demnach würde die Logik $adv = $month = 1 || ( $month = 2 && $monthday < 3 ) ? 1 : 0; erst im März wieder auf Normalbetrieb schalten. Evtl. auch nicht, je nahdem, ob die Logik noch Klammern zum Funktionieren braucht.

Daher habe ich das entsprechend mal angepasst und warte morgen Abend ab, ob das dann auch funktioniert.

Hier die angepasste Funktion IsAdv:

Helper.pm
sub IsAdv {
    use HTTP::Date;
    my ( undef, undef, undef, $monthday, $month, $year, undef, undef, undef ) =
      localtime( ::gettimeofday() );
    my $adv = 0;
    $year += 1900;

    if (   $month < 1
        && $FHEM::Automation::ShuttersControl::ascDev->getAdvEndDate eq
        'EpiphanyDay' )
    {
        $adv = $monthday < 7 ? 1 : 0;
    }
    elsif ($month < 2
        && $FHEM::Automation::ShuttersControl::ascDev->getAdvEndDate eq
        'CandlemasDay' )
    {
######### Logikfehler im original, Klammern ergaenzt, Monat off by 1
        #$adv = $month = 1 || ( $month = 2 && $monthday < 3 ) ? 1 : 0;
        $adv = ($month = 0 || ( $month = 1 && $monthday < 3 )) ? 1 : 0;
    }
    else {
        my $time = str2time( $year . '-12-25' );
        my $wday = ( localtime($time) )[6];
        $wday = $wday ? $wday : 7;
        $time -= (
            $FHEM::Automation::ShuttersControl::ascDev->getAdvStartDate eq
              'DeadSunday'
            ? ( $wday + 27 ) * 86400
            : ( $wday + 21 ) * 86400
        );
        $adv = 1 if ( $time < time );
    }

    return $adv;
}

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net