mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-22 20:24:36 +00:00
93_DbLog: contrib V4.2.0
git-svn-id: https://svn.fhem.de/fhem/trunk@19898 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
d9bc5e639f
commit
19e7ad0ed2
@ -1,16 +1,17 @@
|
|||||||
############################################################################################################################################
|
############################################################################################################################################
|
||||||
# $Id: 93_DbLog.pm 19251 2019-04-23 19:59:00Z DS_Starter $
|
# $Id: 93_DbLog.pm 19529 2019-06-02 05:21:16Z DS_Starter $
|
||||||
#
|
#
|
||||||
# 93_DbLog.pm
|
# 93_DbLog.pm
|
||||||
# written by Dr. Boris Neubert 2007-12-30
|
# written by Dr. Boris Neubert 2007-12-30
|
||||||
# e-mail: omega at online dot de
|
# e-mail: omega at online dot de
|
||||||
#
|
#
|
||||||
# modified and maintained by Tobias Faust since 2012-06-26
|
# modified and maintained by Tobias Faust since 2012-06-26 until 2016
|
||||||
# e-mail: tobias dot faust at online dot de
|
# e-mail: tobias dot faust at online dot de
|
||||||
#
|
#
|
||||||
# reduceLog() created by Claudiu Schuster (rapster)
|
|
||||||
#
|
|
||||||
# redesigned 2016-2019 by DS_Starter with credits by: JoeAllb, DeeSpe
|
# redesigned 2016-2019 by DS_Starter with credits by: JoeAllb, DeeSpe
|
||||||
|
# e-mail: heiko dot maaz at t-online dot de
|
||||||
|
#
|
||||||
|
# reduceLog() created by Claudiu Schuster (rapster)
|
||||||
#
|
#
|
||||||
############################################################################################################################################
|
############################################################################################################################################
|
||||||
|
|
||||||
@ -28,7 +29,8 @@ no if $] >= 5.017011, warnings => 'experimental::smartmatch';
|
|||||||
|
|
||||||
# Version History intern by DS_Starter:
|
# Version History intern by DS_Starter:
|
||||||
our %DbLog_vNotesIntern = (
|
our %DbLog_vNotesIntern = (
|
||||||
"4.1.1" => "25.05.2019 fix ignore MinInterval if value is \"0\" ",
|
"4.2.0" => "25.07.2019 DbLogValueFn as device specific function propagated in devices if dblog is used ",
|
||||||
|
"4.1.1" => "25.05.2019 fix ignore MinInterval if value is \"0\", Forum: #100344 ",
|
||||||
"4.1.0" => "17.04.2019 DbLog_Get: change reconnect for MySQL (Forum: #99719), change index suggestion in DbLog_configcheck ",
|
"4.1.0" => "17.04.2019 DbLog_Get: change reconnect for MySQL (Forum: #99719), change index suggestion in DbLog_configcheck ",
|
||||||
"4.0.0" => "14.04.2019 rewrite DbLog_PushAsync / DbLog_Push / DbLog_Connectxx, new attribute \"bulkInsert\" ",
|
"4.0.0" => "14.04.2019 rewrite DbLog_PushAsync / DbLog_Push / DbLog_Connectxx, new attribute \"bulkInsert\" ",
|
||||||
"3.14.1" => "12.04.2019 DbLog_Get: change select of MySQL Forum: https://forum.fhem.de/index.php/topic,99280.0.html ",
|
"3.14.1" => "12.04.2019 DbLog_Get: change select of MySQL Forum: https://forum.fhem.de/index.php/topic,99280.0.html ",
|
||||||
@ -260,6 +262,7 @@ sub DbLog_Initialize($)
|
|||||||
|
|
||||||
addToAttrList("DbLogInclude");
|
addToAttrList("DbLogInclude");
|
||||||
addToAttrList("DbLogExclude");
|
addToAttrList("DbLogExclude");
|
||||||
|
addToAttrList("DbLogValueFn:textField-long");
|
||||||
|
|
||||||
$hash->{FW_detailFn} = "DbLog_fhemwebFn";
|
$hash->{FW_detailFn} = "DbLog_fhemwebFn";
|
||||||
$hash->{SVG_sampleDataFn} = "DbLog_sampleDataFn";
|
$hash->{SVG_sampleDataFn} = "DbLog_sampleDataFn";
|
||||||
@ -1229,7 +1232,6 @@ sub DbLog_Log($$) {
|
|||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# Log3 $name, 5, "DbLog $name -> verbose 4 output of device $dev_name skipped due to attribute \"verbose4Devs\" restrictions" if(!$vb4show);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"}) {
|
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"}) {
|
||||||
@ -1246,9 +1248,17 @@ sub DbLog_Log($$) {
|
|||||||
my $now = gettimeofday(); # get timestamp in seconds since epoch
|
my $now = gettimeofday(); # get timestamp in seconds since epoch
|
||||||
my $DbLogExclude = AttrVal($dev_name, "DbLogExclude", undef);
|
my $DbLogExclude = AttrVal($dev_name, "DbLogExclude", undef);
|
||||||
my $DbLogInclude = AttrVal($dev_name, "DbLogInclude",undef);
|
my $DbLogInclude = AttrVal($dev_name, "DbLogInclude",undef);
|
||||||
|
my $DbLogValueFn = AttrVal($dev_name, "DbLogValueFn","");
|
||||||
my $DbLogSelectionMode = AttrVal($name, "DbLogSelectionMode","Exclude");
|
my $DbLogSelectionMode = AttrVal($name, "DbLogSelectionMode","Exclude");
|
||||||
my $value_fn = AttrVal( $name, "valueFn", "" );
|
my $value_fn = AttrVal( $name, "valueFn", "" );
|
||||||
|
|
||||||
|
# Funktion aus Device spezifischer DbLogValueFn validieren
|
||||||
|
if( $DbLogValueFn =~ m/^\s*(\{.*\})\s*$/s ) {
|
||||||
|
$DbLogValueFn = $1;
|
||||||
|
} else {
|
||||||
|
$DbLogValueFn = '';
|
||||||
|
}
|
||||||
|
|
||||||
# Funktion aus Attr valueFn validieren
|
# Funktion aus Attr valueFn validieren
|
||||||
if( $value_fn =~ m/^\s*(\{.*\})\s*$/s ) {
|
if( $value_fn =~ m/^\s*(\{.*\})\s*$/s ) {
|
||||||
$value_fn = $1;
|
$value_fn = $1;
|
||||||
@ -1376,7 +1386,33 @@ sub DbLog_Log($$) {
|
|||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $now;
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{TIME} = $now;
|
||||||
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $value;
|
$defs{$dev_name}{Helper}{DBLOG}{$reading}{$hash->{NAME}}{VALUE} = $value;
|
||||||
|
|
||||||
# Anwender kann Feldwerte mit Funktion aus Attr valueFn verändern oder Datensatz-Log überspringen
|
# Device spezifische DbLogValueFn-Funktion anwenden
|
||||||
|
if($DbLogValueFn ne '') {
|
||||||
|
my $TIMESTAMP = $timestamp;
|
||||||
|
my $EVENT = $event;
|
||||||
|
my $READING = $reading;
|
||||||
|
my $VALUE = $value;
|
||||||
|
my $UNIT = $unit;
|
||||||
|
my $IGNORE = 0;
|
||||||
|
my $CN = " ";
|
||||||
|
|
||||||
|
eval $DbLogValueFn;
|
||||||
|
Log3 $name, 2, "DbLog $name -> error device \"$dev_name\" specific DbLogValueFn: ".$@ if($@);
|
||||||
|
|
||||||
|
if($IGNORE) {
|
||||||
|
# aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt in $DbLogValueFn
|
||||||
|
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"
|
||||||
|
if($vb4show && !$hash->{HELPER}{".RUNNING_PID"});
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
$timestamp = $TIMESTAMP if($TIMESTAMP =~ /(19[0-9][0-9]|2[0-9][0-9][0-9])-(0[1-9]|1[1-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]) (0[0-9]|1[1-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/);
|
||||||
|
$reading = $READING if($READING ne '');
|
||||||
|
$value = $VALUE if(defined $VALUE);
|
||||||
|
$unit = $UNIT if(defined $UNIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
# zentrale valueFn im DbLog-Device abarbeiten
|
||||||
if($value_fn ne '') {
|
if($value_fn ne '') {
|
||||||
my $TIMESTAMP = $timestamp;
|
my $TIMESTAMP = $timestamp;
|
||||||
my $DEVICE = $dev_name;
|
my $DEVICE = $dev_name;
|
||||||
@ -1390,6 +1426,7 @@ sub DbLog_Log($$) {
|
|||||||
|
|
||||||
eval $value_fn;
|
eval $value_fn;
|
||||||
Log3 $name, 2, "DbLog $name -> error valueFn: ".$@ if($@);
|
Log3 $name, 2, "DbLog $name -> error valueFn: ".$@ if($@);
|
||||||
|
|
||||||
if($IGNORE) {
|
if($IGNORE) {
|
||||||
# aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt in $value_fn
|
# aktueller Event wird nicht geloggt wenn $IGNORE=1 gesetzt in $value_fn
|
||||||
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 $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"
|
||||||
@ -5675,12 +5712,12 @@ sub DbLog_setVersionInfo($) {
|
|||||||
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
|
if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) {
|
||||||
# META-Daten sind vorhanden
|
# META-Daten sind vorhanden
|
||||||
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}}
|
$modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}}
|
||||||
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbLog.pm 19251 2019-04-23 19:59:00Z DS_Starter $ im Kopf komplett! vorhanden )
|
if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 93_DbLog.pm 19529 2019-06-02 05:21:16Z DS_Starter $ im Kopf komplett! vorhanden )
|
||||||
$modules{$type}{META}{x_version} =~ s/1.1.1/$v/g;
|
$modules{$type}{META}{x_version} =~ s/1.1.1/$v/g;
|
||||||
} 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 19251 2019-04-23 19:59:00Z DS_Starter $ im Kopf komplett! vorhanden )
|
return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 93_DbLog.pm 19529 2019-06-02 05:21:16Z 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
|
||||||
@ -7833,6 +7870,41 @@ return;
|
|||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<a name="DbLogValueFn"></a>
|
||||||
|
<li><b>DbLogValueFn</b>
|
||||||
|
<ul>
|
||||||
|
<code>
|
||||||
|
attr <device> DbLogValueFn {}
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
Wird DbLog genutzt, wird in allen Devices das Attribut <i>DbLogValueFn</i> propagiert.
|
||||||
|
Es kann über einen Perl-Ausdruck auf die Variablen $TIMESTAMP, $READING, $VALUE (Wert des Readings) und
|
||||||
|
$UNIT (Einheit des Readingswert) zugegriffen werden und diese verändern, d.h. die veränderten Werte werden geloggt.
|
||||||
|
Außerdem hat man lesenden Zugriff auf $EVENT für eine Auswertung im Perl-Ausdruck.
|
||||||
|
$EVENT kann nicht verändert werden. <br>
|
||||||
|
Soll $TIMESTAMP verändert werden, muss die Form "yyyy-mm-dd hh:mm:ss" eingehalten werden, ansonsten wird der
|
||||||
|
geänderte $timestamp nicht übernommen.
|
||||||
|
Zusätzlich kann durch Setzen der Variable "$IGNORE=1" der Datensatz vom Logging ausgeschlossen werden. <br>
|
||||||
|
Die devicespezifische Funktion in "DbLogValueFn" wird vor der eventuell im DbLog-Device vorhandenen Funktion im Attribut
|
||||||
|
"valueFn" auf den Datensatz angewendet.
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<b>Beispiel</b> <br>
|
||||||
|
<pre>
|
||||||
|
attr SMA_Energymeter DbLogValueFn
|
||||||
|
{
|
||||||
|
if ($READING eq "Bezug_WirkP_Kosten_Diff"){
|
||||||
|
$UNIT="Diff-W";
|
||||||
|
}
|
||||||
|
if ($READING =~ /Einspeisung_Wirkleistung_Zaehler/){
|
||||||
|
$IGNORE=1;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<a name="disable"></a>
|
<a name="disable"></a>
|
||||||
<li><b>disable</b>
|
<li><b>disable</b>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user