From b78fc866f678bb0860f8aaa79e52b92072436b0f Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Sat, 19 Oct 2013 18:34:22 +0000 Subject: [PATCH] new devices, HMLAN overload release changes, shadowreg simplify git-svn-id: https://svn.fhem.de/fhem/trunk@4071 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_HMLAN.pm | 49 ++++++++++--------- fhem/FHEM/10_CUL_HM.pm | 105 ++++++++++++++++++----------------------- fhem/FHEM/HMConfig.pm | 17 ++++++- 3 files changed, 89 insertions(+), 82 deletions(-) diff --git a/fhem/FHEM/00_HMLAN.pm b/fhem/FHEM/00_HMLAN.pm index 3905bc144..c14103da4 100755 --- a/fhem/FHEM/00_HMLAN.pm +++ b/fhem/FHEM/00_HMLAN.pm @@ -44,6 +44,7 @@ my %HMcond = ( 0 =>'ok' # =>'overload'); my $HMOvLdRcvr = 6*60;# time HMLAN needs to recover from overload +my $HMmlSlice = 6; # number of messageload slices per hour (10 = 6min) sub HMLAN_Initialize($) { my ($hash) = @_; @@ -108,7 +109,7 @@ sub HMLAN_Define($$) {######################################################### my @arr = (); @{$hash->{helper}{q}{apIDs}} = \@arr; - $hash->{helper}{q}{cap}{$_} = 0 for (0..9); + $hash->{helper}{q}{cap}{$_} = 0 for (0..($HMmlSlice-1)); $hash->{helper}{q}{cap}{last} = 0; $hash->{helper}{q}{cap}{sum} = 0; HMLAN_UpdtMsgCnt("UpdtMsg:".$name); @@ -231,27 +232,29 @@ sub HMLAN_UpdtMsgLoad($$) {#################################################### my $hash = $defs{$name}; my $hCap = $hash->{helper}{q}{cap}; - my $t = int(gettimeofday()/600)%6;# 10 min slices - + my $t = int(gettimeofday()/(3600/$HMmlSlice))%$HMmlSlice; if ($hCap->{last} != $t){ $hCap->{last} = $t; $hCap->{$t} = 0; # try to release high-load condition with a dummy message # one a while - HMLAN_Write($hash,"","As09998112" + if (ReadingsVal($name,"cond","") =~ m /(Warning-HighLoad|ERROR-Overload)/){ + $hash->{helper}{recoverTest} = 1; + HMLAN_Write($hash,"","As09998112" .AttrVal($name,"hmId","999999") - ."000001") - if (ReadingsVal($name,"cond","") eq 'Warning-HighLoad'); + ."000001"); + } } $hCap->{$hCap->{last}}+=$incr if ($incr); my @tl; $hCap->{sum} = 0; - for (($t-5)..$t){# we have 6 slices - push @tl,int($hCap->{$_%6}/16.8); - $hCap->{sum} += $hCap->{$_%6}; # need to recalc incase a slice was removed + for (($t-$HMmlSlice+1)..$t){# we have 6 slices + push @tl,int($hCap->{$_%$HMmlSlice}/16.8); + $hCap->{sum} += $hCap->{$_%$HMmlSlice}; # need to recalc incase a slice was removed } - $hash->{msgLoadEst} = "1hour:".int($hCap->{sum}/16.8)."% 10min steps: ".join("/",reverse @tl); + $hash->{msgLoadEst} = "1hour:".int($hCap->{sum}/16.8)."% " + .(60/$HMmlSlice)."min steps: ".join("/",reverse @tl); #testing only ." :".$hCap->{sum} return; } @@ -610,18 +613,18 @@ sub HMLAN_SimpleWrite(@) {##################################################### my $len = length($msg); # It is not possible to answer befor 100ms - if ($len>51){ if($hash->{helper}{q}{HMcndN}){ my $HMcnd = $hash->{helper}{q}{HMcndN}; - return if ($HMcnd == 4 || $HMcnd == 253);# no send if overload or disconnect + return if ( ($HMcnd == 4 || $HMcnd == 253) + && !$hash->{helper}{recoverTest});# no send if overload or disconnect + delete $hash->{helper}{recoverTest}; # test done } - $msg =~ m/(.{9}).(..).(.{8}).(..).(.{8}).(..)(..)(..)(.{6})(.{6})(.*)/; my ($s,$stat,$t,$d,$r,$no,$flg,$typ,$src,$dst,$p) = ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11); - my $hmId = $attr{$name}{hmId}; + my $hmId = AttrVal($name,"hmId",""); my $hDst = $hash->{helper}{$dst};# shortcut my $tn = gettimeofday(); if ($hDst->{nextSend}){ @@ -644,6 +647,7 @@ sub HMLAN_SimpleWrite(@) {##################################################### HMLAN_qResp($hash,$dst,1) if ($hDst->{flg} == 1); } } + if ($len > 52){#channel information included, send sone kind of clearance my $chn = substr($msg,52,2); if ($hDst->{chn} && $hDst->{chn} ne $chn){ @@ -677,7 +681,7 @@ sub HMLAN_DoInit($) {########################################################## my ($hash) = @_; my $name = $hash->{NAME}; - my $id = AttrVal($name, "hmId", undef); + my $id = AttrVal($name, "hmId", "999999"); my ($k1no,$k1,$k2no,$k2,$k3no,$k3) =( "01",AttrVal($name,"hmKey","") ,"02",AttrVal($name,"hmKey2","") @@ -691,7 +695,7 @@ sub HMLAN_DoInit($) {########################################################## my $s2000 = sprintf("%02X", HMLAN_secSince2000()); delete $hash->{READINGS}{state}; - HMLAN_SimpleWrite($hash, "A$id") if($id); + HMLAN_SimpleWrite($hash, "A$id") if($id ne "999999"); HMLAN_SimpleWrite($hash, "C"); HMLAN_SimpleWrite($defs{$name}, "Y01,".($k1?"$k1no,$k1":"00,")); HMLAN_SimpleWrite($defs{$name}, "Y02,".($k2?"$k2no,$k2":"00,")); @@ -700,7 +704,6 @@ sub HMLAN_DoInit($) {########################################################## delete $hash->{helper}{ref}; HMLAN_condUpdate($hash,0xff); - RemoveInternalTimer( "Overload:".$name); $hash->{helper}{q}{cap}{$_}=0 foreach (keys %{$hash->{helper}{q}{cap}}); foreach (keys %lhash){delete ($lhash{$_})};# clear IDs - HMLAN might have a reset @@ -710,6 +713,11 @@ sub HMLAN_DoInit($) {########################################################## RemoveInternalTimer( "keepAliveCk:".$name);# avoid duplicate timer RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer InternalTimer(gettimeofday()+$attr{$name}{wdTimer}, "HMLAN_KeepAlive", "keepAlive:".$name, 0); + # send first message to retrieve HMLAN condition + HMLAN_Write($hash,"","As09998112" + .$id + ."000001"); + return undef; } sub HMLAN_KeepAlive($) {####################################################### @@ -775,11 +783,7 @@ sub HMLAN_qResp($$$) {#response-waiting queue################################## ); } } -sub HMLAN_relOvrLd($) {######################################################## - my(undef,$name) = split(':',$_[0]); - HMLAN_condUpdate($defs{$name},0xFE); - $defs{$name}{STATE} = "opened"; -} + sub HMLAN_condUpdate($$) {##################################################### my($hash,$HMcnd) = @_; my $name = $hash->{NAME}; @@ -788,7 +792,6 @@ sub HMLAN_condUpdate($$) {##################################################### $hashCnd->{$HMcnd} = 0 if (!$hashCnd->{$HMcnd}); $hashCnd->{$HMcnd}++; if ($HMcnd == 4){#HMLAN needs a rest. Supress all sends exept keep alive - InternalTimer(gettimeofday()+$HMOvLdRcvr,"HMLAN_relOvrLd","Overload:".$name,1); $hash->{STATE} = "overload"; } diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index 96fb92b34..96db57829 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -206,7 +206,7 @@ sub CUL_HM_updateConfig($){ $hash->{helper}{role}{chn} = 1 if (length($id) == 6); #tc special $attr{$name}{stateFormat} = "last:trigLast" if ($chn eq "03"); } - elsif ($md eq "HM-CC-RT-DN"){ + elsif ($md =~ m/HM-CC-RT-DN/){ $attr{$name}{stateFormat} = "last:trigLast" if ($chn eq "03"); } elsif ("dimmer" eq $st) {#setup virtual dimmer channels @@ -267,7 +267,7 @@ sub CUL_HM_updateConfig($){ .($chn eq "02"?":playTone replay":""); } if (!$hash->{helper}{role}{chn} - && $md eq "HM-CC-RT-DN") {$webCmd.=":burstXmit";} + && $md =~ m/HM-CC-RT-DN/) {$webCmd.=":burstXmit";} if ($webCmd){ my $eventMap = AttrVal($name,"eventMap",undef); @@ -404,10 +404,6 @@ sub CUL_HM_Attr(@) {################################# $hash->{READINGS}{".".$rdEntry} = $hash->{READINGS}{$rdEntry}; delete $hash->{READINGS}{$rdEntry}; } - foreach my $rdEntry (grep /^RegL_/,keys %{$hash->{helper}{shadowReg}}){ - $hash->{helper}{shadowReg}{".".$rdEntry} = $hash->{helper}{shadowReg}{$rdEntry}; - delete $hash->{helper}{shadowReg}{$rdEntry}; - } } elsif ($exLvl eq "1"){# on: Only register values, no raw data # move register to visible if available @@ -419,20 +415,12 @@ sub CUL_HM_Attr(@) {################################# $hash->{READINGS}{substr($rdEntry,1)} = $hash->{READINGS}{$rdEntry}; delete $hash->{READINGS}{$rdEntry}; } - foreach my $rdEntry (grep /^RegL_/,keys %{$hash->{helper}{shadowReg}}){ - $hash->{helper}{shadowReg}{".".$rdEntry} = $hash->{helper}{shadowReg}{$rdEntry}; - delete $hash->{helper}{shadowReg}{$rdEntry}; - } } elsif ($exLvl eq "2"){# full - incl raw data foreach my $rdEntry (grep /^\.R(egL_|-)/,keys %{$hash->{READINGS}}){ $hash->{READINGS}{substr($rdEntry,1)} = $hash->{READINGS}{$rdEntry}; delete $hash->{READINGS}{$rdEntry}; } - foreach my $rdEntry (grep /^\.RegL_/ ,keys %{$hash->{helper}{shadowReg}}){ - $hash->{helper}{shadowReg}{substr($rdEntry,1)} = $hash->{helper}{shadowReg}{$rdEntry}; - delete $hash->{helper}{shadowReg}{$rdEntry}; - } } else{; } @@ -773,7 +761,7 @@ sub CUL_HM_Parse($$) {############################## } } } - elsif($md eq "HM-CC-RT-DN") { ############################################### + elsif($md =~ m/HM-CC-RT-DN/) { ############################################## my %ctlTbl=( 0=>"auto", 1=>"manu", 2=>"party",3=>"boost"); if ($mTp eq "10" && $p =~ m/^0A(....)(..)(..)(..)/) {#info-level my ($chn,$setTemp,$actTemp,$err,$bat,$vp,$ctrlMode) = @@ -1733,7 +1721,6 @@ sub CUL_HM_parseCommon(@){##################################################### } CUL_HM_respPendRm($shash); delete $chnHash->{helper}{shadowReg}{$regLNp}; #rm shadow - delete $chnHash->{helper}{shadowReg}{".$regLNp"};#rm shadow # peer Channel name from/for user entry. CUL_HM_updtRegDisp($chnHash,$list, CUL_HM_peerChId($peer, @@ -1753,14 +1740,15 @@ sub CUL_HM_parseCommon(@){##################################################### my($chn,$peerID,$list,$data) = ($1,$2,$3,$4) if($p =~ m/^04(..)(........)(..)(.*)/); my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn}; $chnHash = $shash if(!$chnHash); # will add param to dev if no chan - my $regLN = ((CUL_HM_getAttrInt($chnHash->{NAME},"expert") == 2)?"":".")."RegL_$list:".CUL_HM_id2Name($peerID); - $regLN =~ s/broadcast//; - $regLN =~ s/ /_/g; #remove blanks + my $regLNp = "RegL_$list:".CUL_HM_id2Name($peerID); + $regLNp =~ s/broadcast//; + $regLNp =~ s/ /_/g; #remove blanks + my $regLN = ((CUL_HM_getAttrInt($chnHash->{NAME},"expert") == 2)?"":".").$regLNp; $data =~ s/(..)(..)/ $1:$2/g; my $lN = ReadingsVal($chnHash->{NAME},$regLN,""); - my $shdwReg = $chnHash->{helper}{shadowReg}{$regLN}; + my $shdwReg = $chnHash->{helper}{shadowReg}{$regLNp}; foreach my $entry(split(' ',$data)){ my ($a,$d) = split(":",$entry); last if ($a eq "00"); @@ -1768,7 +1756,7 @@ sub CUL_HM_parseCommon(@){##################################################### }else{ $lN .= " ".$entry;} $shdwReg =~ s/ $a:..// if ($shdwReg);# confirmed: remove from shadow } - $chnHash->{helper}{shadowReg}{$regLN} = $shdwReg; + $chnHash->{helper}{shadowReg}{$regLNp} = $shdwReg; $lN = join(' ',sort(split(' ',$lN)));# re-order if ($lN =~ s/00:00//){$lN .= " 00:00"}; readingsSingleUpdate($chnHash,$regLN,$lN,0); @@ -2777,7 +2765,7 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.$msg); } elsif($cmd eq "desired-temp") { ############################################# - if ($md eq "HM-CC-RT-DN"){ + if ($md =~ m/HM-CC-RT-DN/){ my $temp = ($a[2] eq "off")?9:($a[2] eq "on"?61:$a[2]*2); return "invalid temp:$a[2]" if($temp <9 ||$temp > 60); $temp = sprintf ("%02X",$temp); @@ -2798,7 +2786,7 @@ sub CUL_HM_Set($@) { my $wd = $1; $state= ""; my ($list,$addr,$prgChn); - if ($md eq "HM-CC-RT-DN"){ + if ($md =~ m/HM-CC-RT-DN/){ my %day2off = ( "Sat"=>"20", "Sun"=>"46", "Mon"=>"72", "Tue"=>"98", "Wed"=>"124","Thu"=>"150","Fri"=>"176"); ($list,$addr,$prgChn) = (7,$day2off{$wd},0); @@ -2818,7 +2806,7 @@ sub CUL_HM_Set($@) { splice @a,2,1;#remove prep } return "To few arguments" if(@a < 4); - return "To many arguments, max 24 pairs" if(@a > (($md eq "HM-CC-RT-DN")?28:50)); + return "To many arguments, max 24 pairs" if(@a > (($md =~ m/HM-CC-RT-DN/)?28:50)); return "Bad format, use HH:MM TEMP ..." if(@a % 2); return "Last time spec must be 24:00" if($a[@a-2] ne "24:00"); @@ -2829,7 +2817,7 @@ sub CUL_HM_Set($@) { my ($h, $m) = ($1, $2); my ($hByte,$lByte); my $temp = $a[$idx+1]; - if ($md eq "HM-CC-RT-DN"){ + if ($md =~ m/HM-CC-RT-DN/){ $temp = (int($temp*2)<<9) + ($h*12+($m/5)); $hByte = $temp>>8; $lByte = $temp & 0xff; @@ -3029,7 +3017,7 @@ sub CUL_HM_Set($@) { my ($peerChn,$peerBtn,$peerHash,$myBtn); my $peerDst = substr($peerId,0,6); - if ($md eq "HM-CC-RT-DN" && $chn eq "05" ){# rt team peers cross from 05 to 04 + if ($md =~ m/HM-CC-RT-DN/ && $chn eq "05" ){# rt team peers cross from 05 to 04 $myBtn = $peerBtn = "04"; $peerChn = "05"; } @@ -3274,18 +3262,19 @@ sub CUL_HM_pushConfig($$$$$$$$@) {#generate messages to config data to register my $peerN = ($peerAddr ne "000000")?CUL_HM_peerChName($peerAddr.$peerChn,$dst,""):""; $peerN =~ s/broadcast//; $peerN =~ s/ /_/g;#remote blanks - my $regLN = ((CUL_HM_getAttrInt($hash->{NAME},"expert") == 2)?"":"."). - "RegL_".$list.":".$peerN; + my $regLNp = "RegL_".$list.":".$peerN; + my $regPre = ((CUL_HM_getAttrInt($hash->{NAME},"expert") == 2)?"":"."); + my $regLN = $regPre.$regLNp; #--- copy data from readings to shadow my $chnhash = $modules{CUL_HM}{defptr}{$dst.$chn}; $chnhash = $hash if (!$chnhash); my $rRd = ReadingsVal($chnhash->{NAME},$regLN,""); if (!$chnhash->{helper}{shadowReg} || - !$chnhash->{helper}{shadowReg}{$regLN}){ - $chnhash->{helper}{shadowReg}{$regLN} = $rRd; + !$chnhash->{helper}{shadowReg}{$regLNp}){ + $chnhash->{helper}{shadowReg}{$regLNp} = $rRd; } #--- update with ne value - my $regs = $chnhash->{helper}{shadowReg}{$regLN}; + my $regs = $chnhash->{helper}{shadowReg}{$regLNp}; for(my $l = 0; $l < $tl; $l+=4) { #substitute changed bytes in shadow my $addr = substr($content,$l,2); my $data = substr($content,$l+2,2); @@ -3293,7 +3282,7 @@ sub CUL_HM_pushConfig($$$$$$$$@) {#generate messages to config data to register $regs .= " ".$addr.":".$data; } } - $chnhash->{helper}{shadowReg}{$regLN} = $regs; # update shadow + $chnhash->{helper}{shadowReg}{$regLNp} = $regs; # update shadow my @changeList; if ($prep eq "exec"){#update complete registerset @changeList = keys%{$chnhash->{helper}{shadowReg}}; @@ -3302,12 +3291,12 @@ sub CUL_HM_pushConfig($$$$$$$$@) {#generate messages to config data to register return; #prepare shadowReg only. More data expected. } else{ - push @changeList,$regLN; + push @changeList,$regLNp; } foreach my $nrn(@changeList){ my $change; - my $nrRd = ReadingsVal($chnhash->{NAME},$nrn,""); + my $nrRd = ReadingsVal($chnhash->{NAME},$regPre.$nrn,""); foreach (sort split " ",$chnhash->{helper}{shadowReg}{$nrn}){ $change .= $_." " if ($nrRd !~ m /$_/);# filter only changes } @@ -3596,7 +3585,8 @@ sub CUL_HM_respPendTout($) { return if(!$pHash->{rspWait}{reSent}); # Double timer? if ($pHash->{rspWait}{wakeup}){ CUL_HM_respPendRm($hash);# do not count problems with wakeup try, just wait - $hash->{protCondBurst} = "off" if ($hash->{protCondBurst} !~ m/forced/);; + $hash->{protCondBurst} = "off" if (!$hash->{protCondBurst}|| + $hash->{protCondBurst} !~ m/forced/);; $pHash->{wakeup} = 0;# finished $pHash->{awake} = 0;# set to asleep CUL_HM_protState($hash,"CMDs_pending"); @@ -3947,7 +3937,6 @@ sub CUL_HM_getRegFromStore($$$$@) {#read a register from backup data $factor = $reg->{f}; $unit = " ".$reg->{u}; } - if(!$regLN){ $regLN = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":".") .sprintf("RegL_%02X:",$list) @@ -3956,6 +3945,8 @@ sub CUL_HM_getRegFromStore($$$$@) {#read a register from backup data CUL_HM_IOid($hash)):""); } $regLN =~ s/broadcast//; + my $regLNp = $regLN; + $regLNp =~s/^\.//; #remove leading '.' in case .. my $data=0; my $convFlg = "";# confirmation flag - indicates data not confirmed by device @@ -3963,8 +3954,8 @@ sub CUL_HM_getRegFromStore($$$$@) {#read a register from backup data my $addrS = sprintf("%02X",$addr); my ($dReadS,$dReadR) = (undef,""); $dReadS = $1 if( $hash->{helper}{shadowReg} - && $hash->{helper}{shadowReg}{$regLN} - && $hash->{helper}{shadowReg}{$regLN} =~ m/$addrS:(..)/); + && $hash->{helper}{shadowReg}{$regLNp} + && $hash->{helper}{shadowReg}{$regLNp} =~ m/$addrS:(..)/); $dReadR = $1 if( $hash->{READINGS}{$regLN} &&$hash->{READINGS}{$regLN}{VAL} =~ m/$addrS:(..)/); my $dRead = $dReadR; @@ -4033,7 +4024,7 @@ sub CUL_HM_updtRegDisp($$$) { CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) && substr($hash->{DEF},6,2) eq "02"); } - if ($md eq "HM-CC-RT-DN"){#handle temperature readings + if ($md =~ m/HM-CC-RT-DN/){#handle temperature readings CUL_HM_RTtempReadings($hash) if ($list == 7); } if ($md eq "HM-PB-4DIS-WM"){#add text @@ -4221,12 +4212,12 @@ sub CUL_HM_4DisText($) {# convert text for 4dis #text2: start at 70 (0x46) length 12 (0x0c) my ($hash)=@_; my $name = $hash->{NAME}; - my $regLN = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":".")."RegL_"; - my $reg1 = ReadingsVal($name,$regLN."01:" ,""); + my $regPre = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":"."); + my $reg1 = ReadingsVal($name,$regPre."RegL_01:" ,""); my $pref = ""; - if ($hash->{helper}{shadowReg}{$regLN."01:"}){ + if ($hash->{helper}{shadowReg}{"RegL_01:"}){ $pref = "set_"; - $reg1 = $hash->{helper}{shadowReg}{$regLN."01:"}; + $reg1 = $hash->{helper}{shadowReg}{"RegL_01:"}; } my %txt; foreach my $sAddr (54,70){ @@ -4248,9 +4239,9 @@ sub CUL_HM_4DisText($) {# convert text for 4dis sub CUL_HM_TCtempReadings($) {# parse TC temperature readings my ($hash)=@_; my $name = $hash->{NAME}; - my $regLN = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":".")."RegL_"; - my $reg5 = ReadingsVal($name,$regLN."05:" ,""); - my $reg6 = ReadingsVal($name,$regLN."06:" ,""); + my $regPre = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":"."); + my $reg5 = ReadingsVal($name,$regPre."RegL_05:" ,""); + my $reg6 = ReadingsVal($name,$regPre."RegL_06:" ,""); if (ReadingsVal($name,"R-controlMode","") =~ m/^party/){ if ( $reg6 # ugly handling to add vanishing party register @@ -4278,8 +4269,8 @@ sub CUL_HM_TCtempReadings($) {# parse TC temperature readings my $setting; my @changedRead; push (@changedRead,"tempList_State:". - (($hash->{helper}{shadowReg}{$regLN."05:"} || - $hash->{helper}{shadowReg}{$regLN."06:"} )?"set":"verified")); + (($hash->{helper}{shadowReg}{"RegL_05:"} || + $hash->{helper}{shadowReg}{"RegL_06:"} )?"set":"verified")); for (my $day = 0;$day<7;$day++){ my $tSpan = 0; my $dayRead = ""; @@ -4307,10 +4298,10 @@ sub CUL_HM_TCtempReadings($) {# parse TC temperature readings sub CUL_HM_RTtempReadings($) {# parse RT temperature readings my ($hash)=@_; my $name = $hash->{NAME}; - my $regLN = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":".")."RegL_07:"; - my $tempRegs = ReadingsVal($name,$regLN,""); - my $stmpRegs = ($hash->{helper}{shadowReg}{$regLN})? # need to compare actual data - ($hash->{helper}{shadowReg}{$regLN}) + my $regPre = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":"."); + my $tempRegs = ReadingsVal($name,$regPre."RegL_07:",""); + my $stmpRegs = ($hash->{helper}{shadowReg}{"RegL_07:"})? # need to compare actual data + ($hash->{helper}{shadowReg}{"RegL_07:"}) :$tempRegs; return "reglist incomplete\n" if ($tempRegs !~ m/00:00/); @@ -4329,7 +4320,7 @@ sub CUL_HM_RTtempReadings($) {# parse RT temperature readings my $setting; my @changedRead; push (@changedRead,"tempList_State:". - ($hash->{helper}{shadowReg}{$regLN} ?"set":"verified")); + ($hash->{helper}{shadowReg}{"RegL_07:"} ?"set":"verified")); for (my $day = 0;$day<7;$day++){ my $dayRead = ""; my $pre =""; @@ -4717,14 +4708,13 @@ sub CUL_HM_qAutoRead($$){ RemoveInternalTimer("CUL_HM_procQs"); InternalTimer(gettimeofday()+ .5,"CUL_HM_procQs","CUL_HM_procQs", 0); } -sub CUL_HM_unQEntity($$){ +sub CUL_HM_unQEntity($$){# remove entity from q - task no longer necesary my ($name,$q) = @_; return if (AttrVal($name,"subType","") eq "virtual"); if ($defs{$name}{helper}{role}{dev}){ foreach (grep /channel_/,keys %{$defs{$name}}){# remove potential chn my $ch = $defs{$name}{$_}; @{$q} = grep !/^$ch$/,@{$q}; - delete $defs{$ch}{autoRead}; } } @{$q} = grep !/^$name$/,@{$q}; @@ -4736,7 +4726,6 @@ sub CUL_HM_qEntity($$){ foreach (grep /channel_/,keys %{$defs{$name}}){# remove potential chn my $ch = $defs{$name}{$_}; @{$q} = grep !/^$ch$/,@{$q}; - delete $defs{$ch}{autoRead}; } @{$q} = CUL_HM_noDup(@{$q},$name); } @@ -5456,7 +5445,7 @@ sub CUL_HM_reglUsed($) {# provide data for HMinfo
-
  • Climate-Control (HM-CC-RT-DN) +
  • Climate-Control (HM-CC-RT-DN|HM-CC-RT-DN-BoM)
    • controlMode <auto|boost|day|night>
    • controlManu <temp>
    • @@ -5842,7 +5831,7 @@ sub CUL_HM_reglUsed($) {# provide data for HMinfo incomplete or incorrect.
      trigLast <channel> #last receiced trigger
      -
    • HM-CC-RT-DN
      +
    • HM-CC-RT-DN and HM-CC-RT-DN-BoM
      state:T: $actTemp desired: $setTemp valve: $vp %
      motorErr: [ok|ValveTight|adjustRangeTooLarge|adjustRangeTooSmall|communicationERR|unknown|lowBat|ValveErrorPosition] measured-temp $actTemp
      diff --git a/fhem/FHEM/HMConfig.pm b/fhem/FHEM/HMConfig.pm index 56b114997..6ff811438 100644 --- a/fhem/FHEM/HMConfig.pm +++ b/fhem/FHEM/HMConfig.pm @@ -206,6 +206,10 @@ my %culHmModel=( "00A8" => {name=>"HM-WDS30-OT2-SM" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p' ,chn=>"T1:1:1,T2:2:2,T1_T2:3:3,T2_T1:4:4,Event:5:5",}, "00A9" => {name=>"HM-PB-6-WM55" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:6",}, "00AB" => {name=>"HM-LC-SW4-BA-PCB" ,st=>'switch' ,cyc=>'' ,rxt=>'b' ,lst=>'1,3' ,chn=>"Sw:1:4",}, + "00AC" => {name=>"HM-ES-PMSw1-Pl " ,st=>'PwrMeterSwitch' ,cyc=>'00:10' ,rxt=>'' ,lst=>'1,1:2.3.4.5.6,3:1' + ,chn=>"Sw:1:4,Pwr:2:2,CondP:3:3,CondI:4:4,CondU:5:5,CondF:6:6",}, + "00AD" => {name=>"HM-TC-IT-WM-W-EU" ,st=>'thermostat' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p:1p.2p.6p.7p,3:3p.6p,1,7:2,8:2,9:2' + ,chn=>"Weather:1:1,Climate:2:2,WindowRec:3:3,remote:6:6,SwitchTr:7:7",}, "00AF" => {name=>"HM-OU-CM-PCB" ,st=>'outputUnit' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"",}, "00B1" => {name=>"HM-SEC-SC-2" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "00B2" => {name=>"HM-SEC-WDS-2" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, @@ -218,6 +222,7 @@ my %culHmModel=( "00B9" => {name=>"HM-LC-Dim1T-CV-2" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",}, "00BA" => {name=>"HM-LC-Dim1T-FM-2" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",}, "00BB" => {name=>"HM-LC-Dim2T-SM-2" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2,Sw1_V:3:4,Sw2_V:5:6",},# + "00BD" => {name=>"HM-CC-RT-DN-BoM" ,st=>'thermostat' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p:1p.2p.5p.6p,3:3p.6p,1,7:4' ,chn=>"Weather:1:1,Climate:2:2,WindowRec:3:3,ClimRT_tr:4:4,ClimaTeam:5:5,remote:6:6"}, # "8001" => {name=>"PS-switch" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:4",}, "8002" => {name=>"PS-Th-Sens" ,st=>'THSensor' ,cyc=>'' ,rxt=>'' ,lst=>'1,4' ,chn=>"Sen:1:4",}, #263 167 HM Smoke Detector Schueco @@ -810,6 +815,8 @@ $culHmRegModel{"HM-RC-Key4-2"} = $culHmRegModel{"HM-RC-4-2"}; $culHmRegModel{"HM-LC-SW4-BA-PCB"} = $culHmRegModel{"HM-LC-SW1-BA-PCB"}; +$culHmRegModel{"HM-CC-RT-DN-BoM"} = $culHmRegModel{"HM-CC-RT-DN"}; + my %culHmRegChan = (# if channelspecific then enter them here "HM-CC-TC02" =>{displayMode =>1,displayTemp =>1,displayTempUnit =>1, controlMode =>1,decalcDay =>1, @@ -875,6 +882,10 @@ $culHmRegChan{"HM-RC-19-SW12"} = $culHmRegChan{"HM-RC-1912"}; $culHmRegChan{"WDF-solar02"} = $culHmRegType{"dimmer"}; +$culHmRegChan{"HM-CC-RT-DN-BoM03"}= $culHmRegType{"HM-CC-RT-DN03"}; +$culHmRegChan{"HM-CC-RT-DN-BoM04"}= $culHmRegType{"HM-CC-RT-DN04"}; +$culHmRegChan{"HM-CC-RT-DN-BoM06"}= $culHmRegType{"HM-CC-RT-DN06"}; + ##--------------- Conversion routines for register settings ##############################---get---######################################## @@ -1082,7 +1093,11 @@ my %culHmChanSets = ( ); # clones- - - - - - - - - - - - - - - - - #$culHmChanSets{"HM-OU-CF-PL02"} = $culHmChanSets{"HM-OU-CF-PL01"}; -$culHmChanSets{"WDF-solar02"} = $culHmSubTypeSets{"blindActuator"}; +$culHmChanSets{"WDF-solar02"} = $culHmSubTypeSets{"blindActuator"}; +$culHmChanSets{"HM-CC-RT-DN-BoM00"}= $culHmSubTypeSets{"HM-CC-RT-DN00"}; +$culHmChanSets{"HM-CC-RT-DN-BoM02"}= $culHmSubTypeSets{"HM-CC-RT-DN02"}; +$culHmChanSets{"HM-CC-RT-DN-BoM04"}= $culHmSubTypeSets{"HM-CC-RT-DN04"}; +$culHmChanSets{"HM-CC-RT-DN-BoM05"}= $culHmSubTypeSets{"HM-CC-RT-DN05"}; # RC send BCAST to specific address. Is the meaning understood? my @culHmCmdFlags = ("WAKEUP", "WAKEMEUP", "CFG", "Bit3",