2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-15 22:26:04 +00:00

93_DbLog: contrib 5.8.1

git-svn-id: https://svn.fhem.de/fhem/trunk@27210 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2023-02-12 15:46:27 +00:00
parent 53b01aa3b0
commit 3690f7d748

View File

@ -1,5 +1,5 @@
############################################################################################################################################
# $Id: 93_DbLog.pm 27111 2023-01-30 19:06:28Z DS_Starter $
# $Id: 93_DbLog.pm 27165 2023-02-01 21:48:29Z DS_Starter $
#
# 93_DbLog.pm
# written by Dr. Boris Neubert 2007-12-30
@ -38,6 +38,7 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
# Version History intern by DS_Starter:
my %DbLog_vNotesIntern = (
"5.8.1" => "12.02.2023 change field type of DbLogInclude, DbLogExclude to textField-long ",
"5.8.0" => "30.01.2023 new Get menu for a selection of getters, fix creation of new subprocess during shutdown sequence ",
"5.7.0" => "25.01.2023 send Log3() data back ro parent process, improve _DbLog_dbReadings function ",
"5.6.2" => "22.01.2023 check Syntax of DbLogValueFn attribute with Log output, Forum:#131777 ",
@ -201,8 +202,8 @@ sub DbLog_Initialize {
"verbose4Devs ".
$readingFnAttributes;
addToAttrList("DbLogInclude");
addToAttrList("DbLogExclude");
addToAttrList("DbLogInclude:textField-long");
addToAttrList("DbLogExclude:textField-long");
addToAttrList("DbLogValueFn:textField-long");
$hash->{FW_detailFn} = "DbLog_fhemwebFn";
@ -1339,8 +1340,8 @@ sub DbLog_Log {
$DoIt = 1 if($DbLogSelectionMode =~ m/Exclude/ );
if($DbLogExclude && $DbLogSelectionMode =~ m/Exclude/) { # Bsp: "(temperature|humidity):300,battery:3600:force"
my @v1 = split(/,/, $DbLogExclude);
my @v1 = DbLog_attrLong2Array ($DbLogExclude, ',');
for (my $i = 0; $i < int(@v1); $i++) {
my @v2 = split /:/, $v1[$i];
$DoIt = 0 if(!$v2[1] && $reading =~ m,^$v2[0]$,); # Reading matcht auf Regexp, kein MinIntervall angegeben
@ -1363,8 +1364,8 @@ sub DbLog_Log {
# Im Endeffekt genau die gleiche Pruefung, wie fuer DBLogExclude, lediglich mit umgegkehrtem Ergebnis.
if($DoIt == 0) {
if($DbLogInclude && ($DbLogSelectionMode =~ m/Include/)) {
my @v1 = split /,/, $DbLogInclude;
my @v1 = DbLog_attrLong2Array ($DbLogInclude, ',');
for (my $i = 0; $i < int(@v1); $i++) {
my @v2 = split /:/, $v1[$i];
$DoIt = 1 if($reading =~ m,^$v2[0]$,); # Reading matcht auf Regexp
@ -1851,20 +1852,24 @@ sub _DbLog_checkDefMinInt {
my $force;
my $DoIt = 1;
my $defminint = AttrVal($name, "defaultMinInterval", undef);
my $defminint = AttrVal ($name, "defaultMinInterval", undef);
return $DoIt if(!$defminint); # Attribut "defaultMinInterval" nicht im DbLog gesetzt -> kein ToDo
my $DbLogExclude = AttrVal ($dev_name, "DbLogExclude", undef);
$DbLogExclude = join ",", DbLog_attrLong2Array ($DbLogExclude, ',');
my $DbLogInclude = AttrVal ($dev_name, "DbLogInclude", undef);
$DbLogInclude = join ",", DbLog_attrLong2Array ($DbLogInclude, ',');
$defminint =~ s/[\s\n]/,/g;
my @adef = split(/,/, $defminint);
my @adef = split /,/, $defminint;
my $inex = ($DbLogExclude ? $DbLogExclude."," : "").($DbLogInclude ? $DbLogInclude : "");
if($inex) { # Quelldevice hat DbLogExclude und/oder DbLogInclude gesetzt
my @ie = split(/,/, $inex);
my @ie = split /,/, $inex;
for (my $k = 0; $k < int(@ie); $k++) { # Bsp. für das auszuwertende Element
my @rif = split(/:/, $ie[$k]); # "(temperature|humidity):300:force"
my @rif = split /:/, $ie[$k]; # "(temperature|humidity):300:force"
if($reading =~ m,^$rif[0]$, && $rif[1]) { # aktuelles Reading matcht auf Regexp und minInterval ist angegeben
return $DoIt; # Reading wurde bereits geprüft -> kein Überschreiben durch $defminint
@ -1873,8 +1878,8 @@ sub _DbLog_checkDefMinInt {
}
for (my $l = 0; $l < int(@adef); $l++) {
my @adefelem = split("::", $adef[$l]); # Bsp. für ein defaulMInInterval Element:
my @dvs = devspec2array($adefelem[0]); # device::interval[::force]
my @adefelem = split "::", $adef[$l]; # Bsp. für ein defaulMInInterval Element:
my @dvs = devspec2array ($adefelem[0]); # device::interval[::force]
if(@dvs) {
for (@dvs) {
@ -7838,19 +7843,19 @@ sub DbLog_AddLog {
$found = 1 if($rd =~ m/^$rdspec$/); # Reading gefunden
if($DbLogExclude && !$nce) {
my @v1 = split(/,/, $DbLogExclude);
my @v1 = DbLog_attrLong2Array ($DbLogExclude, ',');
for (my $i = 0; $i < int(@v1); $i++) {
my @v2 = split(/:/, $v1[$i]); # MinInterval wegschneiden, Bsp: "(temperature|humidity):600,battery:3600"
my @v2 = split /:/, $v1[$i]; # MinInterval wegschneiden, Bsp: "(temperature|humidity):600,battery:3600"
if($rd =~ m,^$v2[0]$,) { # Reading matcht $DbLogExclude -> ausschließen vom addLog
$do = 0;
if($DbLogInclude) {
my @v3 = split(/,/, $DbLogInclude);
my @v3 = DbLog_attrLong2Array ($DbLogInclude, ',');
for (my $i = 0; $i < int(@v3); $i++) {
my @v4 = split(/:/, $v3[$i]);
my @v4 = split /:/, $v3[$i];
$do = 1 if($rd =~ m,^$v4[0]$,); # Reading matcht $DbLogInclude -> wieder in addLog einschließen
}
}
@ -8180,6 +8185,22 @@ sub DbLog_charfilter {
return($txt);
}
###############################################################################
# Einen Attributinhalt vom Typ textField-long splitten und als
# Array zurückgeben
# Optional kann das Split-Zeichen, default ',', angegeben werden.
###############################################################################
sub DbLog_attrLong2Array {
my $content = shift;
my $sptchar = shift // q{,};
return () if(!$content);
my @v = map { my $p = $_; $p =~ s/\s//xg; $p; } split /$sptchar/xs, $content; ## no critic 'Map blocks'
return @v;
}
################################################################
# benutzte DB-Feldlängen in Helper und Internals setzen
################################################################
@ -8498,13 +8519,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 27111 2023-01-23 19:06:28Z DS_Starter $ im Kopf komplett! vorhanden )
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbLog.pm 27165 2023-02-01 21:48:29Z 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 27111 2023-01-23 19:06:28Z DS_Starter $ im Kopf komplett! vorhanden )
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbLog.pm 27165 2023-02-01 21:48:29Z 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