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:
parent
7a71c49190
commit
e5655f2e28
@ -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 <seconds></b><br>Time interval for continuous check (default 60)</li><br>
|
<a name="interval"></a><li><b>interval <seconds></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 <Sekunden></b> (default 60)<br>Zeitintervall zur kontinuierlichen Überprüfung</li><br>
|
<a name="interval"></a><li><b>interval <Sekunden></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
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user