diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm
index 7ed582499..d6b197f97 100755
--- a/fhem/FHEM/01_FHEMWEB.pm
+++ b/fhem/FHEM/01_FHEMWEB.pm
@@ -121,6 +121,7 @@ FHEMWEB_Initialize($)
HTTPS:1,0
JavaScripts
SVGcache:1,0
+ addStateEvent
allowedCommands
allowfrom
basicAuth
@@ -2062,6 +2063,8 @@ FW_Notify($$)
my @data;
my %extPage;
+ my $isRaw = ($h->{type} =~ m/raw/);
+ my $events = deviceEvents($dev, AttrVal($FW_wname, "addStateEvent",!$isRaw));
if($h->{type} =~ m/status/) {
# Why is saving this stuff needed? FLOORPLAN?
@@ -2084,31 +2087,31 @@ FW_Notify($$)
push @data, "$dn<<$dev->{STATE}<<$txt";
#Add READINGS
- if($dev->{CHANGED}) { # It gets deleted sometimes (?)
+ if($events) { # It gets deleted sometimes (?)
my $tn = TimeNow();
- my $max = int(@{$dev->{CHANGED}});
+ my $max = int(@{$events});
for(my $i = 0; $i < $max; $i++) {
- if( $dev->{CHANGED}[$i] !~ /: /) {
+ if( $events->[$i] !~ /: /) {
next; #ignore 'set' commands
}
- my ($readingName,$readingVal) = split(": ",$dev->{CHANGED}[$i],2);
+ my ($readingName,$readingVal) = split(": ",$events->[$i],2);
push @data, "$dn-$readingName<<$readingVal<<$readingVal";
push @data, "$dn-$readingName-ts<<$tn<<$tn";
}
}
}
- if($h->{type} =~ m/raw/) {
- if($dev->{CHANGED}) { # It gets deleted sometimes (?)
+ if($isRaw) {
+ if($events) { # It gets deleted sometimes (?)
my $tn = TimeNow();
if($attr{global}{mseclog}) {
my ($seconds, $microseconds) = gettimeofday();
$tn .= sprintf(".%03d", $microseconds/1000);
}
- my $max = int(@{$dev->{CHANGED}});
+ my $max = int(@{$events});
my $dt = $dev->{TYPE};
for(my $i = 0; $i < $max; $i++) {
- push @data,("$tn $dt $dn ".$dev->{CHANGED}[$i]."
");
+ push @data,("$tn $dt $dn ".$events->[$i]."
");
}
}
}
@@ -2618,6 +2621,8 @@ FW_ActivateInform()
+
addStateEvent
+
allowedCommands
A comma separated list of commands allowed from this FHEMWEB
@@ -3123,6 +3128,8 @@ FW_ActivateInform()
+ addStateEvent
+
allowedCommands
Eine Komma getrennte Liste der erlaubten Befehle. Bei einer leeren
diff --git a/fhem/FHEM/91_eventTypes.pm b/fhem/FHEM/91_eventTypes.pm
index 60a73050a..2b3f21cc0 100755
--- a/fhem/FHEM/91_eventTypes.pm
+++ b/fhem/FHEM/91_eventTypes.pm
@@ -66,14 +66,15 @@ eventTypes_Notify($$)
my $ln = $me->{NAME};
return "" if($attr{$ln} && $attr{$ln}{disable});
- return if(!$eventSrc->{CHANGED});
+ my $events = deviceEvents($eventSrc, 1);
+ return if(!$events);
my $t = $eventSrc->{TYPE};
my $n = $eventSrc->{NAME};
return if(!defined($n) || !defined($t) || $n eq "global");
my $ret = "";
- foreach my $oe (@{$eventSrc->{CHANGED}}) {
+ foreach my $oe (@{$events}) {
$oe = "" if(!defined($oe));
next if($oe =~ m/ CULHM (SND|RCV) /);
next if($oe =~ m/ UNKNOWNCODE /);
diff --git a/fhem/FHEM/91_notify.pm b/fhem/FHEM/91_notify.pm
index 85a323938..d4c94b0e7 100755
--- a/fhem/FHEM/91_notify.pm
+++ b/fhem/FHEM/91_notify.pm
@@ -14,7 +14,7 @@ notify_Initialize($)
$hash->{DefFn} = "notify_Define";
$hash->{NotifyFn} = "notify_Exec";
$hash->{AttrFn} = "notify_Attr";
- $hash->{AttrList} = "disable:0,1 disabledForIntervals forwardReturnValue:0,1 showTriggerTime:0,1";
+ $hash->{AttrList} = "disable:0,1 disabledForIntervals forwardReturnValue:0,1 showTriggerTime:0,1 addStateEvent:0,1";
}
@@ -56,13 +56,14 @@ notify_Exec($$)
my $n = $dev->{NAME};
my $re = $ntfy->{REGEXP};
- return if(!$dev->{CHANGED}); # Some previous notify deleted the array.
- my $max = int(@{$dev->{CHANGED}});
+ my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
+ return if(!$events); # Some previous notify deleted the array.
+ my $max = int(@{$events});
my $t = $dev->{TYPE};
my $ret = "";
for (my $i = 0; $i < $max; $i++) {
- my $s = $dev->{CHANGED}[$i];
+ my $s = $events->[$i];
$s = "" if(!defined($s));
my $found = ($n =~ m/^$re$/ || "$n:$s" =~ m/^$re$/);
if(!$found && AttrVal($n, "eventMap", undef)) {
@@ -239,6 +240,21 @@ notify_Attr(@)
Show the timestamp of the last execution as the status (STATE) of the
notify instance. Default is 1 (on).
+
+
+ addStateEvent
+ The event associated with the state Reading is special, as the "state: "
+ string is stripped, i.e $EVENT is not "state: on" but just "on". In some
+ circumstances it is desireable to get an additional event where "state: "
+ is not stripped. In such a case the addStateEvent attribute should be
+ set to 1 (default is 0, i.e. do not generate an additional event).
+
+ Note 1: you have to set this attribute for the event "receiver", i.e.
+ notify, FileLog, etc.
+
+ Note 2: this attribute will only work for events generated by devices
+ supporting the readingFnAttributes.
+
diff --git a/fhem/FHEM/91_watchdog.pm b/fhem/FHEM/91_watchdog.pm
index 9bc31f1d2..187d19ac7 100755
--- a/fhem/FHEM/91_watchdog.pm
+++ b/fhem/FHEM/91_watchdog.pm
@@ -16,7 +16,7 @@ watchdog_Initialize($)
$hash->{UndefFn} = "watchdog_Undef";
$hash->{NotifyFn} = "watchdog_Notify";
$hash->{AttrList} = "disable:0,1 disabledForIntervals ".
- "regexp1WontReactivate:0,1";
+ "regexp1WontReactivate:0,1 addStateEvent:0,1";
}
@@ -72,10 +72,12 @@ watchdog_Notify($$)
my $n = $dev->{NAME};
my $re1 = $watchdog->{RE1};
my $re2 = $watchdog->{RE2};
- my $max = int(@{$dev->{CHANGED}});
+
+ my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
+ my $max = int(@{$events});
for (my $i = 0; $i < $max; $i++) {
- my $s = $dev->{CHANGED}[$i];
+ my $s = $events->[$i];
$s = "" if(!defined($s));
my $dotTrigger = ($ln eq $n && $s eq "."); # trigger w .
@@ -324,8 +326,9 @@ watchdog_Undef($$)
Get
- Attributes
+ Attribute
+ - addStateEvent
- disable
- disabledForIntervals
- regexp1WontReactivate
diff --git a/fhem/FHEM/92_FileLog.pm b/fhem/FHEM/92_FileLog.pm
index 510f078d5..dcabd6e19 100755
--- a/fhem/FHEM/92_FileLog.pm
+++ b/fhem/FHEM/92_FileLog.pm
@@ -37,7 +37,8 @@ FileLog_Initialize($)
$hash->{NotifyFn} = "FileLog_Log";
$hash->{AttrFn} = "FileLog_Attr";
# logtype is used by the frontend
- $hash->{AttrList} = "disable:0,1 logtype nrarchive archivedir archivecmd";
+ $hash->{AttrList} = "disable:0,1 logtype ".
+ "nrarchive archivedir archivecmd addStateEvent:0,1";
$hash->{FW_summaryFn} = "FileLog_fhemwebFn";
$hash->{FW_detailFn} = "FileLog_fhemwebFn";
@@ -129,18 +130,19 @@ FileLog_Log($$)
my $ln = $log->{NAME};
return if($attr{$ln} && $attr{$ln}{disable});
- return if(!$dev || !defined($dev->{CHANGED}));
+ my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
+ return if(!$events);
my $n = $dev->{NAME};
my $re = $log->{REGEXP};
- my $max = int(@{$dev->{CHANGED}});
+ my $max = int(@{$events});
my $tn = $dev->{NTFY_TRIGGERTIME};
my $ct = $dev->{CHANGETIME};
my $fh;
my $switched;
for (my $i = 0; $i < $max; $i++) {
- my $s = $dev->{CHANGED}[$i];
+ my $s = $events->[$i];
$s = "" if(!defined($s));
my $t = (($ct && $ct->[$i]) ? $ct->[$i] : $tn);
if($n =~ m/^$re$/ || "$n:$s" =~ m/^$re$/ || "$t:$n:$s" =~ m/^$re$/) {
@@ -1397,6 +1399,7 @@ FileLog_sampleDataFn($$$$$)
- disable
+ - addStateEvent
- logtype
@@ -1439,6 +1442,7 @@ FileLog_sampleDataFn($$$$$)
Text).Eine gnuplot-Definition ist nicht notwendig.
Beispiel:
attr ks300log1 logtype
temp4rain10:Temp/Rain,hum6wind8:Hum/Wind,text:Raw-data
+
diff --git a/fhem/fhem.pl b/fhem/fhem.pl
index ab07784e5..f20e53d4e 100755
--- a/fhem/fhem.pl
+++ b/fhem/fhem.pl
@@ -495,7 +495,7 @@ $fhem_started = time;
$attr{global}{motd} .= "Running with root privileges."
if($^O !~ m/Win/ && $<==0 && $attr{global}{motd} =~ m/^$sc_text/);
$attr{global}{motd} .=
- "\nRestart fhem for a new check if the problem is fixed,\n".
+ "\nRestart FHEM for a new check if the problem is fixed,\n".
"or set the global attribute motd to none to supress this message.\n"
if($attr{global}{motd} =~ m/^$sc_text\n\n./);
my $motd = $attr{global}{motd};
@@ -2651,6 +2651,27 @@ GetTimeSpec($)
}
+sub
+deviceEvents($$)
+{
+ my ($hash, $withState) = @_;
+
+ return undef if(!$hash || !$hash->{CHANGED});
+
+ if($withState) {
+ my $cws = $hash->{CHANGEDWITHSTATE};
+ if(defined($cws)){
+ if(int(@{$cws}) == 0) {
+ @{$cws} = @{$hash->{CHANGED}};
+ push @{$cws}, "state: $hash->{READINGS}{state}{VAL}"
+ if($hash->{READINGS} && $hash->{READINGS}{state});
+ }
+ return $cws;
+ }
+ }
+ return $hash->{CHANGED};
+}
+
#####################################
# Do the notification
sub
@@ -2739,7 +2760,10 @@ DoTrigger($$@)
$oldvalue{$dev}{TIME} = TimeNow();
$oldvalue{$dev}{VAL} = $hash->{STATE};
- delete($hash->{CHANGED}) if(!defined($hash->{INTRIGGER}));
+ if(!defined($hash->{INTRIGGER})) {
+ delete($hash->{CHANGED});
+ delete($hash->{CHANGEDWITHSTATE});
+ }
Log 3, "NTFY return: $ret" if($ret);
@@ -3559,7 +3583,10 @@ readingsEndUpdate($$)
if($dotrigger && $init_done) {
DoTrigger($name, undef, 0) if(!$readingsUpdateDelayTrigger);
} else {
- delete($hash->{CHANGED}) if(!defined($hash->{INTRIGGER}));
+ if(!defined($hash->{INTRIGGER})) {
+ delete($hash->{CHANGED});
+ delete($hash->{CHANGEDWITHSTATE})
+ }
}
return undef;
@@ -3636,7 +3663,10 @@ readingsBulkUpdate($$$@)
my $rv = "$reading: $value";
if($changed) {
- $rv = "$value" if($reading eq "state");
+ if($reading eq "state") {
+ $rv = "$value";
+ $hash->{CHANGEDWITHSTATE} = [];
+ }
addEvent($hash, $rv);
}
return $rv;