From 97886b4b72751f3ab7bc3414a85bdb1fcbe2e305 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Mon, 27 Feb 2012 16:59:42 +0000 Subject: [PATCH] Bugifx: wrong inform data when notifies generate additional device events git-svn-id: https://svn.fhem.de/fhem/trunk@1299 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/fhem.pl | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/fhem/fhem.pl b/fhem/fhem.pl index a68cd339c..81781a781 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -1224,7 +1224,6 @@ CommandDefine($$) my ($cl, $def) = @_; my @a = split("[ \t][ \t]*", $def, 3); my $name = $a[0]; - return "Usage: define " if(int(@a) < 2); return "$name already defined, delete it first" if(defined($defs{$name})); @@ -2157,7 +2156,11 @@ DoTrigger($$) return "" if(!defined($defs{$dev})); if(defined($ns)) { - $defs{$dev}{CHANGED}[0] = $ns; + if($defs{$dev}{CHANGED}) { + push @{$defs{$dev}{CHANGED}}, $ns; + } else { + $defs{$dev}{CHANGED}[0] = $ns; + } } elsif(!defined($defs{$dev}{CHANGED})) { return ""; } @@ -2192,29 +2195,30 @@ DoTrigger($$) my $r = CallFn($n, "NotifyFn", $defs{$n}, $defs{$dev}); $ret .= $r if($r); } - delete($defs{$dev}{INTRIGGER}); - } - ################ - # Inform - if($defs{$dev}{CHANGED}) { # It gets deleted sometimes (?) - $max = int(@{$defs{$dev}{CHANGED}}); # can be enriched in the notifies - foreach my $c (keys %client) { # Do client loop first, is cheaper - next if(!$client{$c}{inform} || $client{$c}{inform} eq "raw"); - my $tn = TimeNow(); - if($attr{global}{mseclog}) { - my ($seconds, $microseconds) = gettimeofday(); - $tn .= sprintf(".%03d", $microseconds/1000); - } - my $re = $client{$c}{informRegexp}; - for(my $i = 0; $i < $max; $i++) { - my $state = $defs{$dev}{CHANGED}[$i]; - next if($re && $state !~ m/$re/); - syswrite($client{$c}{fd}, - ($client{$c}{inform} eq "timer" ? "$tn " : "") . - "$defs{$dev}{TYPE} $dev $state\n"); + ################ + # Inform + if($defs{$dev}{CHANGED}) { # It gets deleted sometimes (?) + $max = int(@{$defs{$dev}{CHANGED}}); # can be enriched in the notifies + foreach my $c (keys %client) { # Do client loop first, is cheaper + next if(!$client{$c}{inform} || $client{$c}{inform} eq "raw"); + my $tn = TimeNow(); + if($attr{global}{mseclog}) { + my ($seconds, $microseconds) = gettimeofday(); + $tn .= sprintf(".%03d", $microseconds/1000); + } + my $re = $client{$c}{informRegexp}; + for(my $i = 0; $i < $max; $i++) { + my $state = $defs{$dev}{CHANGED}[$i]; + next if($re && $state !~ m/$re/); + syswrite($client{$c}{fd}, + ($client{$c}{inform} eq "timer" ? "$tn " : "") . + "$defs{$dev}{TYPE} $dev $state\n"); + } } } + + delete($defs{$dev}{INTRIGGER}); }