diff --git a/fhem/contrib/DS_Starter/93_DbRep.pm b/fhem/contrib/DS_Starter/93_DbRep.pm index 4626e398a..c48d0957c 100644 --- a/fhem/contrib/DS_Starter/93_DbRep.pm +++ b/fhem/contrib/DS_Starter/93_DbRep.pm @@ -8954,9 +8954,6 @@ sub DbRep_reduceLog { } Log3 ($name, 5, "DbRep $name -> Start DbLog_reduceLog"); - - my (%hourlyKnown,%averageHash,@excludeRegex,@dayRows,@averageUpd,@averageUpdD); - my ($startTime,$currentHour,$currentDay,$deletedCount,$updateCount,$rowCount,$excludeCount) = (time(),99,0,0,0,0,0); BlockingInformParent("DbRep_delHashValFromBlocking", [$name, "HELPER","REDUCELOG"], 1); @@ -8972,22 +8969,23 @@ sub DbRep_reduceLog { my ($pa,$ph) = parseParams(join ' ', @a); - my $mode = (@$pa[1] && @$pa[1] =~ /average/i) ? 'average=hour' : - ($ph->{average} && $ph->{average} eq "day") ? 'average=day' : + my $mode = (@$pa[1] && @$pa[1] =~ /average/i) ? 'average' : + ($ph->{average} && $ph->{average} eq "day") ? 'average=day' : q{}; # Korrektur des Select-Zeitraums + eine Stunde # (Forum: https://forum.fhem.de/index.php/topic,53584.msg1177799.html#msg1177799) - my ($yyyy, $mm, $dd, $hh, $min, $sec) = $ots =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/x; - my $epoche = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); - my $splus = $mode =~ /average/i ? 3600 : 0; - $ots = strftime "%Y-%m-%d %H:%M:%S", localtime($epoche+$splus); + #my ($yyyy, $mm, $dd, $hh, $min, $sec) = $ots =~ /(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+)/x; + #my $epoche = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); + #my $splus = $mode =~ /average/i ? 3600 : 0; + #$ots = strftime "%Y-%m-%d %H:%M:%S", localtime($epoche+$splus); my $excludes = $ph->{EXCLUDE} // q{}; my $includes = $ph->{INCLUDE} // q{}; + my @excludeRegex; if ($excludes) { - @excludeRegex = split(',',$excludes); + @excludeRegex = split ',', $excludes; } my ($dbh, $dbmodel); @@ -9032,7 +9030,7 @@ sub DbRep_reduceLog { $sql = DbRep_createCommonSql ($specs); } - Log3 ($name, 3, "DbRep $name - reduce data older than: $ots (logical corrected), newer than: $nts"); + Log3 ($name, 3, "DbRep $name - reduce data older than: $ots, newer than: $nts"); Log3 ($name, 3, "DbRep $name - reduceLog requested with options: " .($mode ? "\n".$mode : '') @@ -9074,7 +9072,11 @@ sub DbRep_reduceLog { # $row->[3] = Reading # $row->[4] = Value + my $ndp = AttrVal($name, "numDecimalPlaces", $dbrep_defdecplaces); + my ($day,$hour, $processingDay); + my (%hourlyKnown,%averageHash,@dayRows,@averageUpd,@averageUpdD); + my ($startTime,$currentHour,$currentDay,$deletedCount,$updateCount,$rowCount,$excludeCount) = (time(),99,0,0,0,0,0); do { my $row = $sth_get->fetchrow_arrayref || ['0000-00-00 00:00:00','D','','R','V']; # || execute last-day dummy @@ -9095,13 +9097,13 @@ sub DbRep_reduceLog { my $params = { name => $name, - day => $day, dbh => $dbh, sth_del => $sth_del, table => $table, dayRowsref => \@dayRows, deletedCountref => \$deletedCount, - processingDay => $processingDay + processingDay => $processingDay, + ndp => $ndp }; $err = _DbRep_rl_deleteDayRows ($params); @@ -9114,7 +9116,6 @@ sub DbRep_reduceLog { my $params = { name => $name, - day => $day, dbh => $dbh, sth_upd => $sth_upd, mode => $mode, @@ -9123,7 +9124,8 @@ sub DbRep_reduceLog { averageUpdref => \@averageUpd, averageUpdDref => \@averageUpdD, updateCountref => \$updateCount, - processingDay => $processingDay + processingDay => $processingDay, + ndp => $ndp }; $err = _DbRep_rl_average ($params); @@ -9144,7 +9146,8 @@ sub DbRep_reduceLog { averageHashref => \%averageHash, deletedCountref => \$deletedCount, updateCountref => \$updateCount, - processingDay => $processingDay + processingDay => $processingDay, + ndp => $ndp }; $err = _DbRep_rl_averageDay ($params); @@ -9174,12 +9177,12 @@ sub DbRep_reduceLog { $currentHour = $hour; } - if (defined $hourlyKnown{$device.$reading}) { # remember first readings for device per h, other can be deleted + if (defined $hourlyKnown{$device.$reading}) { # das erste reading pro device und Stunde wird nicht in @dayRows (zum Löschen) gespeichert, die anderen können gelöscht werden push(@dayRows, [@$row]); if ($mode =~ /average/i && defined($value) && - $value =~ /^-?(?:\d+(?:\.\d*)?|\.\d+)$/ && + DbRep_IsNumeric ($value) && $hourlyKnown{$device.$reading}->[0]) { if ($hourlyKnown{$device.$reading}->[0]) { @@ -9198,8 +9201,8 @@ sub DbRep_reduceLog { $excludeCount++ if($day != 00); } else { - $hourlyKnown{$device.$reading} = (defined($value) && $value =~ /^-?(?:\d+(?:\.\d*)?|\.\d+)$/) ? - [$ts,$device,$row->[2],$reading,[$value]] : + $hourlyKnown{$device.$reading} = DbRep_IsNumeric ($value) ? + [$ts,$device,$row->[2],$reading,[$value]] : [0]; } } @@ -9233,7 +9236,6 @@ return "$name|$err|$ret|$brt"; sub _DbRep_rl_deleteDayRows { my $paref = shift; my $name = $paref->{name}; - my $day = $paref->{day}; my $dbh = $paref->{dbh}; my $sth_del = $paref->{sth_del}; my $table = $paref->{table}; @@ -9311,7 +9313,6 @@ return $err; sub _DbRep_rl_average { my $paref = shift; my $name = $paref->{name}; - my $day = $paref->{day}; my $dbh = $paref->{dbh}; my $sth_upd = $paref->{sth_upd}; my $mode = $paref->{mode}; @@ -9321,6 +9322,7 @@ sub _DbRep_rl_average { my $averageUpdDref = $paref->{averageUpdDref}; my $updateCountref = $paref->{updateCountref}; my $processingDay = $paref->{processingDay}; + my $ndp = $paref->{ndp}; my $err = q{}; @@ -9362,7 +9364,7 @@ sub _DbRep_rl_average { $sum += $val; } - my $average = sprintf '%.3f', $sum / scalar @{$hourHash->{$hourKey}->[4]}; + my $average = sprintf "%.${ndp}f", $sum / scalar @{$hourHash->{$hourKey}->[4]}; $sum = 0; Log3 ($name, 4, "DbRep $name - UPDATE $table SET TIMESTAMP=$updDate $updHour:30:00, EVENT='rl_av_h', VALUE=$average WHERE DEVICE=$hourHash->{$hourKey}->[1] AND READING=$hourHash->{$hourKey}->[3] AND TIMESTAMP=$hourHash->{$hourKey}->[0] AND VALUE=$hourHash->{$hourKey}->[4]->[0]"); @@ -9424,6 +9426,7 @@ sub _DbRep_rl_averageDay { my $deletedCountref = $paref->{deletedCountref}; my $updateCountref = $paref->{updateCountref}; my $processingDay = $paref->{processingDay}; + my $ndp = $paref->{ndp}; my $err = q{}; @@ -9462,7 +9465,7 @@ sub _DbRep_rl_averageDay { Log3 ($name, 3, "DbRep $name - reduceLog (daily-average) updating ".(keys %{$averageHashref}).", deleting $c records of day: $processingDay") if(keys %{$averageHashref}); for my $rdng (keys %{$averageHashref}) { - my $average = sprintf '%.3f', ${$averageHashref}{$rdng}->{sum} / scalar @{${$averageHashref}{$rdng}->{tedr}}; + my $average = sprintf "%.${ndp}f", ${$averageHashref}{$rdng}->{sum} / scalar @{${$averageHashref}{$rdng}->{tedr}}; my $lastUpdH = pop @{${$averageHashref}{$rdng}->{tedr}}; for (@{${$averageHashref}{$rdng}->{tedr}}) { @@ -9487,9 +9490,12 @@ sub _DbRep_rl_averageDay { $sth_updD->execute( ${$averageHashref}{$rdng}->{date}." 12:00:00", 'rl_av_d', $average, $lastUpdH->[2], $lastUpdH->[3], $lastUpdH->[0] ); $iu++; + if($iu == $thu) { - my $prog = $ku * $id; + my $prog = $ku * $id; + Log3 ($name, 3, "DbRep $name - reduceLog (daily-average) updating progress of day: $processingDay is: $prog"); + $iu = 0; $ku++; } @@ -12627,6 +12633,21 @@ sub DbRep_numval { return $val; } +################################################################ +# Prüfung auf numerischen Wert (vorzeichenbehaftet) +################################################################ +sub DbRep_IsNumeric { + my $val = shift // q{empty}; + + my $ret = 0; + + if($val =~ /^-?(?:\d+(?:\.\d*)?|\.\d+)$/xs) { + $ret = 1; + } + +return $ret; +} + ################################################################ # entfernt führende Mullen einer Zahl ################################################################ @@ -14307,14 +14328,15 @@ return; @@ -17124,14 +17146,15 @@ return;