From ca8a0ee0478a149a0ad65ffeabf0745d0f6aa271 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Sun, 6 Apr 2014 06:24:47 +0000 Subject: [PATCH] notify/FileLog/FHEMWEB/watchdog/eventTypes: addStateEvent attribute added git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@5452 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/01_FHEMWEB.pm | 23 +++++++++++++++-------- fhem/FHEM/91_eventTypes.pm | 5 +++-- fhem/FHEM/91_notify.pm | 24 ++++++++++++++++++++---- fhem/FHEM/91_watchdog.pm | 11 +++++++---- fhem/FHEM/92_FileLog.pm | 12 ++++++++---- fhem/fhem.pl | 38 ++++++++++++++++++++++++++++++++++---- 6 files changed, 87 insertions(+), 26 deletions(-) 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 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;