2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-19 12:46:03 +00:00

98_readingsWatcher: remove all $_ add attribute delimiter

git-svn-id: https://svn.fhem.de/fhem/trunk@21732 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Wzut 2020-04-20 17:13:20 +00:00
parent 7a71c49190
commit e5655f2e28

View File

@ -21,6 +21,7 @@
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# #
# 2.1.3 => 20.04.20 remove all $_ , add attribut delimiter
# 2.1.2 => 16.04.20 remove undef value for ReadingsAge # 2.1.2 => 16.04.20 remove undef value for ReadingsAge
# 2.1.1 => 14.04.20 remove List::Utils # 2.1.1 => 14.04.20 remove List::Utils
# 2.1.0 => 06.04.20 # 2.1.0 => 06.04.20
@ -45,6 +46,7 @@ use utf8;
use GPUtils qw(GP_Import GP_Export); # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt use GPUtils qw(GP_Import GP_Export); # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt
use Time::HiRes qw(gettimeofday); use Time::HiRes qw(gettimeofday);
BEGIN BEGIN
{ {
# Import from main:: # Import from main::
@ -103,7 +105,9 @@ sub Initialize {
$hash->{DefFn} = \&FHEM::readingsWatcher::Define; $hash->{DefFn} = \&FHEM::readingsWatcher::Define;
$hash->{UndefFn} = \&FHEM::readingsWatcher::Undefine; $hash->{UndefFn} = \&FHEM::readingsWatcher::Undefine;
$hash->{AttrFn} = \&FHEM::readingsWatcher::Attr; $hash->{AttrFn} = \&FHEM::readingsWatcher::Attr;
$hash->{AttrList} = "disable:0,1 interval deleteUnusedReadings:1,0 readingActivity ".$readingFnAttributes; $hash->{AttrList} = 'disable:0,1 interval deleteUnusedReadings:1,0 '
.'readingActivity delimiter:-,--,_,__ '
.$readingFnAttributes;
return FHEM::Meta::InitMod( __FILE__, $hash ) if ($hasmeta); return FHEM::Meta::InitMod( __FILE__, $hash ) if ($hasmeta);
@ -159,8 +163,8 @@ sub Undefine {
delFromAttrList('readingsWatcher'); # global -> userattr delFromAttrList('readingsWatcher'); # global -> userattr
# wer hat alles ein Attribut readingsWatcher gesetzt ? # wer hat alles ein Attribut readingsWatcher gesetzt ?
foreach (devspec2array('readingsWatcher!=')) { foreach my $dev (devspec2array('readingsWatcher!=')) {
delFromDevAttrList($_, 'readingsWatcher'); # aufräumen delFromDevAttrList($dev, 'readingsWatcher'); # aufräumen
} }
} }
@ -196,11 +200,11 @@ sub Set {
} }
if ($cmd eq 'clearReadings') { if ($cmd eq 'clearReadings') {
my $delimiter = AttrVal($name,'delimiter','_');
foreach (keys %{$defs{$name}{READINGS}}) { # alle eigenen Readings foreach my $reading (keys %{$defs{$name}{READINGS}}) { # alle eigenen Readings
if ($_ =~ /_/) { # device_reading if (index($reading, $delimiter) != -1) { # device_reading
readingsDelete($hash, $_); readingsDelete($hash, $reading);
Log3 $hash,4,"$name, delete reading ".$_; Log3 $hash,4,"$name, delete reading $reading";
} }
} }
@ -231,7 +235,7 @@ sub getStateList {
my @devs; my @devs;
foreach my $device (devspec2array("readingsWatcher!=")) { foreach my $device (devspec2array('readingsWatcher!=')) {
my $rSA = ($device ne $name) ? AttrVal($device, 'readingsWatcher', '') : ''; my $rSA = ($device ne $name) ? AttrVal($device, 'readingsWatcher', '') : '';
next if (!$rSA); next if (!$rSA);
@ -243,7 +247,7 @@ sub getStateList {
push @devs, "$device,-,-,ignored,-"; push @devs, "$device,-,-,ignored,-";
} }
else { # valid device else { # valid device
push @devs , IsValidDevice($device,$rSA); push @devs , IsValidDevice($device, $rSA);
} }
} }
@ -257,41 +261,37 @@ sub IsValidDevice {
my $device = shift; my $device = shift;
my @devs; my @devs;
foreach (split(';', shift)) { # Anzahl Regelsätze pro Device, meist nur einer foreach my $rs (split(';', shift)) { # Anzahl Regelsätze pro Device, meist nur einer
$_ =~ s/\+/,/xg; # OR Readings wie normale Readingsliste behandeln $rs =~ s/\+/,/xg; # OR Readings wie normale Readingsliste behandeln
$_ =~ s/ //g; $rs =~ s/ //g;
my ($timeout,undef,@readings) = split(',', $_); # der ggf. vorhandene Ersatzstring wird hier nicht benötigt my ($timeout,undef,@readings) = split(',', $rs); # der ggf. vorhandene Ersatzstring wird hier nicht benötigt
if (!@readings) { return "$device,-,-,wrong parameters,-" if (!@readings);
push @devs, "$device,-,-,wrong parameters,-";
}
else {
foreach my $reading (@readings) { # alle zu überwachenden Readings
my ($age,$state); foreach my $reading (@readings) { # alle zu überwachenden Readings
$reading =~ s/ //g; my ($age,$state);
if (($reading eq 'state') && (ReadingsVal($device, 'state', '') eq 'inactive')) { $reading =~ s/ //g;
$state = 'inactive'; if (($reading eq 'state') && (ReadingsVal($device, 'state', '') eq 'inactive')) {
$age = '-'; $state = 'inactive';
$age = '-';
}
else {
$age = ReadingsAge($device, $reading, undef);
if (!defined($age)) {
$state = 'unknown';
$age = 'undef';
} }
else { else {
$age = ReadingsAge($device, $reading, undef); $state = (int($age) > int($timeout)) ? 'timeout' : 'ok';
if (!defined($age)) {
$state = 'unknown';
$age = 'undef';
}
else {
$state = (int($age) > int($timeout)) ? 'timeout' : 'ok';
}
} }
push @devs, "$device,$reading,$timeout,$state,$age";
} }
push @devs, "$device,$reading,$timeout,$state,$age";
} }
} }
@ -313,8 +313,8 @@ sub formatStateList {
my ($dw,$rw,$tw,$sw,$aw) = (6,7,7,5,3); # Startbreiten, bzw. Mindestbreite durch Überschrift my ($dw,$rw,$tw,$sw,$aw) = (6,7,7,5,3); # Startbreiten, bzw. Mindestbreite durch Überschrift
foreach (@devs) { foreach my $dev (@devs) {
my ($d,$r,$t,$s,$g) = split(',', $_); my ($d,$r,$t,$s,$g) = split(',', $dev);
# die tatsächlichen Breiten aus den vorhandenen Werten ermitteln # die tatsächlichen Breiten aus den vorhandenen Werten ermitteln
$dw = (length($d) > $dw) ? length($d) : $dw; $dw = (length($d) > $dw) ? length($d) : $dw;
$rw = (length($r) > $rw) ? length($r) : $rw; $rw = (length($r) > $rw) ? length($r) : $rw;
@ -338,8 +338,8 @@ sub formatStateList {
$head .= "\n".$separator."\n"; $head .= "\n".$separator."\n";
my $s; my $s;
foreach (@devs) { foreach my $dev (@devs) {
my ($d,$r,$t,$e,$g) = split(',', $_); my ($d,$r,$t,$e,$g) = split(',', $dev);
$s .= $d . (' ' x ($dw - length($d))).' '; # left-align Device $s .= $d . (' ' x ($dw - length($d))).' '; # left-align Device
$s .= '| '. $r . (' ' x ($rw - length($r))).' '; # left-align Reading $s .= '| '. $r . (' ' x ($rw - length($r))).' '; # left-align Reading
@ -365,12 +365,13 @@ sub Attr {
if ($cmd eq 'set') if ($cmd eq 'set')
{ {
if ($attrName eq 'disable') { if ($attrName eq 'disable') {
RemoveInternalTimer($hash);
readingsSingleUpdate($hash, 'state', 'disabled', 1) if (int($attrVal) == 1); readingsSingleUpdate($hash, 'state', 'disabled', 1) if (int($attrVal) == 1);
OnTimer($hash) if (int($attrVal) == 0); InternalTimer(gettimeofday() + 2, 'FHEM::readingsWatcher::OnTimer', $hash, 0) if (int($attrVal) == 0);
return; return;
} }
if (($attrName eq 'readingActivity') && ($attrVal eq 'state')) { if (($attrName eq 'readingActivity') && (lc($attrVal) eq 'state')) {
my $error = 'forbidden value state !'; my $error = 'forbidden value state !';
Log3 $hash,1,"$name, readingActivity $error"; Log3 $hash,1,"$name, readingActivity $error";
return $error; return $error;
@ -378,7 +379,8 @@ sub Attr {
} }
if (($cmd eq 'del') && ($attrName eq 'disable')) { if (($cmd eq 'del') && ($attrName eq 'disable')) {
OnTimer($hash); RemoveInternalTimer($hash);
InternalTimer(gettimeofday() + 2, 'FHEM::readingsWatcher::OnTimer', $hash, 0);
} }
return; return;
@ -413,8 +415,10 @@ sub OnTimer {
$alive //= 'alive'; # if (!defined($alive)); $alive //= 'alive'; # if (!defined($alive));
$readingActifity = '' if ($readingActifity eq 'none'); $readingActifity = '' if ($readingActifity eq 'none');
foreach (keys %{$defs{$name}{READINGS}}) { # alle eigenen Readings my $delimiter = AttrVal($name,'delimiter','_'); # -, --, _, __
$readingsList .= $_ .',' if ( $_ =~ /_/ ); # nur die Readings mit _ im Namen (Device_Reading)
foreach my $reading (keys %{$defs{$name}{READINGS}}) { # alle eigenen Readings
$readingsList .= $reading .',' if (index($reading, $delimiter) != -1); # nur die Readings mit _ im Namen (Device_Reading)
} }
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
@ -440,9 +444,9 @@ sub OnTimer {
my $ok_device = 0; my $ok_device = 0;
foreach (split(';', $rSA)) { #Anzahl Regelsätze im Device foreach my $sets (split(';', $rSA)) { #Anzahl Regelsätze im Device
my ($timeout, $errorValue, @readings_ar) = split(',', $_); my ($timeout, $errorValue, @readings_ar) = split(',', $sets);
if (@readings_ar) { if (@readings_ar) {
@ -474,6 +478,7 @@ sub OnTimer {
} }
my $age = ReadingsAge($device, $reading, ''); my $age = ReadingsAge($device, $reading, '');
my $d_r = $device.$delimiter.$reading;
if ($age ne '') { if ($age ne '') {
@ -491,8 +496,6 @@ sub OnTimer {
$timeOutState = 'ok'; $timeOutState = 'ok';
} }
my $d_r = $device.'_'.$reading;
readingsBulkUpdate($hash, $d_r, $timeOutState) if ($timeOutState); readingsBulkUpdate($hash, $d_r, $timeOutState) if ($timeOutState);
$readingsList =~ s/$d_r,//xms if ($readingsList); # das Reading aus der Liste streichen, leer solange noch kein Device das Attr hat ! $readingsList =~ s/$d_r,//xms if ($readingsList); # das Reading aus der Liste streichen, leer solange noch kein Device das Attr hat !
@ -501,7 +504,7 @@ sub OnTimer {
setReadingsVal($defs{$device},$reading,'unknown',TimeNow()) if ($errorValue); # leise setzen ohne Event setReadingsVal($defs{$device},$reading,'unknown',TimeNow()) if ($errorValue); # leise setzen ohne Event
$defs{$device}->{STATE} = 'unknown' if ($errorValue && $state); $defs{$device}->{STATE} = 'unknown' if ($errorValue && $state);
Log3 $hash,3,"$name, reading Timestamp for $reading not found on device $device"; Log3 $hash,3,"$name, reading Timestamp for $reading not found on device $device";
readingsBulkUpdate($hash, $device.'_'.$reading, 'no Timestamp'); readingsBulkUpdate($hash, $d_r, 'no Timestamp');
} }
} # Readings in einem Regelsatz } # Readings in einem Regelsatz
} # Anzahl Regelsätze im Device } # Anzahl Regelsätze im Device
@ -563,13 +566,11 @@ sub clearReadings {
{ {
next if (!$reading); next if (!$reading);
if (AttrNum($name, 'deleteUnusedReadings', 1)) if (AttrNum($name, 'deleteUnusedReadings', 1)) {
{
readingsDelete($hash, $reading); readingsDelete($hash, $reading);
Log3 $hash, 3, "$name, delete unused reading $reading"; Log3 $hash, 3, "$name, delete unused reading $reading";
} }
else else {
{
readingsBulkUpdate($hash, $reading, 'unused'); readingsBulkUpdate($hash, $reading, 'unused');
Log3 $hash, 4, "$name, unused reading $reading"; Log3 $hash, 4, "$name, unused reading $reading";
} }
@ -582,11 +583,13 @@ sub clearReadings {
1; 1;
=pod __END__
=encoding utf8
=pod
=over
=encoding utf8
=item helper =item helper
=item summary cyclical watching of readings updates =item summary cyclical watching of readings updates
=item summary_DE zyklische Überwachung von Readings auf Aktualisierung =item summary_DE zyklische Überwachung von Readings auf Aktualisierung
=begin html =begin html
@ -641,6 +644,7 @@ sub clearReadings {
<ul> <ul>
<br> <br>
<ul> <ul>
<a name="delimiter"></a><li><b>delimiter</b><br>separator for reading names ( e.g. device_reading) default _</li><br>
<a name="disable"></a><li><b>disable</b><br>deactivate/activate the device</li><br> <a name="disable"></a><li><b>disable</b><br>deactivate/activate the device</li><br>
<a name="interval"></a><li><b>interval &lt;seconds&gt;</b><br>Time interval for continuous check (default 60)</li><br> <a name="interval"></a><li><b>interval &lt;seconds&gt;</b><br>Time interval for continuous check (default 60)</li><br>
<a name="deleteUnusedReadings"></a><li><b>deleteUnusedReadings</b><br>delete unused readings (default 1)</li><br> <a name="deleteUnusedReadings"></a><li><b>deleteUnusedReadings</b><br>delete unused readings (default 1)</li><br>
@ -713,6 +717,7 @@ sub clearReadings {
<ul> <ul>
<br> <br>
<ul> <ul>
<a name="delimiter"></a><li><b>delimiter</b><br>Trennzeichen für Reading Namen (z.b. device_reading) default _</li><br>
<a name="disable"></a><li><b>disable</b><br>Deaktiviert das Device</li><br> <a name="disable"></a><li><b>disable</b><br>Deaktiviert das Device</li><br>
<a name="interval"></a><li><b>interval &lt;Sekunden&gt;</b> (default 60)<br>Zeitintervall zur kontinuierlichen Überprüfung</li><br> <a name="interval"></a><li><b>interval &lt;Sekunden&gt;</b> (default 60)<br>Zeitintervall zur kontinuierlichen Überprüfung</li><br>
<a name="deleteUnusedReadings"></a><li><b>deleteUnusedReadings</b> (default 1)<br>Readings mit dem Wert unused werden automatisch gelöscht</li><br> <a name="deleteUnusedReadings"></a><li><b>deleteUnusedReadings</b> (default 1)<br>Readings mit dem Wert unused werden automatisch gelöscht</li><br>
@ -747,7 +752,7 @@ sub clearReadings {
"supervision", "supervision",
"überwachung" "überwachung"
], ],
"version": "2.1.1", "version": "2.1.3",
"release_status": "stable", "release_status": "stable",
"author": [ "author": [
"Wzut" "Wzut"
@ -762,9 +767,8 @@ sub clearReadings {
"requires": { "requires": {
"FHEM": 5.00918799, "FHEM": 5.00918799,
"GPUtils": 0, "GPUtils": 0,
"Time::HiRes": 0, "Time::HiRes": 0
"List::Util": 0 },
},
"recommends": { "recommends": {
"FHEM::Meta": 0 "FHEM::Meta": 0
}, },
@ -775,6 +779,5 @@ sub clearReadings {
} }
=end :application/json;q=META.json =end :application/json;q=META.json
=back
=cut =cut