From b982651f8cc31c8dc16c2bf124aa9f8bb46608cc Mon Sep 17 00:00:00 2001 From: Beta-User <> Date: Tue, 9 Jul 2019 16:52:45 +0000 Subject: [PATCH] 98_WeekdayTimer.pm: support for h2we entries weekEnd and noWeekEnd git-svn-id: https://svn.fhem.de/fhem/trunk@19806 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/98_WeekdayTimer.pm | 75 +++++++++++++++++++++++------------- 2 files changed, 50 insertions(+), 27 deletions(-) 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()}
  • 7,$we weekend ($we)
  • 8,!$we weekday (!$we)

  • - It is possible to define $we or !$we in daylist to easily allow weekend an holiday. $we !$we are coded as 7 8, when using a numeric daylist.

    + It is possible to define $we or !$we in daylist to easily allow weekend an holiday. $we !$we are coded as 7 8, when using a numeric daylist.
    + Note: $we will use general IsWe() function to determine $we handling for today and tomorrow. The complete daylist for all other days will reflect the results of holiday devices listed as holiday2we devices in global, including weekEnd and noWeekEnd (see global - holiday2we attribute).

    time:define the time to switch, format: HH:MM:[SS](HH in 24 hour format) or a Perlfunction like {sunrise_abs()}. Within the {} you can use the variable $date(epoch) to get the exact switchingtimes of the week. Example: {sunrise_abs_dat($date)}

    parameter:the parameter to be set, using any text value like on, off, dim30%, eco or comfort - whatever your device understands.
    NOTE: Use ":" to replace blanks in parameter and escape ":" in case you need it. So e.g. 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
    +    
         WDT_Params [one of: single, WDT_Group or all]

    Examples: