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
- dummy
- - disable
- - disabledForIntervals
- - eventOnly
- falls gesetzt, werden nur die Events generiert, und es wird kein
- Reading aktualisiert. Ist nur im LOG-Mode aktiv.
-
- - excludeEvents <regexp>
- die auf das <regexp> zutreffende Events werden nicht
- bereitgestellt.
-
+ - disable
+ - disabledForIntervals
+ - eventOnly
+ falls gesetzt, werden nur die Events generiert, und es wird kein
+ Reading aktualisiert. Ist nur im LOG-Mode aktiv.
+
+ - addStateEvent
+ falls gesetzt, werden state Events als solche uebertragen. Zu beachten:
+ das Attribut ist nur für LOG-Mode relevant, beim Setzen wird eine
+ zusätzliche reopened Logzeile generiert, und die andere Seite muss
+ aktuell sein.
+
+ - excludeEvents <regexp>
+ die auf das <regexp> zutreffende Events werden nicht
+ bereitgestellt.
+
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");
}
}
}