diff --git a/fhem/FHEM/98_statistics.pm b/fhem/FHEM/98_statistics.pm index 90bf0c6de..18d3d5c0c 100644 --- a/fhem/FHEM/98_statistics.pm +++ b/fhem/FHEM/98_statistics.pm @@ -250,7 +250,8 @@ statistics_PeriodChange($) my $name = $hash->{NAME}; my $dummy; my $val; - my $periodChangePreset = AttrVal($name, "periodChangePreset", 10); + my $periodChangePreset = AttrVal($name, "periodChangePreset", 5); + my $isDayChange = ( ReadingsVal($name, "nextPeriodChangeCalc", "") =~ /Day Change/ ); # Determine the next day change time my @th=localtime(); @@ -258,7 +259,7 @@ statistics_PeriodChange($) my $dayChangeTime = timelocal(0,0,0,$th[3],$th[4],$th[5]+1900); if (AttrVal($name, "dayChangeTime", "00:00") =~ /(\d+):(\d+)/ && $1<24 && $1 >=0 && $2<60 && $2>=0) { $dayChangeDelay = $1 * 3600 + $2 * 60; - $dayChangeTime += $dayChangeDelay; + $dayChangeTime += $dayChangeDelay - $periodChangePreset; } RemoveInternalTimer($hash); @@ -266,7 +267,7 @@ statistics_PeriodChange($) my $periodEndTime = 3600 * ( int((gettimeofday()+1800)/3600) + 1 ) - $periodChangePreset ; # Run procedure also for given dayChangeTime $val = ""; - if ( gettimeofday() < $dayChangeTime && $dayChangeTime < $periodEndTime) { + if ( $dayChangeDelay>0 && gettimeofday()<$dayChangeTime && $dayChangeTime<=$periodEndTime ) { $periodEndTime = $dayChangeTime; $val = " (Day Change)"; } @@ -280,22 +281,33 @@ statistics_PeriodChange($) # Determine if time period switched (day, month, year) # Get deltaValue and Tariff of previous call - my $periodSwitch = 1; + my $periodSwitch = 0; my $yearLast; my $monthLast; my $dayLast; - my $minuteNow; + my $hourLast; my $hourNow; my $dayNow; my $monthNow; my $yearNow; - ($dummy, $dummy, $dummy, $dayLast, $monthLast, $yearLast) = localtime (gettimeofday() - 1800); - ($dummy, $minuteNow, $hourNow, $dayNow, $monthNow, $yearNow) = localtime (gettimeofday() + 1800); - - if ($yearNow != $yearLast) { $periodSwitch = 4; } - elsif ($monthNow != $monthLast) { $periodSwitch = 3; } - elsif ($dayNow != $dayLast) { $periodSwitch = 2; } + if ($dayChangeDelay>0) { + if ($isDayChange) { + ($dummy, $dummy, $hourLast, $dayLast, $monthLast, $yearLast) = localtime (gettimeofday() - $dayChangeDelay); + ($dummy, $dummy, $hourNow, $dayNow, $monthNow, $yearNow) = localtime (gettimeofday() + $periodEndTime); + if ($yearNow != $yearLast) { $periodSwitch = -4; } + elsif ($monthNow != $monthLast) { $periodSwitch = -3; } + elsif ($dayNow != $dayLast) { $periodSwitch = -2; } + if ($dayChangeDelay % 3600 == 0) { $periodSwitch = abs($periodSwitch); } + } + } else { + ($dummy, $dummy, $hourLast, $dayLast, $monthLast, $yearLast) = localtime (gettimeofday() - 1800); + ($dummy, $dummy, $hourNow, $dayNow, $monthNow, $yearNow) = localtime (gettimeofday() + 1800); + if ($yearNow != $yearLast) { $periodSwitch = 4; } + elsif ($monthNow != $monthLast) { $periodSwitch = 3; } + elsif ($dayNow != $dayLast) { $periodSwitch = 2; } + elsif ($hourNow != $hourLast) { $periodSwitch = 1; } + } statistics_DoStatisticsAll $hash, $periodSwitch; @@ -587,7 +599,7 @@ statistics_doStatisticDelta ($$$$$) # Determine if "since" value has to be shown in current and last reading # If change of year, change yearly statistic - if ($periodSwitch == 4) { + if ($periodSwitch == 4 || $periodSwitch == -4) { $last[7] = sprintf "%.".$decPlaces."f", $stat[7]; $stat[7] = 0; if ($showDate == 1) { $showDate = 0; } # Do not show the "since:" value for year changes anymore @@ -595,7 +607,7 @@ statistics_doStatisticDelta ($$$$$) Log3 $name,4,"$name: Shifting current year in last value of '$statReadingName'."; } # If change of month, change monthly statistic - if ($periodSwitch >= 3){ + if ($periodSwitch >= 3 || $periodSwitch <= -3){ $last[5] = sprintf "%.".$decPlaces."f", $stat[5]; $stat[5] = 0; if ($showDate == 3) { $showDate = 2; } # Do not show the "since:" value for month changes anymore @@ -603,7 +615,7 @@ statistics_doStatisticDelta ($$$$$) Log3 $name,4,"$name: Shifting current month in last value of '$statReadingName'."; } # If change of day, change daily statistic - if ($periodSwitch >= 2){ + if ($periodSwitch >= 2 || $periodSwitch <= -2){ $last[3] = $stat[3]; $stat[3] = 0; if ($showDate == 5) { $showDate = 4; } # Do not show the "since:" value for day changes anymore @@ -827,12 +839,13 @@ statistics_FormatDuration($) + Further readings can be added via the correspondent attribut.
 
@@ -867,15 +880,32 @@ statistics_FormatDuration($) Attributes