From 06184d91ba18e45ab45da5583a61bf1797ae956f Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Mon, 6 Dec 2021 22:45:23 +0000 Subject: [PATCH] 93_DbRep: contrib v 8.46.0 git-svn-id: https://svn.fhem.de/fhem/trunk@25310 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/93_DbRep.pm | 127 +++++++++++++++++----------- 1 file changed, 79 insertions(+), 48 deletions(-) diff --git a/fhem/contrib/DS_Starter/93_DbRep.pm b/fhem/contrib/DS_Starter/93_DbRep.pm index d31f6f746..24405e2b1 100644 --- a/fhem/contrib/DS_Starter/93_DbRep.pm +++ b/fhem/contrib/DS_Starter/93_DbRep.pm @@ -57,6 +57,7 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch'; # Version History intern my %DbRep_vNotesIntern = ( + "8.46.0" => "06.12.2021 reduceLog options INCLUDE / EXCLUCE parse by parseParams ", "8.45.0" => "05.12.2021 revised userExitFn, fix average=day problem in reduceLog (Forum: https://forum.fhem.de/index.php/topic,53584.msg1177799.html#msg1177799) ", "8.44.1" => "27.11.2021 change diffValue: recognize if diff is 0 or no value available ", "8.44.0" => "21.11.2021 new attr numDecimalPlaces ", @@ -9018,16 +9019,13 @@ sub DbRep_reduceLog { } @a = @b; - my ($pa,$ph) = parseParams(join ' ', @a); # für späteren Einsatz ! - #Log3 ($name, 1, "DbRep $name -> parseParams pa: ".Dumper (bless $pa)); - #Log3 ($name, 1, "DbRep $name -> parseParams ph: ".Dumper (bless $ph)); + my ($pa,$ph) = parseParams(join ' ', @a); - my $avgstring = q{}; - if (defined($a[1])) { - $avgstring = ($a[1] =~ /average=day/i) ? 'AVERAGE=DAY' : - ($a[1] =~ /average/i) ? 'AVERAGE=HOUR' : - q{}; - } + my $avgstring = (@$pa[1] && @$pa[1] =~ /average/i) ? 'AVERAGE=HOUR' : + ($ph->{average} && $ph->{average} eq "day") ? 'AVERAGE=DAY' : + q{}; + + Log3 ($name, 2, "DbRep $name - DbRep_reduceLog Arraystr - $avgstring"); # Korrektur des Select-Zeitraums + eine Stunde # (Forum: https://forum.fhem.de/index.php/topic,53584.msg1177799.html#msg1177799) @@ -9036,13 +9034,11 @@ sub DbRep_reduceLog { my $splus = $avgstring =~ /AVERAGE/ ? 3600 : 0; $ots = strftime "%Y-%m-%d %H:%M:%S", localtime($epoche+$splus); - - if ($a[-1] =~ /^EXCLUDE=(.+:.+)+/i) { - ($filter) = $a[-1] =~ /^EXCLUDE=(.+)/i; - @excludeRegex = split(',',$filter); - } - elsif ($a[-1] =~ /^INCLUDE=.+:.+$/i) { - $filter = 1; + my $excludes = $ph->{EXCLUDE} // q{}; + my $includes = $ph->{INCLUDE} // q{}; + + if ($excludes) { + @excludeRegex = split(',',$excludes); } eval { $dbh = DBI->connect("dbi:$dbconn", $dbuser, $dbpassword, { PrintError => 0, @@ -9067,9 +9063,9 @@ sub DbRep_reduceLog { my $selspec = "SELECT TIMESTAMP,DEVICE,'',READING,VALUE FROM history where "; my $addon = "ORDER BY TIMESTAMP ASC"; - if($filter) { # Option EX/INCLUDE wurde angegeben + if($includes) { # Option EX/INCLUDE wurde angegeben $sql = "SELECT TIMESTAMP,DEVICE,'',READING,VALUE FROM history WHERE " - .($a[-1] =~ /^INCLUDE=(.+):(.+)$/i ? "DEVICE like '$1' AND READING like '$2' AND " : '') + .($includes =~ /^(.+):(.+)$/i ? "DEVICE like '$1' AND READING like '$2' AND " : '') ."TIMESTAMP <= '$ots'" .($nts ? " AND TIMESTAMP >= '$nts' " : " ") ."ORDER BY TIMESTAMP ASC"; @@ -9086,12 +9082,18 @@ sub DbRep_reduceLog { Log3 ($name, 4, "DbRep $name - SQL execute: $sql"); Log3 ($name, 3, "DbRep $name - reduceLog requested with options: " - .$avgstring - .($filter ? ((($avgstring && $filter) ? ", " : '').(uc((split('=',$a[-1]))[0]).'='.(split('=',$a[-1]))[1])) : - ((($idanz || $idevswc || $iranz || $irdswc) ? " INCLUDE -> " : ''). - (($idanz || $idevswc) ? "Devs: ".($idevs ? $idevs:'').($idevswc ? $idevswc : '') : '').(($iranz || $irdswc) ? " Readings: ".($ireading ? $ireading : '').($irdswc ? $irdswc : '') : ''). - (($edanz || $edevswc || $eranz || $erdswc) ? " EXCLUDE -> " : ''). - (($edanz || $edevswc) ? "Devs: ".($edevs ? $edevs : '').($edevswc ? $edevswc : '') : '').(($eranz || $erdswc) ? " Readings: ".($ereading ? $ereading:'').($erdswc ? $erdswc : '') : '')) )); + .$avgstring + ."\n" + .($includes ? "INCLUDE -> $includes " : + ((($idanz || $idevswc || $iranz || $irdswc) ? "INCLUDE -> " : '') + . (($idanz || $idevswc) ? "Devs: ".($idevs ? $idevs : '').($idevswc ? $idevswc : '').' ' : '').(($iranz || $irdswc) ? "Readings: ".($ireading ? $ireading : '').($irdswc ? $irdswc : '') : '') + )) + ."\n" + .($excludes ? "EXCLUDE -> $excludes " : + ((($edanz || $edevswc || $eranz || $erdswc) ? "EXCLUDE -> " : '') + . (($edanz || $edevswc) ? "Devs: ".($edevs ? $edevs : '').($edevswc ? $edevswc : '').' ' : '').(($eranz || $erdswc) ? "Readings: ".($ereading ? $ereading : '').($erdswc ? $erdswc : '') : '') + )) + ); my ($sth_del, $sth_upd, $sth_delD, $sth_updD, $sth_get); @@ -13562,12 +13564,17 @@ return; Method without option specification

- If no options are specified, the data will be reduced to one entry (the first) per hour per - device & reading within the time limits specified by the time.* attributes. + The data within the time limits defined by the time.* attributes will be + reduced to one entry (the first) per hour per device & reading. At least one of the time.* attributes must be set (see table below). The FullDay option (full days are always selected) is used implicitly. The respective missing time delimitation is calculated by the module in this case. - +

+ + By optionally specifying average, not only the database will be cleaned up, but + all numeric values of an hour are reduced to a single average value. + With the option average=day, all numeric values of a day are reduced to a single + average value (implies 'average').

With the attributes device and reading the data records to be considered can be included @@ -13595,28 +13602,28 @@ return; Examples: