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;
}
Bin gespannt. Ich verfolge das mal hier