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:
parent
76441bd06a
commit
98d1b779d2
@ -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
|
||||
# written by Dr. Boris Neubert 2007-12-30
|
||||
@ -54,12 +54,14 @@ use Encode qw(encode_utf8);
|
||||
use HttpUtils;
|
||||
use SubProcess;
|
||||
|
||||
no if $] >= 5.017011, warnings => 'experimental::smartmatch';
|
||||
|
||||
use vars qw($FW_ME $FW_subdir); # predeclare global variable names
|
||||
|
||||
# Version History intern by DS_Starter:
|
||||
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 ".
|
||||
"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 ",
|
||||
@ -821,14 +823,13 @@ sub _DbLog_setaddLog { ## no critic "not used"
|
||||
}
|
||||
|
||||
my @args = @{$argsref};
|
||||
|
||||
my $nce = ("\!useExcludes" ~~ @args) ? 1 : 0;
|
||||
my $nce = grep (/\!useExcludes/, @args) ? 1 : 0;
|
||||
|
||||
map (s/\!useExcludes//g, @args);
|
||||
|
||||
my $cn;
|
||||
|
||||
if(/CN=/ ~~ @args) {
|
||||
if (grep (/CN=/, @args)) {
|
||||
my $t = join " ", @args;
|
||||
($cn) = ($t =~ /^.*CN=(\w+).*$/);
|
||||
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>] ";
|
||||
}
|
||||
|
||||
my ($yyyy, $mm, $dd, $hh, $min, $sec) = ($i_timestamp =~ /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/);
|
||||
eval { my $ts = timelocal($sec, $min, $hh, $dd, $mm-1, $yyyy-1900); };
|
||||
my $err = DbLog_checkValidTime ($i_timestamp);
|
||||
|
||||
if ($@) {
|
||||
my @l = split /at/, $@;
|
||||
return "Timestamp is out of range - $l[0]";
|
||||
if ($err) {
|
||||
return "Timestamp is out of range: $err";
|
||||
}
|
||||
|
||||
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 $re = $hash->{REGEXP};
|
||||
@ -1403,14 +1402,13 @@ sub DbLog_Log {
|
||||
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 (!$@) {
|
||||
$timestamp = $TIMESTAMP;
|
||||
if ($err) {
|
||||
Log3 ($name, 2, "$name - TIMESTAMP >$TIMESTAMP< got from DbLogValueFn in $dev_name is invalid: $err");
|
||||
}
|
||||
else {
|
||||
Log3 ($name, 2, "$name - TIMESTAMP got from DbLogValueFn in $dev_name is invalid: $TIMESTAMP");
|
||||
$timestamp = $TIMESTAMP;
|
||||
}
|
||||
|
||||
$reading = $READING if($READING ne '');
|
||||
@ -1448,14 +1446,13 @@ sub DbLog_Log {
|
||||
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 (!$@) {
|
||||
$timestamp = $TIMESTAMP;
|
||||
if ($err) {
|
||||
Log3 ($name, 2, "$name - Parameter TIMESTAMP >$TIMESTAMP< got from valueFn is invalid: $err");
|
||||
}
|
||||
else {
|
||||
Log3 ($name, 2, "$name - Parameter TIMESTAMP got from valueFn is invalid: $TIMESTAMP");
|
||||
$timestamp = $TIMESTAMP;
|
||||
}
|
||||
|
||||
$dev_name = $DEVICE if($DEVICE ne '');
|
||||
@ -1466,6 +1463,13 @@ sub DbLog_Log {
|
||||
$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
|
||||
($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}} ) {
|
||||
$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
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -3262,7 +3265,7 @@ sub _DbLog_SBP_onRun_LogArray {
|
||||
|
||||
__DbLog_SBP_sendToParent ($subprocess, $ret);
|
||||
|
||||
return;
|
||||
return $error;
|
||||
};
|
||||
|
||||
_DbLog_SBP_dbhRaiseError ($dbh);
|
||||
@ -3977,7 +3980,7 @@ sub _DbLog_SBP_onRun_importCachefile {
|
||||
if (!$error && $nins_hist && keys %{$rowlback}) {
|
||||
_DbLog_SBP_Log3Parent ( { name => $name,
|
||||
level => 2,
|
||||
msg => "WARNING - $nins_hist datasets from $infile were not imported:",
|
||||
msg => "WARNING - $nins_hist datasets from $infile were not imported.",
|
||||
oper => 'log3parent',
|
||||
subprocess => $subprocess
|
||||
}
|
||||
@ -6887,7 +6890,7 @@ sub _DbLog_plotData {
|
||||
}
|
||||
else { # 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;
|
||||
}
|
||||
}
|
||||
@ -8023,7 +8026,7 @@ sub DbLog_AddLog {
|
||||
|
||||
my ($dev_type,$dev_name,$dev_reading,$read_val,$event,$ut);
|
||||
my $memcount;
|
||||
my $ts;
|
||||
my ($ts, $err);
|
||||
|
||||
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
|
||||
|
||||
if($ctz ne 'none') {
|
||||
my $err;
|
||||
my $params = {
|
||||
name => $name,
|
||||
dtstring => $ts,
|
||||
@ -8173,14 +8175,13 @@ sub DbLog_AddLog {
|
||||
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 (!$@) {
|
||||
$ts = $TIMESTAMP;
|
||||
if ($err) {
|
||||
Log3 ($name, 2, "$name - Parameter TIMESTAMP >$TIMESTAMP< got from valueFn is invalid: $err");
|
||||
}
|
||||
else {
|
||||
Log3 ($name, 2, "$name - Parameter TIMESTAMP got from valueFn is invalid: $TIMESTAMP");
|
||||
$ts = $TIMESTAMP;
|
||||
}
|
||||
|
||||
$dev_name = $DEVICE if($DEVICE ne '');
|
||||
@ -8289,14 +8290,13 @@ sub DbLog_addCacheLine {
|
||||
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 (!$@) {
|
||||
$i_timestamp = $TIMESTAMP;
|
||||
if ($err) {
|
||||
Log3 ($name, 2, "$name - Parameter TIMESTAMP >$TIMESTAMP< got from valueFn is invalid: $err");
|
||||
}
|
||||
else {
|
||||
Log3 ($name, 2, "$name - Parameter TIMESTAMP got from valueFn is invalid: $TIMESTAMP");
|
||||
$i_timestamp = $TIMESTAMP;
|
||||
}
|
||||
|
||||
$i_dev = $DEVICE if($DEVICE ne '');
|
||||
@ -8797,6 +8797,31 @@ sub DbLog_checkTimeformat {
|
||||
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
|
||||
# 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
|
||||
$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;
|
||||
}
|
||||
else {
|
||||
$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) {
|
||||
# es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen
|
||||
# mit {<Modul>->VERSION()} im FHEMWEB kann Modulversion abgefragt werden
|
||||
|
Loading…
x
Reference in New Issue
Block a user