From 3da1d7ee034bc5be8bfff66478082105d1d407f1 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Sun, 6 Sep 2015 19:59:14 +0000 Subject: [PATCH] 00_ZWDongle.pm/10_ZWave.pm: fix initialization issues. (Forum #40594) git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@9208 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_ZWDongle.pm | 10 ++++++++-- fhem/FHEM/10_ZWave.pm | 13 ++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/fhem/FHEM/00_ZWDongle.pm b/fhem/FHEM/00_ZWDongle.pm index 146a75452..148a9afab 100755 --- a/fhem/FHEM/00_ZWDongle.pm +++ b/fhem/FHEM/00_ZWDongle.pm @@ -36,6 +36,7 @@ my %sets = ( "sendNIF" => { cmd => "12%02x05@" },# ZW_SEND_NODE_INFORMATION "setNIF" => { cmd => "03%02x%02x%02x%02x" }, # SERIAL_API_APPL_NODE_INFORMATION + "timeouts" => { cmd => "06%02x%02x" }, # SERIAL_API_SET_TIMEOUTS "reopen" => { cmd => "" }, ); @@ -50,8 +51,8 @@ my %gets = ( "nodeInfo" => "41%02x", # ZW_GET_NODE_PROTOCOL_INFO "nodeList" => "02", # SERIAL_API_GET_INIT_DATA "random" => "1c%02x", # ZW_GET_RANDOM - "timeouts" => "06%02x%02x", # SERIAL_API_SET_TIMEOUTS "version" => "15", # ZW_GET_VERSION + "timeouts" => "06", # SERIAL_API_SET_TIMEOUTS "raw" => "%s", # hex ); @@ -291,7 +292,7 @@ ZWDongle_Set($@) my $par = $sets{$type}{param}; if($par && !$par->{noArg}) { return "Unknown argument for $type, choose one of ".join(" ",keys %{$par}) - if(!defined($par->{$a[0]})); + if(!$a[0] || !defined($par->{$a[0]})); $a[0] = $par->{$a[0]}; } @@ -620,6 +621,11 @@ ZWDongle_Read($@) Log3 $name, 4, "ZWDongle_Read $name: CAN received"; $hash->{MaxSendRetries}++ if($hash->{MaxSendRetries}<7); $data = substr($data, 2); + if(!$init_done) { # InternalTimer wont work + $hash->{WaitForAck} = 0; + $hash->{SendRetries}++; + select(undef, undef, undef, 0.1); + } next; } diff --git a/fhem/FHEM/10_ZWave.pm b/fhem/FHEM/10_ZWave.pm index 7921820bb..178ccb755 100755 --- a/fhem/FHEM/10_ZWave.pm +++ b/fhem/FHEM/10_ZWave.pm @@ -2369,9 +2369,9 @@ ZWave_getHash($$$) } sub -ZWave_wakeupTimer($) +ZWave_wakeupTimer($$) { - my ($hash) = @_; + my ($hash, $direct) = @_; my $now = gettimeofday(); if(!$hash->{wakeupAlive}) { @@ -2379,7 +2379,7 @@ ZWave_wakeupTimer($) $hash->{lastMsgSent} = $now; InternalTimer($now+0.1, "ZWave_wakeupTimer", $hash, 0); - } elsif($now - $hash->{lastMsgSent} > 1) { + } elsif(!$direct && $now - $hash->{lastMsgSent} > 2) { if(!$hash->{SendStack}) { my $nodeId = $hash->{id}; my $cmdEf = (AttrVal($hash->{NAME},"noExplorerFrames",0)==0 ? "25":"05"); @@ -2389,6 +2389,7 @@ ZWave_wakeupTimer($) delete $hash->{wakeupAlive}; } else { + return if($direct); InternalTimer($now+0.1, "ZWave_wakeupTimer", $hash, 0); } @@ -2551,6 +2552,8 @@ ZWave_Parse($$@) "SECURITY disabled, device does not support SECURITY command class"; } } + ZWave_wakeupTimer($dh, 1) + if(index(AttrVal($dh->{NAME}, "classes", ""), "WAKE_UP") >= 0); return ZWave_execInits($dh, 0); } @@ -2562,7 +2565,7 @@ ZWave_Parse($$@) my $hash = $modules{ZWave}{defptr}{"$homeId $id"}; if($hash) { if(index(AttrVal($hash->{NAME}, "classes", ""), "WAKE_UP") >= 0) { - ZWave_wakeupTimer($hash); + ZWave_wakeupTimer($hash, 1); ZWave_processSendStack($hash, undef, 0); } @@ -2716,7 +2719,7 @@ ZWave_Parse($$@) } if($arg =~ m/^028407/) { # wakeup:notification - ZWave_wakeupTimer($hash); + ZWave_wakeupTimer($hash, 1); ZWave_processSendStack($hash, undef, 0); }