mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
93_DbLog.pm: is now version 2.8.6, some small bugfixes
(thanks a lot to DS_Starter) git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@13031 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
c2347d8df8
commit
e0f8134aa0
4
CHANGED
4
CHANGED
@ -1,9 +1,11 @@
|
|||||||
# 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.pm: is now version 2.8.6, some small bugfixes
|
||||||
|
(thanks a lot to DS_Starter)
|
||||||
- update: 55_InfoPanel.pm: attribute mobileApp added
|
- update: 55_InfoPanel.pm: attribute mobileApp added
|
||||||
to support fullscreen experience
|
to support fullscreen experience
|
||||||
- update: 98_cloneDummy.pm
|
- update: 98_cloneDummy.pm
|
||||||
changed: do not use NOTIFYDEFV
|
changed: do not use NOTIFYDEV
|
||||||
fixed: set $rval in _state instead of $reading
|
fixed: set $rval in _state instead of $reading
|
||||||
added: new attribute deleteBeforeUpdate
|
added: new attribute deleteBeforeUpdate
|
||||||
- bugfix: 73_NUKIBridge/74_NUKIDevice fix lockState with App Bridge
|
- bugfix: 73_NUKIBridge/74_NUKIDevice fix lockState with App Bridge
|
||||||
|
150
FHEM/93_DbLog.pm
150
FHEM/93_DbLog.pm
@ -13,6 +13,11 @@
|
|||||||
############################################################################################################################
|
############################################################################################################################
|
||||||
# Versions History done by DS_Starter:
|
# Versions History done by DS_Starter:
|
||||||
#
|
#
|
||||||
|
# 2.8.6 09.01.2017 Workaround for Warning begin_work failed: Turning off AutoCommit failed, start new timer of
|
||||||
|
# DbLog_execmemcache after reducelog
|
||||||
|
# 2.8.5 08.01.2017 attr syncEvents, cacheEvents added to minimize events
|
||||||
|
# 2.8.4 08.01.2017 $readingFnAttributes added
|
||||||
|
# 2.8.3 08.01.2017 set NOTIFYDEV changed to use notifyRegexpChanged (Forum msg555619), attr noNotifyDev added
|
||||||
# 2.8.2 06.01.2017 commandref maintained to cover new functions
|
# 2.8.2 06.01.2017 commandref maintained to cover new functions
|
||||||
# 2.8.1 05.01.2017 use Time::HiRes qw(gettimeofday tv_interval), bugfix $hash->{HELPER}{RUNNING_PID}
|
# 2.8.1 05.01.2017 use Time::HiRes qw(gettimeofday tv_interval), bugfix $hash->{HELPER}{RUNNING_PID}
|
||||||
# 2.8 03.01.2017 attr asyncMode, you have a choice to use blocking (as V2.5) or non-blocking asynchronous
|
# 2.8 03.01.2017 attr asyncMode, you have a choice to use blocking (as V2.5) or non-blocking asynchronous
|
||||||
@ -48,7 +53,7 @@ use Data::Dumper;
|
|||||||
use Blocking;
|
use Blocking;
|
||||||
use Time::HiRes qw(gettimeofday tv_interval);
|
use Time::HiRes qw(gettimeofday tv_interval);
|
||||||
|
|
||||||
my $DbLogVersion = "2.8.2";
|
my $DbLogVersion = "2.8.6";
|
||||||
|
|
||||||
my %columns = ("DEVICE" => 64,
|
my %columns = ("DEVICE" => 64,
|
||||||
"TYPE" => 64,
|
"TYPE" => 64,
|
||||||
@ -80,9 +85,13 @@ sub DbLog_Initialize($)
|
|||||||
"verbose4Devs ".
|
"verbose4Devs ".
|
||||||
"excludeDevs ".
|
"excludeDevs ".
|
||||||
"syncInterval ".
|
"syncInterval ".
|
||||||
|
"noNotifyDev:1,0 ".
|
||||||
"showproctime:1,0 ".
|
"showproctime:1,0 ".
|
||||||
"asyncMode:1,0 ".
|
"asyncMode:1,0 ".
|
||||||
"DbLogSelectionMode:Exclude,Include,Exclude/Include";
|
"cacheEvents:1,0 ".
|
||||||
|
"syncEvents:1,0 ".
|
||||||
|
"DbLogSelectionMode:Exclude,Include,Exclude/Include ".
|
||||||
|
$readingFnAttributes;
|
||||||
|
|
||||||
# Das Attribut DbLogSelectionMode legt fest, wie die Device-Spezifischen Atrribute
|
# Das Attribut DbLogSelectionMode legt fest, wie die Device-Spezifischen Atrribute
|
||||||
# DbLogExclude und DbLogInclude behandelt werden sollen.
|
# DbLogExclude und DbLogInclude behandelt werden sollen.
|
||||||
@ -124,11 +133,8 @@ sub DbLog_Define($@)
|
|||||||
$hash->{MODE} = "synchronous"; # Standardmode
|
$hash->{MODE} = "synchronous"; # Standardmode
|
||||||
|
|
||||||
# nur Events dieser Devices an NotifyFn weiterleiten
|
# nur Events dieser Devices an NotifyFn weiterleiten
|
||||||
my $dn = (split(":", $regexp))[0];
|
notifyRegexpChanged($hash, $regexp);
|
||||||
$dn =~ tr/[()]//d;
|
|
||||||
$dn =~ s/\|/,/g;
|
|
||||||
$hash->{NOTIFYDEV} = $dn;
|
|
||||||
|
|
||||||
#remember PID for plotfork
|
#remember PID for plotfork
|
||||||
$hash->{PID} = $$;
|
$hash->{PID} = $$;
|
||||||
|
|
||||||
@ -212,6 +218,15 @@ sub DbLog_Attr(@) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($aName eq "noNotifyDev") {
|
||||||
|
my $regexp = $hash->{REGEXP};
|
||||||
|
if ($cmd eq "set" && $aVal) {
|
||||||
|
delete($hash->{NOTIFYDEV});
|
||||||
|
} else {
|
||||||
|
notifyRegexpChanged($hash, $regexp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($aName eq "disable") {
|
if ($aName eq "disable") {
|
||||||
if($cmd eq "set") {
|
if($cmd eq "set") {
|
||||||
$do = ($aVal) ? 1 : 0;
|
$do = ($aVal) ? 1 : 0;
|
||||||
@ -249,6 +264,7 @@ sub DbLog_Set($@) {
|
|||||||
else {
|
else {
|
||||||
if (defined $a[2] && $a[2] =~ /^\d+$/) {
|
if (defined $a[2] && $a[2] =~ /^\d+$/) {
|
||||||
$ret = DbLog_reduceLog($hash,@a);
|
$ret = DbLog_reduceLog($hash,@a);
|
||||||
|
InternalTimer(gettimeofday()+5, "DbLog_execmemcache", $hash, 0);
|
||||||
} else {
|
} else {
|
||||||
Log3($name, 1, "DbLog $name: reduceLog error, no <days> given.");
|
Log3($name, 1, "DbLog $name: reduceLog error, no <days> given.");
|
||||||
$ret = "reduceLog error, no <days> given.";
|
$ret = "reduceLog error, no <days> given.";
|
||||||
@ -692,8 +708,8 @@ sub DbLog_Log($$) {
|
|||||||
Log3 $name, 4, "DbLog $name -> verbose 4 output of device $dev_name skipped due to attribute \"verbose4Devs\" restrictions" if(!$vb4show);
|
Log3 $name, 4, "DbLog $name -> verbose 4 output of device $dev_name skipped due to attribute \"verbose4Devs\" restrictions" if(!$vb4show);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Devices ausschließen durch Attribut "excludeDevs" (nur wenn $hash->{NOTIFYDEV} = .*)
|
# Devices ausschließen durch Attribut "excludeDevs" (nur wenn kein $hash->{NOTIFYDEV} oder $hash->{NOTIFYDEV} = .*)
|
||||||
if($hash->{NOTIFYDEV} eq ".*") {
|
if(!$hash->{NOTIFYDEV} || $hash->{NOTIFYDEV} eq ".*") {
|
||||||
my @exdevs = split(",", AttrVal($name, "excludeDevs", ""));
|
my @exdevs = split(",", AttrVal($name, "excludeDevs", ""));
|
||||||
if(@exdevs) {
|
if(@exdevs) {
|
||||||
foreach (@exdevs) {
|
foreach (@exdevs) {
|
||||||
@ -829,7 +845,11 @@ sub DbLog_Log($$) {
|
|||||||
if($async) {
|
if($async) {
|
||||||
# asynchoner non-blocking Mode
|
# asynchoner non-blocking Mode
|
||||||
my $memcount = $hash->{cache}{memcache}?scalar(keys%{$hash->{cache}{memcache}}):0;
|
my $memcount = $hash->{cache}{memcache}?scalar(keys%{$hash->{cache}{memcache}}):0;
|
||||||
readingsSingleUpdate($hash, "CacheUsage", $memcount, 1);
|
if(AttrVal($name, "cacheEvents", undef)) {
|
||||||
|
readingsSingleUpdate($hash, "CacheUsage", $memcount, 1)
|
||||||
|
} else {
|
||||||
|
readingsSingleUpdate($hash, "CacheUsage", $memcount, 0)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if(@row_array) {
|
if(@row_array) {
|
||||||
# synchoner Mode
|
# synchoner Mode
|
||||||
@ -918,9 +938,9 @@ sub DbLog_Push(@) {
|
|||||||
$sth_uc->bind_param_array(7, [@reading]);
|
$sth_uc->bind_param_array(7, [@reading]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eval {$dbh->begin_work();}; # issue: begin_work failed: Turning off AutoCommit failed
|
||||||
my ($tuples, $rows);
|
my ($tuples, $rows);
|
||||||
eval {
|
eval {
|
||||||
$dbh->begin_work(); # begin_work in eval -> avoid crash if issue: begin_work failed: Turning off AutoCommit failed
|
|
||||||
# insert into history
|
# insert into history
|
||||||
if (lc($DbLogType) =~ m(history) ) {
|
if (lc($DbLogType) =~ m(history) ) {
|
||||||
($tuples, $rows) = $sth_ih->execute_array( { ArrayTupleStatus => \my @tuple_status } );
|
($tuples, $rows) = $sth_ih->execute_array( { ArrayTupleStatus => \my @tuple_status } );
|
||||||
@ -1019,7 +1039,8 @@ sub DbLog_execmemcache ($) {
|
|||||||
my $dbuser = $hash->{dbuser};
|
my $dbuser = $hash->{dbuser};
|
||||||
my $dbpassword = $attr{"sec$name"}{secret};
|
my $dbpassword = $attr{"sec$name"}{secret};
|
||||||
my $timeout = 60;
|
my $timeout = 60;
|
||||||
my $state = "connected";
|
my $state = "connected";
|
||||||
|
my $error = 0;
|
||||||
my (@row_array,$memcount,$dbh);
|
my (@row_array,$memcount,$dbh);
|
||||||
|
|
||||||
RemoveInternalTimer($hash, "DbLog_execmemcache");
|
RemoveInternalTimer($hash, "DbLog_execmemcache");
|
||||||
@ -1039,7 +1060,7 @@ sub DbLog_execmemcache ($) {
|
|||||||
|
|
||||||
if ($@) {
|
if ($@) {
|
||||||
Log3($name, 3, "DbLog $name: Error DBLog_execmemcache - $@");
|
Log3($name, 3, "DbLog $name: Error DBLog_execmemcache - $@");
|
||||||
$state = $@;
|
$error = $@;
|
||||||
} else {
|
} else {
|
||||||
# Testverbindung abbauen
|
# Testverbindung abbauen
|
||||||
$dbh->disconnect();
|
$dbh->disconnect();
|
||||||
@ -1070,7 +1091,7 @@ sub DbLog_execmemcache ($) {
|
|||||||
Log3 $hash->{NAME}, 5, "DbLog $name -> DbLog_PushAsync called with timeout: $timeout";
|
Log3 $hash->{NAME}, 5, "DbLog $name -> DbLog_PushAsync called with timeout: $timeout";
|
||||||
} else {
|
} else {
|
||||||
if($hash->{HELPER}{RUNNING_PID}) {
|
if($hash->{HELPER}{RUNNING_PID}) {
|
||||||
$state = "old BlockingCall is running - resync at NextSync";
|
$error = "old BlockingCall is running - resync at NextSync";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1079,13 +1100,25 @@ sub DbLog_execmemcache ($) {
|
|||||||
|
|
||||||
my $nextsync = gettimeofday()+$syncival;
|
my $nextsync = gettimeofday()+$syncival;
|
||||||
my $nsdt = FmtDateTime($nextsync);
|
my $nsdt = FmtDateTime($nextsync);
|
||||||
|
|
||||||
readingsBeginUpdate($hash);
|
|
||||||
readingsBulkUpdate($hash, "CacheUsage", $memcount);
|
|
||||||
readingsBulkUpdate($hash, "NextSync", $nsdt);
|
|
||||||
readingsBulkUpdate($hash, "state", $state);
|
|
||||||
readingsEndUpdate($hash, 1);
|
|
||||||
|
|
||||||
|
if(AttrVal($name, "cacheEvents", undef)) {
|
||||||
|
readingsSingleUpdate($hash, "CacheUsage", $memcount, 1)
|
||||||
|
} else {
|
||||||
|
readingsSingleUpdate($hash, "CacheUsage", $memcount, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(AttrVal($name, "syncEvents", undef)) {
|
||||||
|
readingsSingleUpdate($hash, "NextSync", $nsdt, 1);
|
||||||
|
} else {
|
||||||
|
readingsSingleUpdate($hash, "NextSync", $nsdt, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($error) {
|
||||||
|
readingsSingleUpdate($hash, "state", $error, 1);
|
||||||
|
} else {
|
||||||
|
readingsSingleUpdate($hash, "state", $state, 0);
|
||||||
|
}
|
||||||
|
|
||||||
InternalTimer($nextsync, "DbLog_execmemcache", $hash, 0);
|
InternalTimer($nextsync, "DbLog_execmemcache", $hash, 0);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -1175,9 +1208,9 @@ sub DbLog_PushAsync(@) {
|
|||||||
# SQL-Startzeit
|
# SQL-Startzeit
|
||||||
my $st = [gettimeofday];
|
my $st = [gettimeofday];
|
||||||
|
|
||||||
|
eval {$dbh->begin_work();}; # issue: begin_work failed: Turning off AutoCommit failed
|
||||||
my ($tuples, $rows);
|
my ($tuples, $rows);
|
||||||
eval {
|
eval {
|
||||||
$dbh->begin_work(); # begin_work in eval -> avoid crash if issue: begin_work failed: Turning off AutoCommit failed
|
|
||||||
# insert into history
|
# insert into history
|
||||||
if (lc($DbLogType) =~ m(history) ) {
|
if (lc($DbLogType) =~ m(history) ) {
|
||||||
($tuples, $rows) = $sth_ih->execute_array( { ArrayTupleStatus => \my @tuple_status } );
|
($tuples, $rows) = $sth_ih->execute_array( { ArrayTupleStatus => \my @tuple_status } );
|
||||||
@ -1278,11 +1311,12 @@ sub DbLog_PushAsyncDone ($) {
|
|||||||
my @a = split("\\|",$string);
|
my @a = split("\\|",$string);
|
||||||
my $name = $a[0];
|
my $name = $a[0];
|
||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
my $state = $a[1]?decode_base64($a[1]):"connected";
|
my $error = $a[1]?decode_base64($a[1]):0;
|
||||||
my $bt = $a[2];
|
my $bt = $a[2];
|
||||||
my ($rt,$brt) = split(",", $bt);
|
my ($rt,$brt) = split(",", $bt);
|
||||||
my $rowlist = $a[3];
|
my $rowlist = $a[3];
|
||||||
my $asyncmode = AttrVal($name, "asyncMode", undef);
|
my $asyncmode = AttrVal($name, "asyncMode", undef);
|
||||||
|
my $state = "connected";
|
||||||
my $memcount;
|
my $memcount;
|
||||||
|
|
||||||
if($rowlist) {
|
if($rowlist) {
|
||||||
@ -1298,19 +1332,23 @@ sub DbLog_PushAsyncDone ($) {
|
|||||||
$hash->{cache}{memcache}{$index} = $row;
|
$hash->{cache}{memcache}{$index} = $row;
|
||||||
}
|
}
|
||||||
$memcount = scalar(keys%{$hash->{cache}{memcache}});
|
$memcount = scalar(keys%{$hash->{cache}{memcache}});
|
||||||
readingsSingleUpdate($hash, "CacheUsage", $memcount, 1);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3 ($name, 5, "DbLog $name -> Start DbLog_PushAsyncDone");
|
Log3 ($name, 5, "DbLog $name -> Start DbLog_PushAsyncDone");
|
||||||
$state = "disabled" if(IsDisabled($name));
|
$state = "disabled" if(IsDisabled($name));
|
||||||
|
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
readingsBulkUpdate($hash, "background_processing_time", sprintf("%.4f",$brt)) if(AttrVal($name, "showproctime", undef));
|
readingsBulkUpdate($hash, "background_processing_time", sprintf("%.4f",$brt)) if(AttrVal($name, "showproctime", undef));
|
||||||
readingsBulkUpdate($hash, "sql_processing_time", sprintf("%.4f",$rt)) if(AttrVal($name, "showproctime", undef));
|
readingsBulkUpdate($hash, "sql_processing_time", sprintf("%.4f",$rt)) if(AttrVal($name, "showproctime", undef));
|
||||||
readingsBulkUpdate($hash, "state", $state, 1);
|
|
||||||
readingsEndUpdate($hash, 1);
|
readingsEndUpdate($hash, 1);
|
||||||
|
|
||||||
|
if($error) {
|
||||||
|
readingsSingleUpdate($hash, "state", $error, 1);
|
||||||
|
} else {
|
||||||
|
readingsSingleUpdate($hash, "state", $state, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if(!$asyncmode) {
|
if(!$asyncmode) {
|
||||||
delete($defs{$name}{READINGS}{NextSync});
|
delete($defs{$name}{READINGS}{NextSync});
|
||||||
delete($defs{$name}{READINGS}{background_processing_time});
|
delete($defs{$name}{READINGS}{background_processing_time});
|
||||||
@ -2946,6 +2984,16 @@ sub dbReadings($@) {
|
|||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<ul><b>cacheEvents</b>
|
||||||
|
<ul>
|
||||||
|
<code>attr <device> cacheEvents [1|0]
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
events of reading cacheEvents will be created. <br>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
<ul><b>DbLogType</b>
|
<ul><b>DbLogType</b>
|
||||||
<ul>
|
<ul>
|
||||||
@ -3034,6 +3082,27 @@ sub dbReadings($@) {
|
|||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<ul><b>noNotifyDev</b>
|
||||||
|
<ul>
|
||||||
|
<code>
|
||||||
|
attr <device> noNotifyDev [1|0]
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
Enforces that NOTIFYDEV won't set and hence won't used. <br>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<ul><b>syncEvents</b>
|
||||||
|
<ul>
|
||||||
|
<code>attr <device> syncEvents [1|0]
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
events of reading syncEvents will be created. <br>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
<ul><b>shutdownWait</b>
|
<ul><b>shutdownWait</b>
|
||||||
<ul>
|
<ul>
|
||||||
@ -3431,6 +3500,16 @@ sub dbReadings($@) {
|
|||||||
</ul>
|
</ul>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<ul><b>cacheEvents</b>
|
||||||
|
<ul>
|
||||||
|
<code>attr <device> cacheEvents [1|0]
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
es werden Events für Reading cacheEvents erzeugt. <br>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
<ul><b>DbLogType</b>
|
<ul><b>DbLogType</b>
|
||||||
<ul>
|
<ul>
|
||||||
@ -3536,6 +3615,17 @@ sub dbReadings($@) {
|
|||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<ul><b>noNotifyDev</b>
|
||||||
|
<ul>
|
||||||
|
<code>
|
||||||
|
attr <device> noNotifyDev [1|0]
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
Erzwingt dass NOTIFYDEV nicht gesetzt und somit nicht verwendet wird .<br>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
<ul><b>showproctime</b>
|
<ul><b>showproctime</b>
|
||||||
<ul>
|
<ul>
|
||||||
<code>attr <device> showproctime [1|0]
|
<code>attr <device> showproctime [1|0]
|
||||||
@ -3549,6 +3639,16 @@ sub dbReadings($@) {
|
|||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
<ul><b>syncEvents</b>
|
||||||
|
<ul>
|
||||||
|
<code>attr <device> syncEvents [1|0]
|
||||||
|
</code><br>
|
||||||
|
|
||||||
|
es werden Events für Reading NextSync erzeugt. <br>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
|
||||||
<ul><b>syncInterval</b>
|
<ul><b>syncInterval</b>
|
||||||
<ul>
|
<ul>
|
||||||
<code>attr <device> syncInterval <n>
|
<code>attr <device> syncInterval <n>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user