From c3fc0176ce3b70be3d747e5527aa32c269b98a4e Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Tue, 21 Jan 2014 18:29:47 +0000 Subject: [PATCH] complete TCIT register, re-specify RC19 buttonregister git-svn-id: https://svn.fhem.de/fhem/trunk@4710 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_CUL_HM.pm | 111 +++++++++++++++++++++++++++++------------ fhem/FHEM/HMConfig.pm | 11 ++-- 2 files changed, 87 insertions(+), 35 deletions(-) diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index 4e78ceffd..71636d8bd 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -2189,10 +2189,7 @@ sub CUL_HM_Get($@) { elsif($cmd eq "reg") { ##################################################### my (undef,undef,$regReq,$list,$peerId) = @a; if ($regReq eq 'all'){ - my @regArr = keys %{$culHmRegGeneral}; - push @regArr, keys %{$culHmRegType->{$st}} if($culHmRegType->{$st}); - push @regArr, keys %{$culHmRegModel->{$md}} if($culHmRegModel->{$md}); - push @regArr, keys %{$culHmRegChan->{$md.$chn}} if($culHmRegChan->{$md.$chn}); + my @regArr = CUL_HM_getRegN($st,$md,$chn); my @peers; # get all peers we have a reglist my @listWp; # list that require peers @@ -2236,20 +2233,7 @@ sub CUL_HM_Get($@) { } } elsif($cmd eq "regList") { ################################################# - my @regArr = keys %{$culHmRegGeneral}; - push @regArr, keys %{$culHmRegType->{$st}} if($culHmRegType->{$st}); - push @regArr, keys %{$culHmRegModel->{$md}} if($culHmRegModel->{$md}); - - if ($isChannel){ - push @regArr, keys %{$culHmRegChan->{$md.$chn}} if($culHmRegChan->{$md.$chn}); - } - else{# add all ugly channel register to device view - for my $chnId (CUL_HM_getAssChnIds($name)){ - my $chnN = substr($chnId,6,2); - push @regArr, keys %{$culHmRegChan->{$md.$chnN}} - if($culHmRegChan->{$md.$chnN}); - } - } + my @regArr = CUL_HM_getRegN($st,$md,$chn); my @rI; foreach my $regName (@regArr){ @@ -2669,16 +2653,9 @@ sub CUL_HM_Set($@) { my (undef,undef,$regName,$data,$peerChnIn) = @a; $state = ""; - if (!$culHmRegType->{$st}{$regName} && - !$culHmRegGeneral->{$regName} && - !$culHmRegModel->{$md}{$regName} && - !$culHmRegChan->{$md.$chn}{$regName} ){ - my @regArr = keys %{$culHmRegGeneral}; - push @regArr, keys %{$culHmRegType->{$st}} if($culHmRegType->{$st}); - push @regArr, keys %{$culHmRegModel->{$md}} if($culHmRegModel->{$md}); - push @regArr, keys %{$culHmRegChan->{$md.$chn}} if($culHmRegChan->{$md.$chn}); - return "$regName failed: supported register are ".join(" ",sort @regArr); - } + my @regArr = CUL_HM_getRegN($st,$md,$chn); + return "$regName failed: supported register are ".join(" ",sort @regArr) + if (!grep /^$regName$/,@regArr ); my $reg = $culHmRegDefine->{$regName}; return $st." - ".$regName # give some help @@ -4624,10 +4601,7 @@ sub CUL_HM_updtRegDisp($$$) { my $md = $attr{$devName}{model} ?$attr{$devName}{model} :""; my $chn = $hash->{DEF}; $chn = (length($chn) == 8)?substr($chn,6,2):""; - my @regArr = keys %{$culHmRegGeneral}; - push @regArr, keys %{$culHmRegType->{$st}} if($culHmRegType->{$st}); - push @regArr, keys %{$culHmRegModel->{$md}} if($culHmRegModel->{$md}); - push @regArr, keys %{$culHmRegChan->{$md.$chn}} if($culHmRegChan->{$md.$chn}); + my @regArr = CUL_HM_getRegN($st,$md,$chn); my @changedRead; my $expL = CUL_HM_getAttrInt($name,"expert"); my $expLvl = ($expL != 0)?1:0; @@ -4654,6 +4628,9 @@ sub CUL_HM_updtRegDisp($$$) { elsif ($md =~ m/HM-CC-RT-DN/){#handle temperature readings CUL_HM_RTtempReadings($hash) if ($list == 7 && $chn eq "04"); } + elsif ($md =~ m/HM-TC-IT-WM-W-EU/){#handle temperature readings + CUL_HM_TCITtempReadings($hash) if ($list >= 7 && $chn eq "02"); + } elsif ($md eq "HM-PB-4DIS-WM"){#add text CUL_HM_4DisText($hash) if ($list == 1) ; } @@ -4852,6 +4829,14 @@ sub CUL_HM_time2min($) { # minutes -> time return $m; } +sub CUL_HM_getRegN($$$){ + my ($st,$md,$chn) = @_; + my @regArr = keys %{$culHmRegGeneral}; + push @regArr, keys %{$culHmRegType->{$st}} if($culHmRegType->{$st}); + push @regArr, keys %{$culHmRegModel->{$md}} if($culHmRegModel->{$md}); + push @regArr, keys %{$culHmRegChan->{$md.$chn}} if($culHmRegChan->{$md.$chn}); + return @regArr; +} sub CUL_HM_4DisText($) { # convert text for 4dis #text1: start at 54 (0x36) length 12 (0x0c) #text2: start at 70 (0x46) length 12 (0x0c) @@ -5008,6 +4993,68 @@ sub CUL_HM_RTtempReadings($) {# parse RT temperature readings "winOpnDetFall:" .ReadingsVal($name,"R-winOpnDetFall" ,"unknown"),); return $setting; } +sub CUL_HM_TCITtempReadings($) {# parse RT temperature readings + my ($hash)=@_; + my $name = $hash->{NAME}; + my $regPre = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":"."); + my @changedRead; + my $setting; + my %idxN = (7=>"P1",8=>"P2",9=>"P3"); + foreach my $lst (7,8,9){ + my $tempRegs = ReadingsVal($name,$regPre."RegL_0$lst:",""); + my $stmpRegs = ($hash->{helper}{shadowReg}{"RegL_0$lst:"})? # need to compare actual data + ($hash->{helper}{shadowReg}{"RegL_0$lst:"}) + :$tempRegs; +# return "reglist incomplete\n" if ($tempRegs !~ m/00:00/); + + my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"); + + $tempRegs =~ s/.* 14://; #remove register up to addr 20 from list + $tempRegs =~ s/ 00:00/ /g; #remove regline termination + $tempRegs =~ s/ ..://g; #remove addr Info + $tempRegs =~ s/ //g; #blank + + $stmpRegs =~ s/.* 14://; + $stmpRegs =~ s/ 00:00/ /g; + $stmpRegs =~ s/ ..://g; + $stmpRegs =~ s/ //g; + + push (@changedRead,"tempList$idxN{$lst}_State:". + ($hash->{helper}{shadowReg}{"RegL_0$lst:"} ?"set":"verified")); + for (my $day = 0;$day<7;$day++){ + my $dayRead = ""; + my $pre =""; + my @time; + my @temp; + my $str; + if (substr($stmpRegs,$day *13*4,13*4) eq + substr($tempRegs,$day *13*4,13*4) ){ + $str = substr($tempRegs,$day *13*4,13*4); + } + else{ + $str = substr($stmpRegs,$day *13*4,13*4); + $pre = "set_"; + } + foreach (unpack '(A4)*',$str){ + my $h = hex($_); + push @temp,($h >> 9)/2; + $h = ($h & 0x1ff) * 5; + $h = sprintf("%02d:%02d",int($h / 60),($h%60)); + push @time,$h; + } + + for (my $idx = 0;$idx<13;$idx++){ + my $entry = sprintf(" %s %3.01f",$time[$idx],$temp[$idx]); + $setting .= "Temp set: ".$days[$day].$entry." C\n"; + $dayRead .= $entry; + last if ($time[$idx] eq "24:00"); + } + push (@changedRead,"tempList$idxN{$lst}".$days[$day].":".$pre." ".$dayRead); + } + } + CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead); + return $setting; +} sub CUL_HM_repReadings($) { # parse repeater my ($hash)=@_; my %pCnt; diff --git a/fhem/FHEM/HMConfig.pm b/fhem/FHEM/HMConfig.pm index 97793246c..228640717 100644 --- a/fhem/FHEM/HMConfig.pm +++ b/fhem/FHEM/HMConfig.pm @@ -748,9 +748,7 @@ $culHmRegType{pushButton} = $culHmRegType{remote}; %culHmRegModel = ( "HM-RC-12" =>{ backAtKey =>1, backAtMotion =>1, backOnTime =>1}, - "HM-RC-19" =>{ backAtKey =>1, backAtMotion =>1, backOnTime =>1,backAtCharge =>1,language =>1 - ,lcdSymb =>1, lcdLvlInterp =>1 - }, + "HM-RC-19" =>{ backAtKey =>1, backAtMotion =>1, backOnTime =>1,backAtCharge =>1,language =>1}, "HM-RC-4-2" =>{ localResDis =>1}, "HM-LC-Bl1PBU-FM" =>{ transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,localResDis =>1}, @@ -924,6 +922,7 @@ $culHmRegModel{"ROTO_ZEL-STG-RM-FSA"} = $culHmRegModel{"HM-CC-VD"}; "HM-RC-1912" =>{ msgShowTime =>1, beepAtAlarm =>1, beepAtService =>1,beepAtInfo =>1 ,backlAtAlarm =>1, backlAtService =>1, backlAtInfo =>1 }, + "HM-RC-1901" =>{ lcdSymb =>1, lcdLvlInterp =>1}, "HM-OU-CFM-PL01" =>{ ActTypeLed =>1}, "HM-OU-CFM-PL02" =>{ ActTypeMp3 =>1,Intense =>1}, "HM-SEC-WIN01" =>{ setupDir =>1,pullForce =>1,pushForce =>1,tiltMax =>1 @@ -1013,6 +1012,12 @@ $culHmRegModel{"ROTO_ZEL-STG-RM-FSA"} = $culHmRegModel{"HM-CC-VD"}; #clones - - - - - - - - - - - - - - - $culHmRegChan{"HM-RC-19-B12"} = $culHmRegChan{"HM-RC-1912"}; $culHmRegChan{"HM-RC-19-SW12"} = $culHmRegChan{"HM-RC-1912"}; +foreach (2..16){ + my $c = sprintf("%02X",$_); + $culHmRegChan{"HM-RC-19$c"} = $culHmRegChan{"HM-RC-1901"}; + $culHmRegChan{"HM-RC-19-B$c"} = $culHmRegChan{"HM-RC-1901"}; + $culHmRegChan{"HM-RC-19-SW$c"} = $culHmRegChan{"HM-RC-1901"}; +} $culHmRegChan{"WDF-solar02"} = $culHmRegType{"dimmer"};