From a03099c095477abad54c6adad13bc2ba15949631 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Sun, 14 Jun 2015 18:19:13 +0000 Subject: [PATCH] 10_ZWave.pm: wakeup fixes (Forum #37418) git-svn-id: https://svn.fhem.de/fhem/trunk@8749 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_ZWDongle.pm | 11 ++++++-- fhem/FHEM/10_ZWave.pm | 61 +++++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/fhem/FHEM/00_ZWDongle.pm b/fhem/FHEM/00_ZWDongle.pm index 4976f238d..1bd579441 100755 --- a/fhem/FHEM/00_ZWDongle.pm +++ b/fhem/FHEM/00_ZWDongle.pm @@ -516,15 +516,20 @@ ZWDongle_Write($$$) # assure that wakeupNoMoreInformation is the last message on the sendStack if($msg =~ m/^01....13(..)/) { my $wNMIre = '01....13..028408'; + + if($ss->[0] =~ m/$wNMIre/) { + Log3 $hash, 2, + "ZWDongle_Write: command after wakeupNoMoreInformation dropped"; + return; + } + my $wNMI; - my $w1 = shift @{$ss} if($ss->[0] =~ m/$wNMIre/); # keep the first, #35126 my @s = grep { /^$wNMIre/ ? ($wNMI=$_,0):1 } @{$ss}; if($wNMI) { - Log3 $hash, 5, "ZWDongle_Write reordered sendStack"; + Log3 $hash, 5, "ZWDongle_Write wakeupNoMoreInformation moved to the end"; push @s, $wNMI; $hash->{SendStack} = \@s; } - unshift($hash->{SendStack}, $w1) if($w1); } ZWave_ProcessSendStack($hash); diff --git a/fhem/FHEM/10_ZWave.pm b/fhem/FHEM/10_ZWave.pm index 997c1871b..9b174a416 100755 --- a/fhem/FHEM/10_ZWave.pm +++ b/fhem/FHEM/10_ZWave.pm @@ -1525,6 +1525,31 @@ ZWave_getHash($$$) return $ptr; } +sub +ZWave_sendWakeup($) +{ + my ($hash) = @_; + + my $wu = $hash->{WakeUp}; + if($wu && @{$wu}) { + foreach my $wuCmd (@{$wu}) { + IOWrite($hash, "00", ZWave_clockAdjust($wuCmd)); + Log3 $hash, 4, "Sending stored command: $wuCmd"; + } + @{$hash->{WakeUp}}=(); + #send a final wakeupNoMoreInformation + my $nodeId = $hash->{id}; + Log3 $hash, 4, "Sending wakeupNoMoreInformation to node: $nodeId"; + IOWrite($hash, "00", "13${nodeId}02840805"); + + } else { # Wait for commands via notify + InternalTimer(gettimeofday()+0.1, sub($) { + my $nodeId = $hash->{id}; + IOWrite($hash, "00", "13${nodeId}02840805"); + }, $hash, 0); + } +} + ################################### # 0004000a03250300 (sensor binary off for id 11) # { ZWave_Parse($defs{zd}, "0004000c028407", "") } @@ -1613,17 +1638,13 @@ ZWave_Parse($$@) my $ret = ZWave_SetClasses($homeId, $id, $type6, $classes); my $hash = $modules{ZWave}{defptr}{"$homeId $id"}; - if($hash && $hash->{WakeUp} && @{$hash->{WakeUp}}) { # Always the base hash - foreach my $wuCmd (@{$hash->{WakeUp}}) { - IOWrite($hash, "00", ZWave_clockAdjust($wuCmd)); - Log3 $hash, 4, "Sending stored command: $wuCmd"; + if($hash) { + ZWave_sendWakeup($hash) if($hash); + $hash->{lastMsgTimestamp} = time(); + if(!$ret) { + readingsSingleUpdate($hash, "CMD", $cmd, 1); # forum:20884 + return $hash->{NAME}; } - @{$hash->{WakeUp}}=(); - } - - if(!$ret) { - readingsSingleUpdate($hash, "CMD", $cmd, 1); # forum:20884 - return $hash->{NAME}; } return $ret; @@ -1751,25 +1772,7 @@ ZWave_Parse($$@) push @event, "UNPARSED:$className $arg" if(!$matched); } - if($arg =~ m/^028407/) { - my $wu = $baseHash->{WakeUp}; - if($wu && @{$wu}) { - foreach my $wuCmd (@{$wu}) { - IOWrite($hash, "00", ZWave_clockAdjust($wuCmd)); - Log3 $hash, 4, "Sending stored command: $wuCmd"; - } - @{$baseHash->{WakeUp}}=(); - #send a final wakeupNoMoreInformation - my $nodeId = $baseHash->{id}; - Log3 $hash, 4, "Sending wakeupNoMoreInformation to node: $nodeId"; - IOWrite($hash, "00", "13${nodeId}02840805"); - } else { - InternalTimer(gettimeofday()+0.1, sub($) { - my $nodeId = $hash->{id}; - IOWrite($hash, "00", "13${nodeId}02840805"); - }, $hash, 0); - } - } + ZWave_sendWakeup($baseHash) if($arg =~ m/^028407/); $baseHash->{lastMsgTimestamp} = time(); return "" if(!@event);