From b18303d4cb43ca59e6b24bfa3d99ac6812afe28f Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Sun, 24 Feb 2013 18:45:29 +0000 Subject: [PATCH] repeater sourcelist, revert RSSI handling git-svn-id: https://svn.fhem.de/fhem/trunk@2799 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_CUL.pm | 2 +- fhem/FHEM/00_HMLAN.pm | 4 +++- fhem/FHEM/10_CUL_HM.pm | 48 ++++++++++++++++++++---------------------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/fhem/FHEM/00_CUL.pm b/fhem/FHEM/00_CUL.pm index 544bc5627..4bb9b5bd3 100755 --- a/fhem/FHEM/00_CUL.pm +++ b/fhem/FHEM/00_CUL.pm @@ -918,7 +918,7 @@ CUL_Parse($$$$$) } elsif($fn eq "A" && $len >= 20) { # AskSin/BidCos/HomeMatic my $srcId = substr($dmsg,9,6); $hash->{helper}{nextSend}{$srcId} = gettimeofday() + 0.100; - $dmsg .="::$rssi" if(defined($rssi)); + $dmsg .="::$rssi:$name" if(defined($rssi)); } elsif($fn eq "Z" && $len >= 21) { # Moritz/Max ; } elsif($fn eq "t" && $len >= 5) { # TX3 diff --git a/fhem/FHEM/00_HMLAN.pm b/fhem/FHEM/00_HMLAN.pm index 57493ba73..4628b9b40 100755 --- a/fhem/FHEM/00_HMLAN.pm +++ b/fhem/FHEM/00_HMLAN.pm @@ -341,7 +341,9 @@ HMLAN_Parse($$) HMLAN_Write($hash,undef, "As15".$mNo."8002".$dst.$src."00"); } - $dmsg .= (($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R')?":NACK:":"::").(hex($mFld[4])-65536); + $dmsg .= (($mFld[1] !~ m/00(01|02|21)/ && $letter eq 'R')?":NACK:":"::") + .(hex($mFld[4])-65536) + .":".$name; $hash->{uptime} = HMLAN_uptime($mFld[2]); $hash->{RSSI} = hex($mFld[4])-65536; diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index ddb51759c..a8e2c9c08 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -425,8 +425,9 @@ sub CUL_HM_Parse($$) {############################# ($dst eq $id ? $ioName : $dst)); my $target = " (to $dname)"; - my ($p,$msgStat,$myRSSI) = split(":",$p1,3); - return "" if($msgStat && $msgStat eq 'NACK');#discard TCP errors from HMlan. Resend will cover it + my ($p,$msgStat,$myRSSI,$msgIO) = split(":",$p1,4); + + return "" if($msgStat && $msgStat eq 'NACK');#discard if lowlevel error return "" if($src eq $id);#discard mirrored messages $respRemoved = 0; #set to 'no response in this message' at start @@ -442,7 +443,7 @@ sub CUL_HM_Parse($$) {############################# Log 3, "CUL_HM Unknown device $sname, please define it"; return "UNDEFINED $sname CUL_HM $src $msg"; } - return ""; + return ""; } CUL_HM_eventP($shash,"Rcv"); my $name = $shash->{NAME}; @@ -455,7 +456,6 @@ sub CUL_HM_Parse($$) {############################# "to_".((hex($msgFlag)&0x40)?"rpt_":"").$ioName,# repeater? $myRSSI); - # return if duplicate my $msgX = "No:$msgcnt - t:$msgType s:$src d:$dst ".($p?$p:""); if($shash->{lastMsg} && $shash->{lastMsg} eq $msgX) { @@ -468,7 +468,7 @@ sub CUL_HM_Parse($$) {############################# Log GetLogLevel($name,4), "CUL_HM $name dup mesg - ignore"; } - return ""; #return something to please dispatcher + return $name; #return something to please dispatcher } $shash->{lastMsg} = $msgX; $iohash->{HM_CMDNR} = hex($msgcnt) if($dst eq $id);# updt message cnt to rec @@ -789,7 +789,6 @@ sub CUL_HM_Parse($$) {############################# elsif($st eq "switch" || #################################################### $st eq "dimmer" || $st eq "blindActuator") { - if (($msgType eq "02" && $p =~ m/^01/) || # handle Ack_Status ($msgType eq "10" && $p =~ m/^06/)) { # or Info_Status message here @@ -884,7 +883,7 @@ sub CUL_HM_Parse($$) {############################# push @event, "battery:". (($err&0x80)?"low" :"ok" ); my $flag = ($err>>4) &0x7; push @event, "flags:". (($flag)?"none" :$flag ); - } + } } elsif($st eq "virtual"){##################################################### # possibly add code to count all acks that are paired. @@ -1261,8 +1260,9 @@ sub CUL_HM_Parse($$) {############################# #------------ process events ------------------ push @event, "noReceiver:src:$src ($cmd) $p" if(!@event); - CUL_HM_UpdtReadBulk($shash,1,@event); - return $shash->{NAME} ;# shash could have changed to support channel + CUL_HM_UpdtReadBulk($shash,1,@event); #events to the channel + $defs{$shash->{NAME}}{EVENTS}++; # count events for channel + return $name ;#general notification to the device } ##----------definitions for register settings----------------- @@ -1834,22 +1834,16 @@ sub CUL_HM_TCtempReadings($) { } sub CUL_HM_repReadings($) { my ($hash)=@_; - my $name = $hash->{NAME}; - my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":".")."RegL_"; - my $reg2 = ReadingsVal($name,$regLN."02:" ,""); - $reg2 =~ s/..://g; - $reg2 =~ s/ //g; - my @array = $reg2 =~ /(.{14})/g; # entry is sendID,recID and bdcast - my $entry = 0; + my %pCnt; + foreach my$pId(split',',$hash->{helper}{peerIDsRaw}){ + next if (!$pId || $pId eq "00000000"); + $pCnt{$pId}{cnt}++; + } my $ret; - foreach (@array){ - my @arr2 = $_ =~ /(.{6})(.{6})(.{2})/; - $entry++; - next if ($arr2[1] eq '000000' && $arr2[0] eq '000000'); - $ret .= $entry. - " Bdcast:".((hex($arr2[2])& 0x01)?"on":"off"). - " sendID:".(($arr2[0] ne "000000")?CUL_HM_id2Name($arr2[0]):"none "). - " recID:" .(($arr2[1] ne "000000")?CUL_HM_id2Name($arr2[1]):"none ")."\n"; + foreach my$pId(sort keys %pCnt){ + my ($pdID,$bdcst) = ($1,$2) if ($pId =~ m/(......)(..)/); + $ret .= "source ".$pCnt{$pId}{cnt}." entry for: ".CUL_HM_id2Name($pdID) + .($bdcst eq "01"?" broadcast enabled":"")."\n"; } return $ret; } @@ -2275,6 +2269,8 @@ sub CUL_HM_Set($@) { } foreach my $var (keys %{$hash}){ delete ($hash->{$var}) if ($var =~ m/^prot/); + delete ($hash->{EVENTS}); + delete ($hash->{helper}{rssi}); } $hash->{protState} = "Info_Cleared" ; } @@ -3163,6 +3159,7 @@ sub CUL_HM_responseSetup($$) {#store all we need to handle the response my $chnhash = $modules{CUL_HM}{defptr}{"$dst$chn"}; $chnhash = $hash if (!$chnhash); delete $chnhash->{READINGS}{peerList};#empty old list + delete $chnhash->{helper}{peerIDsRaw}; $attr{$chnhash->{NAME}}{peerIDs} = ''; return; } @@ -3763,10 +3760,11 @@ sub CUL_HM_parseCommon(@){############################# $chnhash = $shash if (!$chnhash); my $chnNname = $chnhash->{NAME}; my @peers = substr($p,2,) =~ /(.{8})/g; + $chnhash->{helper}{peerIDsRaw}.= ",".join",",@peers; + foreach my $peer(@peers){ CUL_HM_ID2PeerList ($chnNname,$peer,1); } - if ($p =~ m/000000..$/) {# last entry, peerList is complete CUL_HM_respPendRm($shash); # check for request to get List3 data