mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 03:06:37 +00:00
93_DbLog: patch delta-d,delta-h forum: #msg1242272
git-svn-id: https://svn.fhem.de/fhem/trunk@26672 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
86ae43a74d
commit
2630ed3dbf
@ -1,5 +1,6 @@
|
|||||||
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
|
# 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.
|
# Do not insert empty lines here, update check depends on it.
|
||||||
|
- bugfix: 93_DbLog: patch delta-d,delta-h forum: #msg1242272
|
||||||
- bugfix: 73_GasCalculator : SiPowerPrefix was 1000 too small
|
- bugfix: 73_GasCalculator : SiPowerPrefix was 1000 too small
|
||||||
- bugfix: 73_ElectricityCalculator : Seconds per day considering DST
|
- bugfix: 73_ElectricityCalculator : Seconds per day considering DST
|
||||||
- bugfix: 73_GasCalculator : Seconds per day considering DST
|
- bugfix: 73_GasCalculator : Seconds per day considering DST
|
||||||
|
@ -31,6 +31,8 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
|
|||||||
|
|
||||||
# Version History intern by DS_Starter:
|
# Version History intern by DS_Starter:
|
||||||
my %DbLog_vNotesIntern = (
|
my %DbLog_vNotesIntern = (
|
||||||
|
"4.13.2" => "06.11.2022 Patch Delta calculation (delta-d,delta-h) https://forum.fhem.de/index.php/topic,129975.msg1242272.html#msg1242272 ",
|
||||||
|
"4.13.1" => "16.10.2022 edit commandref ",
|
||||||
"4.13.0" => "15.04.2022 new Attr convertTimezone, minor fixes in reduceLog(NbL) ",
|
"4.13.0" => "15.04.2022 new Attr convertTimezone, minor fixes in reduceLog(NbL) ",
|
||||||
"4.12.7" => "08.03.2022 \$data{firstvalX} doesn't work, forum: https://forum.fhem.de/index.php/topic,126631.0.html ",
|
"4.12.7" => "08.03.2022 \$data{firstvalX} doesn't work, forum: https://forum.fhem.de/index.php/topic,126631.0.html ",
|
||||||
"4.12.6" => "17.01.2022 change log message deprecated to outdated, forum:#topic,41089.msg1201261.html#msg1201261 ",
|
"4.12.6" => "17.01.2022 change log message deprecated to outdated, forum:#topic,41089.msg1201261.html#msg1201261 ",
|
||||||
@ -1542,8 +1544,8 @@ sub DbLog_Log {
|
|||||||
$DoIt = 0 if(!$v2[1] && $reading =~ m,^$v2[0]$,); # Reading matcht auf Regexp, kein MinIntervall angegeben
|
$DoIt = 0 if(!$v2[1] && $reading =~ m,^$v2[0]$,); # Reading matcht auf Regexp, kein MinIntervall angegeben
|
||||||
|
|
||||||
if(($v2[1] && $reading =~ m,^$v2[0]$,) && ($v2[1] =~ m/^(\d+)$/)) { # Regexp matcht und MinIntervall ist angegeben
|
if(($v2[1] && $reading =~ m,^$v2[0]$,) && ($v2[1] =~ m/^(\d+)$/)) { # Regexp matcht und MinIntervall ist angegeben
|
||||||
my $lt = $defs{$dev_hash->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME};
|
my $lt = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{TIME};
|
||||||
my $lv = $defs{$dev_hash->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE};
|
my $lv = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE};
|
||||||
$lt = 0 if(!$lt);
|
$lt = 0 if(!$lt);
|
||||||
$lv = "" if(!defined $lv); # Forum: #100344
|
$lv = "" if(!defined $lv); # Forum: #100344
|
||||||
$force = ($v2[2] && $v2[2] =~ /force/i) ? 1 : 0; # Forum: #97148
|
$force = ($v2[2] && $v2[2] =~ /force/i) ? 1 : 0; # Forum: #97148
|
||||||
@ -1566,8 +1568,8 @@ sub DbLog_Log {
|
|||||||
$DoIt = 1 if($reading =~ m,^$v2[0]$,); # Reading matcht auf Regexp
|
$DoIt = 1 if($reading =~ m,^$v2[0]$,); # Reading matcht auf Regexp
|
||||||
|
|
||||||
if(($v2[1] && $reading =~ m,^$v2[0]$,) && ($v2[1] =~ m/^(\d+)$/)) { # Regexp matcht und MinIntervall ist angegeben
|
if(($v2[1] && $reading =~ m,^$v2[0]$,) && ($v2[1] =~ m/^(\d+)$/)) { # Regexp matcht und MinIntervall ist angegeben
|
||||||
my $lt = $defs{$dev_hash->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME};
|
my $lt = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{TIME};
|
||||||
my $lv = $defs{$dev_hash->{NAME}}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE};
|
my $lv = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE};
|
||||||
$lt = 0 if(!$lt);
|
$lt = 0 if(!$lt);
|
||||||
$lv = "" if(!defined $lv); # Forum: #100344
|
$lv = "" if(!defined $lv); # Forum: #100344
|
||||||
$force = ($v2[2] && $v2[2] =~ /force/i)?1:0; # Forum: #97148
|
$force = ($v2[2] && $v2[2] =~ /force/i)?1:0; # Forum: #97148
|
||||||
@ -1585,10 +1587,10 @@ sub DbLog_Log {
|
|||||||
$DoIt = DbLog_checkDefMinInt($name,$dev_name,$now,$reading,$value);
|
$DoIt = DbLog_checkDefMinInt($name,$dev_name,$now,$reading,$value);
|
||||||
|
|
||||||
if ($DoIt) {
|
if ($DoIt) {
|
||||||
my $lastt = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME}; # patch Forum:#111423
|
my $lastt = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{TIME}; # patch Forum:#111423
|
||||||
my $lastv = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE};
|
my $lastv = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE};
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $now;
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{TIME} = $now;
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $value;
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE} = $value;
|
||||||
|
|
||||||
# Device spezifische DbLogValueFn-Funktion anwenden
|
# Device spezifische DbLogValueFn-Funktion anwenden
|
||||||
if($DbLogValueFn ne '') {
|
if($DbLogValueFn ne '') {
|
||||||
@ -1607,11 +1609,11 @@ sub DbLog_Log {
|
|||||||
Log3 $name, 2, "DbLog $name -> error device \"$dev_name\" specific DbLogValueFn: ".$@ if($@);
|
Log3 $name, 2, "DbLog $name -> error device \"$dev_name\" specific DbLogValueFn: ".$@ if($@);
|
||||||
|
|
||||||
if($IGNORE) { # aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt
|
if($IGNORE) { # aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $lastt if($lastt); # patch Forum:#111423
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{TIME} = $lastt if($lastt); # patch Forum:#111423
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $lastv if(defined $lastv);
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE} = $lastv if(defined $lastv);
|
||||||
|
|
||||||
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"}) {
|
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"}) {
|
||||||
Log3 $hash->{NAME}, 4, "DbLog $name -> Event ignored by device \"$dev_name\" specific DbLogValueFn - TS: $timestamp, Device: $dev_name, Type: $dev_type, Event: $event, Reading: $reading, Value: $value, Unit: $unit";
|
Log3 $name, 4, "DbLog $name -> Event ignored by device \"$dev_name\" specific DbLogValueFn - TS: $timestamp, Device: $dev_name, Type: $dev_type, Event: $event, Reading: $reading, Value: $value, Unit: $unit";
|
||||||
}
|
}
|
||||||
|
|
||||||
next;
|
next;
|
||||||
@ -1650,11 +1652,11 @@ sub DbLog_Log {
|
|||||||
Log3 $name, 2, "DbLog $name -> error valueFn: ".$@ if($@);
|
Log3 $name, 2, "DbLog $name -> error valueFn: ".$@ if($@);
|
||||||
|
|
||||||
if($IGNORE) { # aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt
|
if($IGNORE) { # aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $lastt if($lastt); # patch Forum:#111423
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{TIME} = $lastt if($lastt); # patch Forum:#111423
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $lastv if(defined $lastv);
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE} = $lastv if(defined $lastv);
|
||||||
|
|
||||||
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"}) {
|
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"}) {
|
||||||
Log3 $hash->{NAME}, 4, "DbLog $name -> Event ignored by valueFn - TS: $timestamp, Device: $dev_name, Type: $dev_type, Event: $event, Reading: $reading, Value: $value, Unit: $unit";
|
Log3 $name, 4, "DbLog $name -> Event ignored by valueFn - TS: $timestamp, Device: $dev_name, Type: $dev_type, Event: $event, Reading: $reading, Value: $value, Unit: $unit";
|
||||||
}
|
}
|
||||||
|
|
||||||
next;
|
next;
|
||||||
@ -1681,7 +1683,7 @@ sub DbLog_Log {
|
|||||||
($dev_name,$dev_type,$event,$reading,$value,$unit) = DbLog_cutCol($hash,$dev_name,$dev_type,$event,$reading,$value,$unit);
|
($dev_name,$dev_type,$event,$reading,$value,$unit) = DbLog_cutCol($hash,$dev_name,$dev_type,$event,$reading,$value,$unit);
|
||||||
|
|
||||||
my $row = ($timestamp."|".$dev_name."|".$dev_type."|".$event."|".$reading."|".$value."|".$unit);
|
my $row = ($timestamp."|".$dev_name."|".$dev_type."|".$event."|".$reading."|".$value."|".$unit);
|
||||||
Log3 $hash->{NAME}, 4, "DbLog $name -> added event - Timestamp: $timestamp, Device: $dev_name, Type: $dev_type, Event: $event, Reading: $reading, Value: $value, Unit: $unit"
|
Log3 $name, 4, "DbLog $name -> added event - Timestamp: $timestamp, Device: $dev_name, Type: $dev_type, Event: $event, Reading: $reading, Value: $value, Unit: $unit"
|
||||||
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"});
|
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"});
|
||||||
|
|
||||||
if($async) { # asynchoner non-blocking Mode
|
if($async) { # asynchoner non-blocking Mode
|
||||||
@ -1698,7 +1700,7 @@ sub DbLog_Log {
|
|||||||
my $lmlr = $hash->{HELPER}{LASTLIMITRUNTIME};
|
my $lmlr = $hash->{HELPER}{LASTLIMITRUNTIME};
|
||||||
my $syncival = AttrVal($name, "syncInterval", 30);
|
my $syncival = AttrVal($name, "syncInterval", 30);
|
||||||
if(!$lmlr || gettimeofday() > $lmlr+($syncival/2)) {
|
if(!$lmlr || gettimeofday() > $lmlr+($syncival/2)) {
|
||||||
Log3 $hash->{NAME}, 4, "DbLog $name -> Number of cache entries reached cachelimit $clim - start database sync.";
|
Log3 $name, 4, "DbLog $name -> Number of cache entries reached cachelimit $clim - start database sync.";
|
||||||
DbLog_execmemcache ($hash);
|
DbLog_execmemcache ($hash);
|
||||||
$hash->{HELPER}{LASTLIMITRUNTIME} = gettimeofday();
|
$hash->{HELPER}{LASTLIMITRUNTIME} = gettimeofday();
|
||||||
}
|
}
|
||||||
@ -1789,7 +1791,7 @@ sub DbLog_checkDefMinInt {
|
|||||||
my $lv = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE};
|
my $lv = $defs{$dev_name}{Helper}{DBLOG}{$reading}{$name}{VALUE};
|
||||||
$lt = 0 if(!$lt);
|
$lt = 0 if(!$lt);
|
||||||
$lv = "" if(!defined $lv); # Forum: #100344
|
$lv = "" if(!defined $lv); # Forum: #100344
|
||||||
$force = ($adefelem[2] && $adefelem[2] =~ /force/i)?1:0; # Forum: #97148
|
$force = ($adefelem[2] && $adefelem[2] =~ /force/i) ? 1 : 0; # Forum: #97148
|
||||||
|
|
||||||
if(($now-$lt < $adefelem[1]) && ($lv eq $value || $force)) {
|
if(($now-$lt < $adefelem[1]) && ($lv eq $value || $force)) {
|
||||||
# innerhalb defaultMinInterval und LastValue=Value oder force-Option
|
# innerhalb defaultMinInterval und LastValue=Value oder force-Option
|
||||||
@ -2432,7 +2434,7 @@ sub DbLog_execmemcache {
|
|||||||
push (@row_array, delete($data{DbLog}{$name}{cache}{memcache}{$key}));
|
push (@row_array, delete($data{DbLog}{$name}{cache}{memcache}{$key}));
|
||||||
}
|
}
|
||||||
|
|
||||||
delete $data{DbLog}{$name}{cache}{memcache}; # sicherheitshalber Memory freigeben: https://perlmaven.com/undef-on-perl-arrays-and-hashes , bzw. https://www.effectiveperlprogramming.com/2018/09/undef-a-scalar-to-release-its-memory/
|
undef $data{DbLog}{$name}{cache}{memcache}; # sicherheitshalber Memory freigeben: https://perlmaven.com/undef-on-perl-arrays-and-hashes , bzw. https://www.effectiveperlprogramming.com/2018/09/undef-a-scalar-to-release-its-memory/
|
||||||
|
|
||||||
my $rowlist = join('§', @row_array);
|
my $rowlist = join('§', @row_array);
|
||||||
$rowlist = encode_base64($rowlist,"");
|
$rowlist = encode_base64($rowlist,"");
|
||||||
@ -3899,12 +3901,15 @@ sub DbLog_Get {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$out_value = sprintf("%g", $maxval - $minval);
|
$writeout = 1 if($minval != (~0 >> 1) && $maxval != -(~0 >> 1)); # geändert V4.8.0 / 14.10.2019
|
||||||
|
$out_value = ($writeout == 1) ? sprintf("%g", $maxval - $minval) : 0; # if there was no previous reading in the selected time range, produce a null delta, %g - a floating-point number
|
||||||
|
|
||||||
$sum[$i] += $out_value;
|
$sum[$i] += $out_value;
|
||||||
$cnt[$i]++;
|
$cnt[$i]++;
|
||||||
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, $lasttstamp{hour}, "30", "00");
|
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, $lasttstamp{hour}, "30", "00");
|
||||||
$writeout = 1 if($minval != (~0 >> 1) && $maxval != -(~0 >> 1)); # geändert V4.8.0 / 14.10.2019
|
|
||||||
$minval = $maxval;
|
$minval = $maxval if($maxval != -(~0 >> 1)); # only use the current range's maximum as the new minimum if a proper value was found
|
||||||
|
|
||||||
Log3 ($name, 5, "$name - Output delta-h -> TS: $tstamp{hour}, LASTTS: $lasttstamp{hour}, OUTTS: $out_tstamp, OUTVAL: $out_value, WRITEOUT: $writeout");
|
Log3 ($name, 5, "$name - Output delta-h -> TS: $tstamp{hour}, LASTTS: $lasttstamp{hour}, OUTTS: $out_tstamp, OUTVAL: $out_value, WRITEOUT: $writeout");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3918,14 +3923,15 @@ sub DbLog_Get {
|
|||||||
%lasttstamp = DbLog_explode_datetime($lastd[$i], ());
|
%lasttstamp = DbLog_explode_datetime($lastd[$i], ());
|
||||||
}
|
}
|
||||||
|
|
||||||
if("$tstamp{day}" ne "$lasttstamp{day}") {
|
if("$tstamp{day}" ne "$lasttstamp{day}") { # Aenderung des Tages, berechne Delta
|
||||||
# Aenderung des Tages, berechne Delta
|
$writeout = 1 if($minval != (~0 >> 1) && $maxval != -(~0 >> 1)); # geändert V4.8.0 / 14.10.2019
|
||||||
$out_value = sprintf("%g", $maxval - $minval); # %g - a floating-point number
|
$out_value = ($writeout == 1) ? sprintf("%g", $maxval - $minval) : 0; # if there was no previous reading in the selected time range, produce a null delta, %g - a floating-point number
|
||||||
$sum[$i] += $out_value;
|
$sum[$i] += $out_value;
|
||||||
$cnt[$i]++;
|
$cnt[$i]++;
|
||||||
|
|
||||||
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, "12", "00", "00");
|
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, "12", "00", "00");
|
||||||
$writeout = 1 if($minval != (~0 >> 1) && $maxval != -(~0 >> 1)); # geändert V4.8.0 / 14.10.2019
|
$minval = $maxval if($maxval != -(~0 >> 1)); # only use the current range's maximum as the new minimum if a proper value was found
|
||||||
$minval = $maxval;
|
|
||||||
Log3 ($name, 5, "$name - Output delta-d -> TS: $tstamp{day}, LASTTS: $lasttstamp{day}, OUTTS: $out_tstamp, OUTVAL: $out_value, WRITEOUT: $writeout");
|
Log3 ($name, 5, "$name - Output delta-d -> TS: $tstamp{day}, LASTTS: $lasttstamp{day}, OUTTS: $out_tstamp, OUTVAL: $out_value, WRITEOUT: $writeout");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4024,7 +4030,9 @@ sub DbLog_Get {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
%lasttstamp = DbLog_explode_datetime($lastd[$i], ());
|
%lasttstamp = DbLog_explode_datetime($lastd[$i], ());
|
||||||
$out_value = sprintf("%g", $maxval - $minval);
|
|
||||||
|
$out_value = ($minval != (~0 >> 1) && $maxval != -(~0 >> 1)) ? sprintf("%g", $maxval - $minval) : 0; # if there was no previous reading in the selected time range, produce a null delta
|
||||||
|
|
||||||
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, $lasttstamp{hour}, "30", "00") if($readings[$i]->[3] eq "delta-h");
|
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, $lasttstamp{hour}, "30", "00") if($readings[$i]->[3] eq "delta-h");
|
||||||
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, "12", "00", "00") if($readings[$i]->[3] eq "delta-d");
|
$out_tstamp = DbLog_implode_datetime($lasttstamp{year}, $lasttstamp{month}, $lasttstamp{day}, "12", "00", "00") if($readings[$i]->[3] eq "delta-d");
|
||||||
}
|
}
|
||||||
@ -4061,6 +4069,9 @@ sub DbLog_Get {
|
|||||||
|
|
||||||
# Ueberfuehren der gesammelten Werte in die globale Variable %data
|
# Ueberfuehren der gesammelten Werte in die globale Variable %data
|
||||||
for(my $j=0; $j<int(@readings); $j++) {
|
for(my $j=0; $j<int(@readings); $j++) {
|
||||||
|
$min[$j] = 0 if ($min[$j] == (~0 >> 1)); # if min/max values could not be calculated due to the lack of query results, set them to 0
|
||||||
|
$max[$j] = 0 if ($max[$j] == -(~0 >> 1));
|
||||||
|
|
||||||
my $k = $j+1;
|
my $k = $j+1;
|
||||||
$data{"min$k"} = $min[$j];
|
$data{"min$k"} = $min[$j];
|
||||||
$data{"max$k"} = $max[$j];
|
$data{"max$k"} = $max[$j];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user