From 6ba58081a5caae760fb8694742d076ec40796e1e Mon Sep 17 00:00:00 2001 From: jpawlowski Date: Tue, 28 Mar 2017 11:39:13 +0000 Subject: [PATCH] 20_ROOMMATE,20_GUEST: allow optional reading name for r*_presenceDevices git-svn-id: https://svn.fhem.de/fhem/trunk@13832 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/20_GUEST.pm | 27 ++++++++++++++++++++------- fhem/FHEM/20_ROOMMATE.pm | 27 ++++++++++++++++++++------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/fhem/FHEM/20_GUEST.pm b/fhem/FHEM/20_GUEST.pm index ce0b659af..64aa1374a 100644 --- a/fhem/FHEM/20_GUEST.pm +++ b/fhem/FHEM/20_GUEST.pm @@ -316,7 +316,10 @@ sub GUEST_Notify($$) { } # process PRESENCE - if ( @presenceDevices && grep { /^$devName$/ } @presenceDevices ) { + if ( @presenceDevices + && grep { /^[\s\t ]*$devName(:[A-Za-z\d_\.\-\/]*)?[\s\t ]*$/ } + @presenceDevices ) + { my $counter = { absent => 0, @@ -324,15 +327,25 @@ sub GUEST_Notify($$) { }; foreach (@presenceDevices) { + my $r = "presence"; + my $d = $_; + if ( $d =~ +m/^[\s\t ]*([A-Za-z\d_\.\-\/]+):([A-Za-z\d_\.\-\/]+)?[\s\t ]*$/ + ) + { + $d = $1; + $reading = $2; + } + my $presenceState = - ReadingsVal( $_, "presence", ReadingsVal( $_, "state", "" ) ); + ReadingsVal( $d, $r, ReadingsVal( $d, "state", "" ) ); next unless ( $presenceState =~ -/^((absent|disappeared|unavailable)|(present|appeared|available|))$/i +m/^(absent|disappeared|unavailable|disconnected)|(present|appeared|available|connected|)$/i ); - $counter->{absent}++ if ($2); - $counter->{present}++ if ($3); + $counter->{absent}++ if ($1); + $counter->{present}++ if ($2); } if ( $counter->{absent} && !$counter->{present} ) { @@ -1471,7 +1484,7 @@ sub GUEST_StopInternalTimers($) { rg_passPresenceTo - synchronize presence state with other GUEST or GUEST devices; separte devices by space
  • - rg_presenceDevices - take over presence state from any other FHEM device. Separate more than one device with comma meaning ALL of them need to be either present or absent to trigger update of this ROOMMATE device. + rg_presenceDevices - take over presence state from any other FHEM device. Separate more than one device with comma meaning ALL of them need to be either present or absent to trigger update of this ROOMMATE device. You may optionally add a reading name separated by :, otherwise reading name presence and state will be considered.
  • rg_realname - whenever GUEST wants to use the realname it uses the value of attribute alias or group; defaults to group @@ -1771,7 +1784,7 @@ sub GUEST_StopInternalTimers($) { rg_passPresenceTo - synchronisiere die Anwesenheit mit anderen GUEST oder ROOMMATE Devices; mehrere Devices durch Leerzeichen trennen
  • - rg_presenceDevices - übernehmen des presence Status von einem anderen FHEM Device. Bei mehreren Devices diese mit Komma trennen, um ein Update des GUEST Devices auszulösen, sobald ALLE Devices entweder absent oder present sind. + rg_presenceDevices - übernehmen des presence Status von einem anderen FHEM Device. Bei mehreren Devices diese mit Komma trennen, um ein Update des GUEST Devices auszulösen, sobald ALLE Devices entweder absent oder present sind. Optional kann auch durch : abgetrennt ein Reading Name angegeben werden, ansonsten werden die Readings presence und state berücksichtigt.
  • rg_realname - wo immer GUEST den richtigen Namen verwenden möchte nutzt es den Wert des Attributs alias oder group; Standard ist group diff --git a/fhem/FHEM/20_ROOMMATE.pm b/fhem/FHEM/20_ROOMMATE.pm index 58041bbd5..c36553755 100644 --- a/fhem/FHEM/20_ROOMMATE.pm +++ b/fhem/FHEM/20_ROOMMATE.pm @@ -319,7 +319,10 @@ sub ROOMMATE_Notify($$) { } # process PRESENCE - if ( @presenceDevices && grep { /^$devName$/ } @presenceDevices ) { + if ( @presenceDevices + && grep { /^[\s\t ]*$devName(:[A-Za-z\d_\.\-\/]*)?[\s\t ]*$/ } + @presenceDevices ) + { my $counter = { absent => 0, @@ -327,15 +330,25 @@ sub ROOMMATE_Notify($$) { }; for (@presenceDevices) { + my $r = "presence"; + my $d = $_; + if ( $d =~ +m/^[\s\t ]*([A-Za-z\d_\.\-\/]+):([A-Za-z\d_\.\-\/]+)?[\s\t ]*$/ + ) + { + $d = $1; + $reading = $2; + } + my $presenceState = - ReadingsVal( $_, "presence", ReadingsVal( $_, "state", "" ) ); + ReadingsVal( $d, $r, ReadingsVal( $d, "state", "" ) ); next unless ( $presenceState =~ -/^((absent|disappeared|unavailable)|(present|appeared|available|))$/i +m/^(absent|disappeared|unavailable|disconnected)|(present|appeared|available|connected|)$/i ); - $counter->{absent}++ if ($2); - $counter->{present}++ if ($3); + $counter->{absent}++ if ($1); + $counter->{present}++ if ($2); } if ( $counter->{absent} && !$counter->{present} ) { @@ -1460,7 +1473,7 @@ sub ROOMMATE_StopInternalTimers($) { rr_passPresenceTo - synchronize presence state with other ROOMMATE or GUEST devices; separte devices by space
  • - rr_presenceDevices - take over presence state from any other FHEM device. Separate more than one device with comma meaning ALL of them need to be either present or absent to trigger update of this ROOMMATE device. + rr_presenceDevices - take over presence state from any other FHEM device. Separate more than one device with comma meaning ALL of them need to be either present or absent to trigger update of this ROOMMATE device. You may optionally add a reading name separated by :, otherwise reading name presence and state will be considered.
  • rr_realname - whenever ROOMMATE wants to use the realname it uses the value of attribute alias or group; defaults to group @@ -1760,7 +1773,7 @@ sub ROOMMATE_StopInternalTimers($) { rr_passPresenceTo - synchronisiere die Anwesenheit mit anderen ROOMMATE oder GUEST Devices; mehrere Devices durch Leerzeichen trennen
  • - rr_presenceDevices - übernehmen des presence Status von einem anderen FHEM Device. Bei mehreren Devices diese mit Komma trennen, um ein Update des ROOMMATE Devices auszulösen, sobald ALLE Devices entweder absent oder present sind. + rr_presenceDevices - übernehmen des presence Status von einem anderen FHEM Device. Bei mehreren Devices diese mit Komma trennen, um ein Update des ROOMMATE Devices auszulösen, sobald ALLE Devices entweder absent oder present sind. Optional kann auch durch : abgetrennt ein Reading Name angegeben werden, ansonsten werden die Readings presence und state berücksichtigt.
  • rr_realname - wo immer ROOMMATE den richtigen Namen verwenden möchte nutzt es den Wert des Attributs alias oder group; Standard ist group