2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-28 17:12:32 +00:00

93_DbLog: contrib 5.10.3

git-svn-id: https://svn.fhem.de/fhem/trunk@29391 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2024-12-01 21:42:45 +00:00
parent 76441bd06a
commit 98d1b779d2

View File

@ -1,5 +1,5 @@
############################################################################################################################## ##############################################################################################################################
# $Id: 93_DbLog.pm 28345 2024-01-05 19:46:43Z DS_Starter $ # $Id: 93_DbLog.pm 29036 2024-07-21 20:47:25Z DS_Starter $
############################################################################################################################## ##############################################################################################################################
# 93_DbLog.pm # 93_DbLog.pm
# written by Dr. Boris Neubert 2007-12-30 # written by Dr. Boris Neubert 2007-12-30
@ -54,12 +54,14 @@ use Encode qw(encode_utf8);
use HttpUtils; use HttpUtils;
use SubProcess; use SubProcess;
no if $] >= 5.017011, warnings => 'experimental::smartmatch';
use vars qw($FW_ME $FW_subdir); # predeclare global variable names use vars qw($FW_ME $FW_subdir); # predeclare global variable names
# Version History intern by DS_Starter: # Version History intern by DS_Starter:
my %DbLog_vNotesIntern = ( my %DbLog_vNotesIntern = (
"5.10.3" => "01.12.2024 check valid Time limit 1970-01-01 00:00:00 of Event time, Forum: #139847 ",
"5.10.2" => "21.07.2024 _DbLog_copyCache: Copy process changed to minimize memory usage after reopen ",
"5.10.1" => "01.04.2024 _DbLog_plotData: avoid possible uninitialized value \$out_value (SVG: Argument '' isn't numeric) ".
"replace Smartmatch Forum:#137776 ",
"5.10.0" => "17.03.2024 support of MariaDB driver, optimize Timer execMemCacheAsync, optimize DbLog_configcheck,_DbLog_SBP_connectDB ". "5.10.0" => "17.03.2024 support of MariaDB driver, optimize Timer execMemCacheAsync, optimize DbLog_configcheck,_DbLog_SBP_connectDB ".
"remove countNbl, support compression between client and server, improved performance if attr excludeDevs is set ". "remove countNbl, support compression between client and server, improved performance if attr excludeDevs is set ".
"Fix _DbLog_plotData Forum: https://forum.fhem.de/index.php?topic=136930.0 ", "Fix _DbLog_plotData Forum: https://forum.fhem.de/index.php?topic=136930.0 ",
@ -821,14 +823,13 @@ sub _DbLog_setaddLog { ## no critic "not used"
} }
my @args = @{$argsref}; my @args = @{$argsref};
my $nce = grep (/\!useExcludes/, @args) ? 1 : 0;
my $nce = ("\!useExcludes" ~~ @args) ? 1 : 0;
map (s/\!useExcludes//g, @args); map (s/\!useExcludes//g, @args);
my $cn; my $cn;
if(/CN=/ ~~ @args) { if (grep (/CN=/, @args)) {
my $t = join " ", @args; my $t = join " ", @args;
($cn) = ($t =~ /^.*CN=(\w+).*$/); ($cn) = ($t =~ /^.*CN=(\w+).*$/);
map(s/CN=$cn//g, @args); map(s/CN=$cn//g, @args);
@ -881,12 +882,10 @@ sub _DbLog_setaddCacheLine { ## no critic "not used"
return "Syntax error in set $opt command. Use this line format: YYYY-MM-DD HH:MM:SS|<device>|<type>|<event>|<reading>|<value>|[<unit>] "; return "Syntax error in set $opt command. Use this line format: YYYY-MM-DD HH:MM:SS|<device>|<type>|<event>|<reading>|<value>|[<unit>] ";
} }
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($i_timestamp =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); my $err = DbLog_checkValidTime ($i_timestamp);
eval { my $ts = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); };
if ($@) { if ($err) {
my @l = split /at/, $@; return "Timestamp is out of range: $err";
return "Timestamp is out of range - $l[0]";
} }
DbLog_addCacheLine ( { hash => $hash, DbLog_addCacheLine ( { hash => $hash,
@ -1216,7 +1215,7 @@ sub DbLog_Log {
} }
} }
my ($event,$reading,$value,$unit,$err,$DoIt); my ($event, $reading, $value, $unit, $err, $DoIt, $epoch_seconds_begin);
my $memcount = 0; my $memcount = 0;
my $re = $hash->{REGEXP}; my $re = $hash->{REGEXP};
@ -1403,14 +1402,13 @@ sub DbLog_Log {
next; next;
} }
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($TIMESTAMP =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); $err = DbLog_checkValidTime ($TIMESTAMP);
eval { my $epoch_seconds_begin = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); }; if ($err) {
if (!$@) { Log3 ($name, 2, "$name - TIMESTAMP >$TIMESTAMP< got from DbLogValueFn in $dev_name is invalid: $err");
$timestamp = $TIMESTAMP;
} }
else { else {
Log3 ($name, 2, "$name - TIMESTAMP got from DbLogValueFn in $dev_name is invalid: $TIMESTAMP"); $timestamp = $TIMESTAMP;
} }
$reading = $READING if($READING ne ''); $reading = $READING if($READING ne '');
@ -1448,14 +1446,13 @@ sub DbLog_Log {
next; next;
} }
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($TIMESTAMP =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); $err = DbLog_checkValidTime ($TIMESTAMP);
eval { my $epoch_seconds_begin = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); }; if ($err) {
if (!$@) { Log3 ($name, 2, "$name - Parameter TIMESTAMP >$TIMESTAMP< got from valueFn is invalid: $err");
$timestamp = $TIMESTAMP;
} }
else { else {
Log3 ($name, 2, "$name - Parameter TIMESTAMP got from valueFn is invalid: $TIMESTAMP"); $timestamp = $TIMESTAMP;
} }
$dev_name = $DEVICE if($DEVICE ne ''); $dev_name = $DEVICE if($DEVICE ne '');
@ -1466,6 +1463,13 @@ sub DbLog_Log {
$event = $EVENT if(defined $EVENT); $event = $EVENT if(defined $EVENT);
} }
$err = DbLog_checkValidTime ($timestamp);
if ($err) {
Log3 ($name, 2, "$name - timestamp >$timestamp< is invalid: ".$err.". The dataset is ignored.");
next;
}
# Daten auf maximale Länge beschneiden # Daten auf maximale Länge beschneiden
($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);
@ -2048,12 +2052,11 @@ sub _DbLog_copyCache {
while (my ($key, $val) = each %{$data{DbLog}{$name}{cache}{memcache}} ) { while (my ($key, $val) = each %{$data{DbLog}{$name}{cache}{memcache}} ) {
$memc->{cdata}{$key} = $val; # Subprocess Daten, z.B.: 2022-11-29 09:33:32|SolCast|SOLARFORECAST||nextCycletime|09:33:47| $memc->{cdata}{$key} = $val; # Subprocess Daten, z.B.: 2022-11-29 09:33:32|SolCast|SOLARFORECAST||nextCycletime|09:33:47|
delete $data{DbLog}{$name}{cache}{memcache}{$key};
} }
$memc->{cdataindex} = $data{DbLog}{$name}{cache}{index}; # aktuellen Index an Subprozess übergeben $memc->{cdataindex} = $data{DbLog}{$name}{cache}{index}; # aktuellen Index an Subprozess übergeben
undef %{$data{DbLog}{$name}{cache}{memcache}}; # Löschen mit 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/
return $memc; return $memc;
} }
@ -3262,7 +3265,7 @@ sub _DbLog_SBP_onRun_LogArray {
__DbLog_SBP_sendToParent ($subprocess, $ret); __DbLog_SBP_sendToParent ($subprocess, $ret);
return; return $error;
}; };
_DbLog_SBP_dbhRaiseError ($dbh); _DbLog_SBP_dbhRaiseError ($dbh);
@ -3977,7 +3980,7 @@ sub _DbLog_SBP_onRun_importCachefile {
if (!$error && $nins_hist && keys %{$rowlback}) { if (!$error && $nins_hist && keys %{$rowlback}) {
_DbLog_SBP_Log3Parent ( { name => $name, _DbLog_SBP_Log3Parent ( { name => $name,
level => 2, level => 2,
msg => "WARNING - $nins_hist datasets from $infile were not imported:", msg => "WARNING - $nins_hist datasets from $infile were not imported.",
oper => 'log3parent', oper => 'log3parent',
subprocess => $subprocess subprocess => $subprocess
} }
@ -6887,7 +6890,7 @@ sub _DbLog_plotData {
} }
else { # generating plots else { # generating plots
$out_tstamp =~ s/\ /_/g; # needed by generating plots $out_tstamp =~ s/\ /_/g; # needed by generating plots
$retval .= "$out_tstamp $out_value\n"; $retval .= "$out_tstamp $out_value\n" if(defined $out_value); # V 5.10.1
$retval .= $retvaldummy; $retval .= $retvaldummy;
} }
} }
@ -8023,7 +8026,7 @@ sub DbLog_AddLog {
my ($dev_type,$dev_name,$dev_reading,$read_val,$event,$ut); my ($dev_type,$dev_name,$dev_reading,$read_val,$event,$ut);
my $memcount; my $memcount;
my $ts; my ($ts, $err);
return if(IsDisabled($name) || !$hash->{HELPER}{COLSET} || $init_done != 1); return if(IsDisabled($name) || !$hash->{HELPER}{COLSET} || $init_done != 1);
@ -8129,7 +8132,6 @@ sub DbLog_AddLog {
my $ctz = AttrVal($name, 'convertTimezone', 'none'); # convert time zone my $ctz = AttrVal($name, 'convertTimezone', 'none'); # convert time zone
if($ctz ne 'none') { if($ctz ne 'none') {
my $err;
my $params = { my $params = {
name => $name, name => $name,
dtstring => $ts, dtstring => $ts,
@ -8173,14 +8175,13 @@ sub DbLog_AddLog {
next; next;
} }
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($TIMESTAMP =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); $err = DbLog_checkValidTime ($TIMESTAMP);
eval { my $epoch_seconds_begin = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); }; if ($err) {
if (!$@) { Log3 ($name, 2, "$name - Parameter TIMESTAMP >$TIMESTAMP< got from valueFn is invalid: $err");
$ts = $TIMESTAMP;
} }
else { else {
Log3 ($name, 2, "$name - Parameter TIMESTAMP got from valueFn is invalid: $TIMESTAMP"); $ts = $TIMESTAMP;
} }
$dev_name = $DEVICE if($DEVICE ne ''); $dev_name = $DEVICE if($DEVICE ne '');
@ -8289,14 +8290,13 @@ sub DbLog_addCacheLine {
next; next;
} }
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($TIMESTAMP =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/); my $err = DbLog_checkValidTime ($TIMESTAMP);
eval { my $epoch_seconds_begin = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); }; if ($err) {
if (!$@) { Log3 ($name, 2, "$name - Parameter TIMESTAMP >$TIMESTAMP< got from valueFn is invalid: $err");
$i_timestamp = $TIMESTAMP;
} }
else { else {
Log3 ($name, 2, "$name - Parameter TIMESTAMP got from valueFn is invalid: $TIMESTAMP"); $i_timestamp = $TIMESTAMP;
} }
$i_dev = $DEVICE if($DEVICE ne ''); $i_dev = $DEVICE if($DEVICE ne '');
@ -8797,6 +8797,31 @@ sub DbLog_checkTimeformat {
return; return;
} }
#################################################################
# valide Zeitangabe prüfen
#################################################################
sub DbLog_checkValidTime {
my $timestamp = shift;
my $esb;
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($timestamp =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/);
eval { $esb = timelocal ($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); };
if ($@) {
my @l = split /at/, $@;
return $l[0];
}
$esb = fhemTimeLocal ($sec, $min, $hh, $dd, $mm-1, $yyyy-1900);
if ($esb <= 0) {
return "Time limit undershot: $esb";
}
return;
}
################################################################ ################################################################
# Versionierungen des Moduls setzen # Versionierungen des Moduls setzen
# Die Verwendung von Meta.pm und Packages wird berücksichtigt # Die Verwendung von Meta.pm und Packages wird berücksichtigt
@ -8812,13 +8837,13 @@ sub DbLog_setVersionInfo {
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { # META-Daten sind vorhanden if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { # META-Daten sind vorhanden
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{DbLog}{META}} $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{DbLog}{META}}
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbLog.pm 28345 2024-01-05 19:46:43Z DS_Starter $ im Kopf komplett! vorhanden ) if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbLog.pm 29036 2024-07-21 20:47:25Z DS_Starter $ im Kopf komplett! vorhanden )
$modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/xsg; $modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/xsg;
} }
else { else {
$modules{$type}{META}{x_version} = $v; $modules{$type}{META}{x_version} = $v;
} }
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbLog.pm 28345 2024-01-05 19:46:43Z DS_Starter $ im Kopf komplett! vorhanden ) return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbLog.pm 29036 2024-07-21 20:47:25Z DS_Starter $ im Kopf komplett! vorhanden )
if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) {
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden # mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden