2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-01 15:44:52 +00:00

98_statistics: fix dst at month end bug (#123815)

git-svn-id: https://svn.fhem.de/fhem/trunk@26152 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Beta-User 2022-06-16 05:45:59 +00:00
parent fb4dcaa0d7
commit 626d6512fd

View File

@ -316,6 +316,7 @@ sub statistics_PeriodChange($)
# Determine the next day change time
my @th=localtime();
my $now = gettimeofday();
my $dayChangeDelay = 0;
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) {
@ -323,13 +324,15 @@ sub statistics_PeriodChange($)
if ($dayChangeDelay == 0) { $dayChangeTime += 24*3600; } # Otherwise it would always lay in the past
$dayChangeTime += $dayChangeDelay - $periodChangePreset;
}
my $dstcorr = HOURSECONDS * ((localtime($now - DAYSECONDS))[8] - $th[8]);
$dayChangeTime += $dstcorr;
RemoveInternalTimer($hash);
# Run period change procedure each full hour ("periodChangePreset" second before).
my $periodEndTime = 3600 * ( int((gettimeofday()+$periodChangePreset)/3600) + 1 ) - $periodChangePreset ;
my $periodEndTime = 3600 * ( int(($now+$periodChangePreset)/3600) + 1 ) - $periodChangePreset ;
# Run procedure also for given dayChangeTime
$val = "";
if ( gettimeofday()<$dayChangeTime && $dayChangeTime<=$periodEndTime ) {
if ( $now<$dayChangeTime && $dayChangeTime<=$periodEndTime ) {
$periodEndTime = $dayChangeTime;
$val = " (Day Change)";
}
@ -360,16 +363,17 @@ sub statistics_PeriodChange($)
# get time values for 50 seconds before a new day
($dummy, $dummy, $hourLast, $dayLast, $monthLast, $yearLast) = localtime ($curPeriodChangeTime - $dayChangeDelay + $periodChangePreset - 59);
# get time values for next day
($dummy, $dummy, $hourNow, $dayNow, $monthNow, $yearNow) = localtime (gettimeofday() + $periodChangePreset);
($dummy, $dummy, $hourNow, $dayNow, $monthNow, $yearNow) = localtime ($now + $periodChangePreset);
$periodSwitch = -2;
if ($yearNow != $yearLast) { $periodSwitch = -4; }
elsif ($monthNow != $monthLast) { $periodSwitch = -3; }
# Positiv Value if periode changes at full hour
$periodSwitch = abs($periodSwitch) if $dayChangeDelay % 3600 == 0;
} else {
($dummy, $dummy, $hourLast, $dummy, $dummy, $dummy) = localtime (gettimeofday());
($dummy, $dummy, $hourNow, $dummy, $dummy, $dummy) = localtime (gettimeofday() + $periodChangePreset);
if ($hourNow != $hourLast) {
($dummy, $dummy, $hourLast, $dummy, $dummy) = localtime($now);
($dummy, $dummy, $hourNow , $dummy, $dummy) = localtime($now + $periodChangePreset);
if ( $hourNow != $hourLast
|| $hourNow == $hourLast && $th[8] != (localtime($now - $dstcorr + $periodChangePreset))[8]) {
$periodSwitch = 1;
statistics_Log $hash,4,"Calculating hour change";
} else {