From 06075b079fd3f536fddf32c88c3a1d03acab50b7 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Tue, 5 Sep 2017 09:37:33 +0000 Subject: [PATCH] FHEM2FHEM: addStateEvent attribute (Forum #76229) git-svn-id: https://svn.fhem.de/fhem/trunk@15006 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/93_FHEM2FHEM.pm | 53 +++++++++++++++++++++++++++++---------- fhem/FHEM/98_telnet.pm | 7 +++--- fhem/fhem.pl | 9 ++++--- 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 21cc8d9f2..aeba7b56e 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # 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. + - bugfix: FHEM2FHEM: addStateEvent attribute (Forum #76229) - bugfix: HttpUtils: use urlDecode for password in URL (Forum #76230) - bugfix: 74_GardenaSmartDevice.pm: fix little Commandref bug's - new: 73_GardenaSmartBridge/74_GardenaSmartDevice control your Gardena diff --git a/fhem/FHEM/93_FHEM2FHEM.pm b/fhem/FHEM/93_FHEM2FHEM.pm index a1e6200b6..34dd0565a 100644 --- a/fhem/FHEM/93_FHEM2FHEM.pm +++ b/fhem/FHEM/93_FHEM2FHEM.pm @@ -26,13 +26,14 @@ FHEM2FHEM_Initialize($) $hash->{WriteFn} = "FHEM2FHEM_Write"; $hash->{ReadyFn} = "FHEM2FHEM_Ready"; $hash->{SetFn} = "FHEM2FHEM_Set"; + $hash->{AttrFn} = "FHEM2FHEM_Attr"; $hash->{noRawInform} = 1; # Normal devices $hash->{DefFn} = "FHEM2FHEM_Define"; $hash->{UndefFn} = "FHEM2FHEM_Undef"; - $hash->{AttrList}= "dummy:1,0 disable:0,1 ". - "disabledForIntervals excludeEvents eventOnly:1,0"; + $hash->{AttrList}= "addStateEvent:1,0 dummy:1,0 disable:0,1 ". + "disabledForIntervals eventOnly:1,0 excludeEvents"; } ##################################### @@ -266,8 +267,9 @@ FHEM2FHEM_OpenDev($$) DoTrigger($name, "CONNECTED") if($reopen); syswrite($hash->{TCPDev}, $hash->{portpassword} . "\n") if($hash->{portpassword}); + my $type = AttrVal($hash->{NAME},"addStateEvent",0) ? "onWithState" : "on"; my $msg = $hash->{informType} eq "LOG" ? - "inform on $hash->{regexp}" : "inform raw"; + "inform $type $hash->{regexp}" : "inform raw"; syswrite($hash->{TCPDev}, $msg . "\n"); }; @@ -329,6 +331,19 @@ FHEM2FHEM_Set($@) return undef; } +sub +FHEM2FHEM_Attr(@) +{ + my ($type, $devName, $attrName, @param) = @_; + my $hash = $defs{$devName}; + + return undef if($attrName ne "addStateEvent"); + $attr{$devName}{$attrName} = 1; + FHEM2FHEM_CloseDev($hash); + FHEM2FHEM_OpenDev($hash, 1); + return undef; +} + 1; =pod @@ -428,6 +443,12 @@ FHEM2FHEM_Set($@) if set, generate only events, do not set corresponding readings. This is a compatibility feature, available only for LOG-Mode. +
  • addStateEvent
    + if set, state events are transmitted correctly. Notes: this is relevant + only with LOG mode, setting it will generate an additional "reappeared" + Log entry, and the remote FHEM must support inform onWithState (i.e. must + be up to date). +
  • excludeEvents <regexp> do not publish events matching <regexp>
  • @@ -530,16 +551,22 @@ FHEM2FHEM_Set($@) Attribute diff --git a/fhem/FHEM/98_telnet.pm b/fhem/FHEM/98_telnet.pm index 224a7bd58..bab883691 100644 --- a/fhem/FHEM/98_telnet.pm +++ b/fhem/FHEM/98_telnet.pm @@ -33,7 +33,8 @@ telnet_Initialize($) $cmds{inform} = { Fn=>"CommandTelnetInform", ClientFilter => "telnet", - Hlp=>"{on|off|log|raw|timer|status},echo all events to this client" }; + Hlp=>"{on|onWithState|off|log|raw|timer|status},". + "echo all events to this client" }; } sub @@ -376,8 +377,8 @@ CommandTelnetInform($$) return if(!$cl); my $name = $cl->{NAME}; - return "Usage: inform {on|off|raw|timer|log|status} [regexp]" - if($param !~ m/^(on|off|raw|timer|log|status)/); + return "Usage: inform {on|onWithState|off|raw|timer|log|status} [regexp]" + if($param !~ m/^(on|onWithState|off|raw|timer|log|status)/); if($param eq "status") { my $i = $inform{$name}; diff --git a/fhem/fhem.pl b/fhem/fhem.pl index 3bf3c637f..4dced4987 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -3378,7 +3378,6 @@ DoTrigger($$@) ################ # Inform if($hash->{CHANGED}) { # It gets deleted sometimes (?) - $max = int(@{$hash->{CHANGED}}); # can be enriched in the notifies foreach my $c (keys %inform) { my $dc = $defs{$c}; if(!$dc || $dc->{NR} != $inform{$c}{NR}) { @@ -3392,11 +3391,13 @@ DoTrigger($$@) $tn .= sprintf(".%03d", $microseconds/1000); } my $re = $inform{$c}{regexp}; + my $events = deviceEvents($hash, $inform{$c}{type} =~ m/WithState/); + $max = int(@{$events}); for(my $i = 0; $i < $max; $i++) { - my $state = $hash->{CHANGED}[$i]; - next if($re && !($dev =~ m/$re/ || "$dev:$state" =~ m/$re/)); + my $event = $events->[$i]; + next if($re && !($dev =~ m/$re/ || "$dev:$event" =~ m/$re/)); addToWritebuffer($dc,($inform{$c}{type} eq "timer" ? "$tn " : ""). - "$hash->{TYPE} $dev $state\n"); + "$hash->{TYPE} $dev $event\n"); } } }