command resend and HMLAN performance improvement

git-svn-id: https://svn.fhem.de/fhem/trunk@2454 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2013-01-08 10:11:47 +00:00
parent 81c42fdb2c
commit 68afbe4306
2 changed files with 52 additions and 15 deletions

View File

@ -317,6 +317,7 @@ HMLAN_Parse($$)
# 0081=open # 0081=open
# 0100=with 'E', not 'R'. # 0100=with 'E', not 'R'.
# 0081=open # 0081=open
# 04xx=nothing will be sent anymore? try restart
# HMLAN_SimpleWrite($hash, '+'.$src) if (($letter eq 'R') && $src ne AttrVal($name, "hmId", $mFld[4])); # HMLAN_SimpleWrite($hash, '+'.$src) if (($letter eq 'R') && $src ne AttrVal($name, "hmId", $mFld[4]));
@ -324,6 +325,16 @@ HMLAN_Parse($$)
# HMLAN_SimpleWrite($hash, '-'.$src); # HMLAN_SimpleWrite($hash, '-'.$src);
# HMLAN_SimpleWrite($hash, '+'.$src); # HMLAN_SimpleWrite($hash, '+'.$src);
# } # }
if($mFld[1] =~ m/^04/){
Log $ll5, 'HMLAN_Parse: problems detected - please restart HMLAN';
#foreach (keys %lhash){delete ($lhash{$_})};# does not help
#DevIo_Disconnected($hash) ;# does not help
}
if($mFld[1] =~ m/^02/){
Log $ll5, 'HMLAN_Parse: restart HMLAN might be necessary';
HMLAN_SimpleWrite($hash, '-'.$src);# todo not proven how to get out of this situation
HMLAN_SimpleWrite($hash, '+'.$src);
}
$dmsg .= ":NACK" if($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R'); $dmsg .= ":NACK" if($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R');
$hash->{uptime} = HMLAN_uptime($mFld[2]); $hash->{uptime} = HMLAN_uptime($mFld[2]);
@ -364,7 +375,6 @@ sub
HMLAN_Ready($) HMLAN_Ready($)
{ {
my ($hash) = @_; my ($hash) = @_;
return DevIo_OpenDev($hash, 1, "HMLAN_DoInit"); return DevIo_OpenDev($hash, 1, "HMLAN_DoInit");
} }
@ -384,11 +394,11 @@ HMLAN_SimpleWrite(@)
# tested allowes no more then 2 byte/ms incl overhead # tested allowes no more then 2 byte/ms incl overhead
# It is even slower if HMLAN waits for acks, acks are missing,... # It is even slower if HMLAN waits for acks, acks are missing,...
my $bytPend = $hash->{helper}{dPend} - my $bytPend = $hash->{helper}{dPend} -
int(($tn - $hash->{helper}{lastSend})*2000); int(($tn - $hash->{helper}{lastSend})*4000);
$bytPend = 0 if ($bytPend < 0); $bytPend = 0 if ($bytPend < 0);
$hash->{helper}{dPend} = $bytPend + length($msg); $hash->{helper}{dPend} = $bytPend + length($msg);
$hash->{helper}{lastSend} = $tn; $hash->{helper}{lastSend} = $tn;
my $wait = $bytPend/2000; # HMLAN my $wait = $bytPend/4000; # HMLAN
# => wait time to protect HMLAN overload # => wait time to protect HMLAN overload
# my $wait = $bytPend>>11; # fast divide by 2048 # my $wait = $bytPend>>11; # fast divide by 2048

View File

@ -198,6 +198,7 @@ my %culHmModel=(
"0092" => {name=>"Schueco_263-144" ,cyc=>'' ,rxt=>'c' ,lst=>'4' ,chn=>"",}, "0092" => {name=>"Schueco_263-144" ,cyc=>'' ,rxt=>'c' ,lst=>'4' ,chn=>"",},
"0093" => {name=>"Schueco_263-158" ,cyc=>'' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "0093" => {name=>"Schueco_263-158" ,cyc=>'' ,rxt=>'c:w' ,lst=>'' ,chn=>"",},
"0094" => {name=>"Schueco_263-157" ,cyc=>'' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "0094" => {name=>"Schueco_263-157" ,cyc=>'' ,rxt=>'c:w' ,lst=>'' ,chn=>"",},
"00A1" => {name=>"HM-LC-SW1-PL2" ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"",},
); );
sub sub
CUL_HM_Initialize($) CUL_HM_Initialize($)
@ -1749,6 +1750,7 @@ my %culHmSubTypeSets = (
virtual =>"<noButtons>",}, #redef necessary for virtual virtual =>"<noButtons>",}, #redef necessary for virtual
smokeDetector => smokeDetector =>
{ test => "", "alarmOn"=>"", "alarmOff"=>"", { test => "", "alarmOn"=>"", "alarmOff"=>"",
# test1 => "", test2 => "", #General
devicepair => "<btnNumber> device ... single [set|unset] actor"}, devicepair => "<btnNumber> device ... single [set|unset] actor"},
winMatic =>{matic => "<btn>", winMatic =>{matic => "<btn>",
read => "<btn>", read => "<btn>",
@ -2493,9 +2495,18 @@ CUL_HM_Set($@)
$hash->{TESTNR} = $testnr; $hash->{TESTNR} = $testnr;
CUL_HM_SndCmd($hash, sprintf("++9440%s%s00%02X",$dst,$dst,$testnr)); CUL_HM_SndCmd($hash, sprintf("++9440%s%s00%02X",$dst,$dst,$testnr));
} }
elsif($cmd eq "test1") { ##################################################### General remove after test
my $testnr = $hash->{TESTNR} ? ($hash->{TESTNR} +1) : 1;
$hash->{TESTNR} = $testnr;
CUL_HM_SndCmd($hash, sprintf("++B440%s%s00%02X",$dst,$dst,$testnr));
}
elsif($cmd eq "test2") { ##################################################### General remove after test
my $testnr = $hash->{TESTNR} ? ($hash->{TESTNR} +1) : 1;
$hash->{TESTNR} = $testnr;
CUL_HM_SndCmd($hash, sprintf("++9440%s%s00%02X",$id,$dst,$testnr));
}
elsif($cmd =~ m/alarm(.*)/) { ############################################### elsif($cmd =~ m/alarm(.*)/) { ###############################################
# CUL_HM_SndCmd($hash, sprintf("++9441%s%s01%s", CUL_HM_SndCmd($hash, sprintf("++9441%s%s01%s",
CUL_HM_SndCmd($hash, sprintf("++B441%s%s01%s",
$dst,$dst, $1 eq "On" ? "0BC8" : "0C01")); $dst,$dst, $1 eq "On" ? "0BC8" : "0C01"));
} }
elsif($cmd eq "virtual") { ################################################## elsif($cmd eq "virtual") { ##################################################
@ -2818,9 +2829,9 @@ CUL_HM_SndCmd($$)
$io->{HM_CMDNR} = $mn; $io->{HM_CMDNR} = $mn;
$cmd = sprintf("As%02X%02X%s", length($cmd2)/2+1, $mn, $cmd2); $cmd = sprintf("As%02X%02X%s", length($cmd2)/2+1, $mn, $cmd2);
IOWrite($hash, "", $cmd); IOWrite($hash, "", $cmd);
CUL_HM_responseSetup($hash,$cmd);
$cmd =~ m/As(..)(..)(..)(..)(......)(......)(.*)/; $cmd =~ m/As(..)(..)(..)(..)(......)(......)(.*)/;
CUL_HM_DumpProtocol("SND", $io, ($1,$2,$3,$4,$5,$6,$7)); CUL_HM_DumpProtocol("SND", $io, ($1,$2,$3,$4,$5,$6,$7));
CUL_HM_responseSetup($hash,$cmd);
} }
sub #--------------------------------- sub #---------------------------------
CUL_HM_responseSetup($$) CUL_HM_responseSetup($$)
@ -2830,11 +2841,12 @@ CUL_HM_responseSetup($$)
my ($msgId, $msgFlag,$msgType,$dst,$p) = ($2,hex($3),$4,$6,$7) my ($msgId, $msgFlag,$msgType,$dst,$p) = ($2,hex($3),$4,$6,$7)
if ($cmd =~ m/As(..)(..)(..)(..)(......)(......)(.*)/); if ($cmd =~ m/As(..)(..)(..)(..)(......)(......)(.*)/);
my ($chn,$subType) = ($1,$2) if($p =~ m/^(..)(..)/); my ($chn,$subType) = ($1,$2) if($p =~ m/^(..)(..)/);
my $rTo = 2; #default response timeout my $rTo = rand(20)/10+2; #default response timeout
if ($msgType eq "01" && $subType){ if ($msgType eq "01" && $subType){
if ($subType eq "03"){ #PeerList------------- if ($subType eq "03"){ #PeerList-------------
#--- remember request params in device level #--- remember request params in device level
$hash->{helper}{respWait}{Pending} = "PeerList"; $hash->{helper}{respWait}{Pending} = "PeerList";
$hash->{helper}{respWait}{PendCmd} = $cmd;
$hash->{helper}{respWait}{forChn} = substr($p,0,2);#channel info we await $hash->{helper}{respWait}{forChn} = substr($p,0,2);#channel info we await
# define timeout - holdup cmdStack until response complete or timeout # define timeout - holdup cmdStack until response complete or timeout
@ -2852,6 +2864,7 @@ CUL_HM_responseSetup($$)
$peer = ($peer ne "00000000")?CUL_HM_peerChName($peer,$dst,""):""; $peer = ($peer ne "00000000")?CUL_HM_peerChName($peer,$dst,""):"";
#--- set messaging items #--- set messaging items
$hash->{helper}{respWait}{Pending}= "RegisterRead"; $hash->{helper}{respWait}{Pending}= "RegisterRead";
$hash->{helper}{respWait}{PendCmd}= $cmd;
$hash->{helper}{respWait}{forChn} = $chn; $hash->{helper}{respWait}{forChn} = $chn;
$hash->{helper}{respWait}{forList}= $list; $hash->{helper}{respWait}{forList}= $list;
$hash->{helper}{respWait}{forPeer}= $peer; $hash->{helper}{respWait}{forPeer}= $peer;
@ -2871,6 +2884,7 @@ CUL_HM_responseSetup($$)
# elsif($subType eq "0A"){ #Pair Serial---------- # elsif($subType eq "0A"){ #Pair Serial----------
# #--- set messaging items # #--- set messaging items
# $hash->{helper}{respWait}{Pending} = "PairSerial"; # $hash->{helper}{respWait}{Pending} = "PairSerial";
# $hash->{helper}{respWait}{PendCmd} = $cmd;
# $hash->{helper}{respWait}{forChn} = substr($p,4,20); # $hash->{helper}{respWait}{forChn} = substr($p,4,20);
# #
# # define timeout - holdup cmdStack until response complete or timeout # # define timeout - holdup cmdStack until response complete or timeout
@ -2880,6 +2894,7 @@ CUL_HM_responseSetup($$)
elsif($subType eq "0E"){ #StatusReq---------- elsif($subType eq "0E"){ #StatusReq----------
#--- set messaging items #--- set messaging items
$hash->{helper}{respWait}{Pending}= "StatusReq"; $hash->{helper}{respWait}{Pending}= "StatusReq";
$hash->{helper}{respWait}{PendCmd}= $cmd;
$hash->{helper}{respWait}{forChn} = $chn; $hash->{helper}{respWait}{forChn} = $chn;
# define timeout - holdup cmdStack until response complete or timeout # define timeout - holdup cmdStack until response complete or timeout
@ -2943,14 +2958,26 @@ CUL_HM_respPendTout($)
$HMid =~ s/.*://; #remove timer identifier $HMid =~ s/.*://; #remove timer identifier
my $hash = $modules{CUL_HM}{defptr}{$HMid}; my $hash = $modules{CUL_HM}{defptr}{$HMid};
if ($hash && $hash->{DEF} ne '000000'){ if ($hash && $hash->{DEF} ne '000000'){
CUL_HM_eventP($hash,"Tout") if ($hash->{helper}{respWait}{cmd}); my $pendCmd = $hash->{helper}{respWait}{Pending};# secure before remove
my $pendCmd = $hash->{helper}{respWait}{Pending};# save before remove
CUL_HM_eventP($hash,"ToutResp") if ($pendCmd); my $pendRsndCnt = $hash->{helper}{respWait}{PendingRsend};
$pendRsndCnt = 1 if (!$pendRsndCnt);
if ($pendRsndCnt <7 && # some retries
(CUL_HM_getRxType($hash) & 0x03) != 0){# to slow for wakeup and config
my $name = $hash->{NAME};
Log GetLogLevel($name,4),"CUL_HM_Resend: ".$name. " nr ".$pendRsndCnt;
$hash->{helper}{respWait}{PendingRsend} = $pendRsndCnt + 1;
CUL_HM_SndCmd($hash,substr($hash->{helper}{respWait}{PendCmd},4));
CUL_HM_eventP($hash,"Resnd") if ($pendCmd);
}
else{
CUL_HM_eventP($hash,"ResndFail") if ($pendCmd);
CUL_HM_respPendRm($hash); CUL_HM_respPendRm($hash);
CUL_HM_ProcessCmdStack($hash); # continue processing commands CUL_HM_ProcessCmdStack($hash); # continue processing commands
readingsSingleUpdate($hash,"state","RESPONSE TIMEOUT:".$pendCmd,1); readingsSingleUpdate($hash,"state","RESPONSE TIMEOUT:".$pendCmd,1);
} }
} }
}
sub #--------------------------------- sub #---------------------------------
CUL_HM_respPendToutProlong($) CUL_HM_respPendToutProlong($)
{#used when device sends part responses {#used when device sends part responses