diff --git a/fhem/CHANGED b/fhem/CHANGED index 8a30db5a4..d72bf1e46 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 98_WeekdayTimer now supports holiday2we entries + weekEnd and noWeekEnd - bugfix: 71_YAMAHA_NP: fixed 'timerRepeat' - new: 76_SMAPortal: new module to integrate the SMA Sunny Portal (comes with 76_SMAPortalSPG graphic device and a diff --git a/fhem/FHEM/98_WeekdayTimer.pm b/fhem/FHEM/98_WeekdayTimer.pm index 83081b70a..8922895fa 100644 --- a/fhem/FHEM/98_WeekdayTimer.pm +++ b/fhem/FHEM/98_WeekdayTimer.pm @@ -102,14 +102,18 @@ sub WeekdayTimer_Set($@) { my ($hash, @a) = @_; return "no set value specified" if(int(@a) < 2); - return "Unknown argument $a[1], choose one of enable disable WDT_Params:single,WDT_Group,all" if($a[1] eq "?"); + return "Unknown argument $a[1], choose one of enable:noArg disable:noArg WDT_Params:single,WDT_Group,all" if($a[1] eq "?"); my $name = shift @a; my $v = join(" ", @a); if ($v eq "enable") { Log3 ($hash, 3, "[$name] set $name $v"); - CommandAttr(undef, "$name disable 0"); + if (AttrVal($name, "disable", 0)) { + CommandAttr(undef, "$name disable 0"); + } else { + WeekdayTimer_SetTimerOfDay({ HASH => $hash}); + } } elsif ($v eq "disable") { Log3 $hash, 3, "[$name] set $name $v"; CommandAttr(undef, "$name disable 1"); @@ -194,7 +198,7 @@ sub WeekdayTimer_Define($$) { $hash->{NAME} = $name; $hash->{DEVICE} = $device; - + my @switchingtimes = WeekdayTimer_gatherSwitchingTimes ($hash, \@a); my $conditionOrCommand = join (" ", @a); @@ -254,9 +258,13 @@ sub WeekdayTimer_Profile($) { push (@listeDerTage, WeekdayTimer_getListeDerTage($d, $time)) if ($d>=7); map { my $day = $_; - my $dayOfEchteZeit = $day; - $dayOfEchteZeit = ($wday>=1&&$wday<=5) ? 6 : $wday if ($day==7); # ggf. Samstag $wday ~~ [1..5] + my $dayOfEchteZeit = $day; + unless (AttrVal('global', 'holiday2we', '') =~ m,\bweekEnd\b,|| $day > 6 ) { $dayOfEchteZeit = ($wday==0||$wday==6) ? 1 : $wday if ($day==8); # ggf. Montag $wday ~~ [0, 6] + $dayOfEchteZeit = ($wday>=1&&$wday<=5) ? 6 : $wday if ($day==7); # ggf. Samstag $wday ~~ [1..5] + } else { + $dayOfEchteZeit = $wday; + } my $echtZeit = WeekdayTimer_EchteZeit($hash, $dayOfEchteZeit, $time); $hash->{profile} {$day}{$echtZeit} = $parameter; $hash->{profile_IDX}{$day}{$echtZeit} = $idx; @@ -298,9 +306,12 @@ sub WeekdayTimer_getListeDerTage($$) { my ($d, $time) = @_; my %hdays=(); - @hdays{(0, 6)} = undef if ($d==7); # sa,so ( $we) - @hdays{(1..5)} = undef if ($d==8); # mo-fr (!$we) - + unless (AttrVal('global', 'holiday2we', '') =~ m,\bweekEnd\b,) { + @hdays{(0, 6)} = undef if ($d==7); # sa,so ( $we) + @hdays{(1..5)} = undef if ($d==8); # mo-fr (!$we) + } else { + @hdays{(0..6)} = undef if ($d==8); # mo-fr (!$we) + } my $wday; my $now = time(); my ($sec,$min,$hour,$mday,$mon,$year,$nowWday,$yday,$isdst) = localtime($now); @@ -308,31 +319,36 @@ sub WeekdayTimer_getListeDerTage($$) { my @realativeWdays = (0..6); for (my $i=0;$i<=6;$i++) { - my $relativeDay = $i-$nowWday; + my $relativeDay = $i-$nowWday; #Log 3, "relativeDay------------>$relativeDay"; - my ($stunde, $minute, $sekunde) = split (":",$time); + my ($stunde, $minute, $sekunde) = split (":",$time); - my $echteZeit = WeekdayTimer_zeitErmitteln ($now, $stunde, $minute, $sekunde, $relativeDay); + my $echteZeit = WeekdayTimer_zeitErmitteln ($now, $stunde, $minute, $sekunde, $relativeDay); #Log 3, "echteZeit---$i---->>>$relativeDay<<<----->".FmtDateTime($echteZeit); - ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($echteZeit); + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($echteZeit); - foreach my $h2we (split(',', AttrVal('global', 'holiday2we', ''))) { - if($h2we) { - my $ergebnis = 'none'; - if (InternalVal($h2we, 'TYPE', '') eq "holiday") { + my $noWeekEnd = 0; + my $ergebnis = 'none'; + if ($wday==$nowWday ){ + $ergebnis = "is_true" if IsWe(); + } elsif ( $wday==$nowWday+1) { + $ergebnis = "is_true" if IsWe("tomorrow"); + } else { + foreach my $h2we (split(',', AttrVal('global', 'holiday2we', ''))) { + if($h2we && ( $ergebnis eq 'none' || $h2we eq "noWeekEnd" ) && InternalVal($h2we, 'TYPE', '') eq "holiday" && !$noWeekEnd) { $ergebnis = CommandGet(undef,$h2we . ' ' . sprintf("%02d-%02d",$mon+1,$mday)); - } elsif ($wday==$nowWday ){ - $ergebnis = "is_true" if IsWe(); - }elsif ( $wday==$nowWday+1){ - $ergebnis = "is_true" if IsWe("tomorrow"); - } - if ($ergebnis ne 'none') { - #Log 3, "ergebnis-------$i----->$ergebnis"; - $hdays{$i} = undef if ($d==7); # $we Tag aufnehmen - delete $hdays{$i} if ($d==8); # !$we Tag herausnehmen + if ($ergebnis ne 'none' && $h2we eq "noWeekEnd") { + $ergebnis = 'none'; + $noWeekEnd = 1; + } } } } + if ($ergebnis ne 'none') { + #Log 3, "ergebnis-------$i----->$ergebnis"; + $hdays{$i} = undef if ($d==7||AttrVal('global', 'holiday2we', '') =~ m,\bweekEnd\b,); # $we Tag aufnehmen + delete $hdays{$i} if ($d==8); # !$we Tag herausnehmen + } } #Log 3, "result------------>" . join (" ", sort keys %hdays); @@ -904,7 +920,9 @@ sub WeekdayTimer_FensterOffen ($$$) { Log3 $hash, 4, "[$name] delayedExecutionCond:$verzoegerteAusfuehrungCond"; my $verzoegerteAusfuehrung = eval($verzoegerteAusfuehrungCond); - Log3 $hash, 4, "[$name] result of delayedExecutionCond:$verzoegerteAusfuehrung"; + + my $logtext = $verzoegerteAusfuehrung // 'no condition attribute set'; + Log3 $hash, 4, "[$name] result of delayedExecutionCond: $logtext"; if ($verzoegerteAusfuehrung) { if (!defined($hash->{VERZOEGRUNG})) { @@ -1152,6 +1170,7 @@ sub WeekdayTimer_SetAllParms(;$) { # {WeekdayTimer_SetAllParms()} Log3 undef, 3, "WeekdayTimer_SetAllParms() done on: ".join(" ",@wdtNames ); } + 1; =pod @@ -1214,7 +1233,8 @@ sub WeekdayTimer_SetAllParms(;$) { # {WeekdayTimer_SetAllParms()}
on-till:06\:00
will be a valid parameter.
@@ -1290,6 +1310,7 @@ sub WeekdayTimer_SetAllParms(;$) { # {WeekdayTimer_SetAllParms()}
disable # disables the Weekday_Timer enable # enables the Weekday_Timer +