From 7810c82c5e1a19a98847c1dc71f15c68e28b8c19 Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Mon, 18 Mar 2013 19:09:07 +0000 Subject: [PATCH] correct up/down, change TC registersetting, HMLAN timeout attribut git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@2946 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/00_HMLAN.pm | 123 ++++++++-------------------- FHEM/10_CUL_HM.pm | 130 ++++++++++++++---------------- FHEM/HMConfig.pm | 199 ++++++++++++++++++++++++---------------------- 3 files changed, 199 insertions(+), 253 deletions(-) diff --git a/FHEM/00_HMLAN.pm b/FHEM/00_HMLAN.pm index 4628b9b40..cadce5d7f 100755 --- a/FHEM/00_HMLAN.pm +++ b/FHEM/00_HMLAN.pm @@ -21,9 +21,7 @@ my %sets = ( "hmPairSerial" => "HomeMatic", ); -sub -HMLAN_Initialize($) -{ +sub HMLAN_Initialize($) { my ($hash) = @_; require "$attr{global}{modpath}/FHEM/DevIo.pm"; @@ -45,13 +43,10 @@ HMLAN_Initialize($) $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 " . "loglevel:0,1,2,3,4,5,6 addvaltrigger " . "hmId hmKey " . + "respTime " . "hmProtocolEvents:0_off,1_dump,2_dumpFull,3_dumpTrigger"; } - -##################################### -sub -HMLAN_Define($$) -{ +sub HMLAN_Define($$) {######################################################### my ($hash, $def) = @_; my @a = split("[ \t][ \t]*", $def); @@ -78,12 +73,7 @@ HMLAN_Define($$) my $ret = DevIo_OpenDev($hash, 0, "HMLAN_DoInit"); return $ret; } - - -##################################### -sub -HMLAN_Undef($$) -{ +sub HMLAN_Undef($$) {########################################################## my ($hash, $arg) = @_; my $name = $hash->{NAME}; @@ -100,22 +90,13 @@ HMLAN_Undef($$) DevIo_CloseDev($hash); return undef; } - -##################################### -sub -HMLAN_RemoveHMPair($) -{ +sub HMLAN_RemoveHMPair($) {#################################################### my($in ) = shift; my(undef,$name) = split(':',$in); my $hash = $defs{$name}; delete($hash->{hmPair}); } - - -##################################### -sub -HMLAN_Set($@) -{ +sub HMLAN_Set($@) {############################################################ my ($hash, @a) = @_; return "\"set HMLAN\" needs at least one parameter" if(@a < 2); @@ -147,13 +128,7 @@ HMLAN_Set($@) } return undef; } - - -##################################### -# This is a direct read for commands like get -sub -HMLAN_ReadAnswer($$$) -{ +sub HMLAN_ReadAnswer($$$) {# This is a direct read for commands like get my ($hash, $arg, $regexp) = @_; my $type = $hash->{TYPE}; @@ -197,10 +172,7 @@ HMLAN_ReadAnswer($$$) my %lhash; # remember which ID is assigned to this HMLAN -##################################### -sub -HMLAN_Write($$$) -{ +sub HMLAN_Write($$$) {######################################################### my ($hash,$fn,$msg) = @_; my ($mtype,$src,$dst) = (substr($msg, 8, 2), substr($msg, 10, 6), @@ -232,12 +204,8 @@ HMLAN_Write($$$) $msg = sprintf("S%08X,00,00000000,01,%08X,%s",$tm, $tm, substr($msg, 4)); HMLAN_SimpleWrite($hash, $msg); } - -##################################### +sub HMLAN_Read($) {############################################################ # called from the global loop, when the select for hash->{FD} reports data -sub -HMLAN_Read($) -{ my ($hash) = @_; my $buf = DevIo_SimpleRead($hash); return "" if(!defined($buf)); @@ -256,10 +224,7 @@ HMLAN_Read($) } $hash->{PARTIAL} = $hmdata; } - -sub -HMLAN_uptime($) -{ +sub HMLAN_uptime($) {########################################################## my $msec = shift; $msec = hex($msec); @@ -268,10 +233,7 @@ HMLAN_uptime($) int($msec/86400000), int($sec/3600), int(($sec%3600)/60), $sec%60, $msec % 1000); } - -sub -HMLAN_Parse($$) -{ +sub HMLAN_Parse($$) {########################################################## my ($hash, $rmsg) = @_; my $name = $hash->{NAME}; my $ll5 = GetLogLevel($name,5); @@ -309,16 +271,18 @@ HMLAN_Parse($$) } my $dmsg = sprintf("A%02X%s", length($mFld[5])/2, uc($mFld[5])); - - - # handle status. 0001=ack:seems to announce the new message counter - # 0002=message send done, no ack was requested - # 0008=nack - HMLAN did not receive an ACK, - # 0021= 'R' - # 0081=open - # 0100=with 'E', not 'R'. - # 0081=open - # 04xx=nothing will be sent anymore? try restart + + # handle status. + # 00 00=msg without relation + # 00 01=ack that HMLAN waited for + # 00 02=msg send, no ack was requested + # 00 08=nack - ack was requested, msg repeated 3 times, still no ack + # 00 21= + # 00 30= + # 00 81=open + # 01 xx= + # 02 xx=prestate to 04xx. + # 04 xx=nothing sent anymore. Any restart unsuccessful except power # HMLAN_SimpleWrite($hash, '+'.$src) if (($letter eq 'R') && $src ne AttrVal($name, "hmId", $mFld[4])); @@ -376,20 +340,11 @@ HMLAN_Parse($$) Log $ll5, "$name Unknown msg >$rmsg<"; } } - - -##################################### -sub -HMLAN_Ready($) -{ +sub HMLAN_Ready($) {########################################################### my ($hash) = @_; return DevIo_OpenDev($hash, 1, "HMLAN_DoInit"); } - -######################## -sub -HMLAN_SimpleWrite(@) -{ +sub HMLAN_SimpleWrite(@) {##################################################### my ($hash, $msg, $nonl) = @_; return if(!$hash || AttrVal($hash->{NAME}, "dummy", undef)); @@ -442,11 +397,7 @@ HMLAN_SimpleWrite(@) $msg .= "\r\n" unless($nonl); syswrite($hash->{TCPDev}, $msg) if($hash->{TCPDev}); } - -######################## -sub -HMLAN_DoInit($) -{ +sub HMLAN_DoInit($) {########################################################## my ($hash) = @_; my $name = $hash->{NAME}; @@ -469,11 +420,7 @@ HMLAN_DoInit($) InternalTimer(gettimeofday()+25, "HMLAN_KeepAlive", "keepAlive:".$name, 0); return undef; } - -##################################### -sub -HMLAN_KeepAlive($) -{ +sub HMLAN_KeepAlive($) {####################################################### my($in ) = shift; my(undef,$name) = split(':',$in); my $hash = $defs{$name}; @@ -482,13 +429,11 @@ HMLAN_KeepAlive($) return if(!$hash->{FD}); HMLAN_SimpleWrite($hash, "K"); RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer - InternalTimer(gettimeofday()+1, "HMLAN_KeepAliveCheck", "keepAliveCk:".$name, 1); + my $rt = AttrVal($name,"respTime",1); + InternalTimer(gettimeofday()+$rt, "HMLAN_KeepAliveCheck", "keepAliveCk:".$name, 1); InternalTimer(gettimeofday()+25, "HMLAN_KeepAlive", "keepAlive:".$name, 1); } -##################################### -sub -HMLAN_KeepAliveCheck($) -{ +sub HMLAN_KeepAliveCheck($) {################################################## my($in ) = shift; my(undef,$name) = split(':',$in); my $hash = $defs{$name}; @@ -496,9 +441,7 @@ HMLAN_KeepAliveCheck($) DevIo_Disconnected($hash); } } -sub -HMLAN_secSince2000() -{ +sub HMLAN_secSince2000() {##################################################### # Calculate the local time in seconds from 2000. my $t = time(); my @l = localtime($t); @@ -574,6 +517,10 @@ HMLAN_secSince2000()
  • addvaltrigger

  • hmId

  • hmProtocolEvents

  • +
  • respTime
    + Define max response time of the HMLAN adapter in seconds. Default is 1 sec. + Longer times may be used as workaround in slow/instable systems or LAN configurations. +
  • diff --git a/FHEM/10_CUL_HM.pm b/FHEM/10_CUL_HM.pm index ae6744de6..b28971e8d 100755 --- a/FHEM/10_CUL_HM.pm +++ b/FHEM/10_CUL_HM.pm @@ -217,7 +217,7 @@ sub CUL_HM_updateConfig($){ if (0 != substr(AttrVal($name,"autoReadReg","0"),0,1)); } $modules{CUL_HM}{helper}{updtCfgLst} = \@getConfList; - CUL_HM_autoReadConfig("updateConfig"); + CUL_HM_autoReadConfig("updateConfig"); } sub CUL_HM_Define($$) {############################## my ($hash, $def) = @_; @@ -1691,7 +1691,6 @@ sub CUL_HM_Set($@) { my $devName = $hash->{device}?$hash->{device}:$name; my $st = AttrVal($devName, "subType", ""); my $md = AttrVal($devName, "model" , ""); - my $rxType = CUL_HM_getRxType($hash); my $flag = CUL_HM_getFlag($hash); #set burst flag my $cmd = $a[1]; @@ -1722,10 +1721,10 @@ sub CUL_HM_Set($@) { push @arr, keys %{$culHmChanSets{$mdCh}} if($culHmChanSets{$mdCh}); my $usg = "Unknown argument $cmd, choose one of ".join(" ",sort @arr); - if($usg =~ m/ pct/) { - $usg =~ s/ pct/ pct:slider,0,1,100/; - } - elsif($md eq "HM-CC-TC") { + $usg =~ s/ pct/ pct:slider,0,1,100/; + $usg =~ s/ virtual/ virtual:slider,1,1,40/; + + if($md eq "HM-CC-TC") { my @list = map { ($_.".0", $_+0.5) } (6..30); pop @list; my $list = "on,off," . join(",",@list); @@ -1743,6 +1742,16 @@ sub CUL_HM_Set($@) { return "$cmd requires parameter: $h"; } + #convert 'old' commands to current methodes + if($cmd =~ m/^(displayMode|displayTemp|controlMode|decalcDay|displayTempUnit)$/ || + $cmd =~ m/^(day|night|party)-temp$/){ # + $a[3]=$a[2]; + $a[2]=$cmd; + $a[4]=""; + ($cmd,$chn,$isChannel) = ("regSet","02","true"); #force channel 02 + readingsSingleUpdate(CUL_HM_getDeviceHash($hash),$a[2],$a[3],1);#for historical reason + } + #if chn cmd is executed on device but refers to a channel? my $chnHash = (!$isChannel && $modules{CUL_HM}{defptr}{$dst."01"})? $modules{CUL_HM}{defptr}{$dst."01"}:$hash; @@ -1791,11 +1800,12 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash,"++A401".$id."000000010A".uc( unpack("H*",$serialNr))); $hash->{hmPairSerial} = $serialNr; } - elsif($cmd eq "unpair") { ################################################### + elsif($cmd eq "unpair") { ############################################### reg CUL_HM_pushConfig($hash, $id, $dst, 0,0,0,0, "02010A000B000C00"); $state = ""; } - elsif($cmd eq "sign") { ##################################################### + elsif($cmd eq "sign") { ################################################# reg + # chn,peer,list CUL_HM_pushConfig($hash, $id, $dst, $chn,0,0,$chn, "08" . ($a[2] eq "on" ? "01":"02")); $state = ""; @@ -1849,7 +1859,7 @@ sub CUL_HM_Set($@) { substr($pID,0,6).$pCh1.$pCh2); } } - elsif($cmd eq "regBulk"||$cmd eq "getRegRaw") { ############################# + elsif($cmd eq "regBulk"||$cmd eq "getRegRaw") { ######################### reg my ($list,$addr,$data,$peerID); $state = ""; if ($cmd eq "regBulk"){ @@ -1900,7 +1910,7 @@ sub CUL_HM_Set($@) { CUL_HM_pushConfig($hash,$id,$dst,$chn,$peerID,$peerChn,$list,$adList); } } - elsif($cmd eq "regSet") { ################################################### + elsif($cmd eq "regSet") { ############################################### reg #set regSet my ($regName,$data,$peerChnIn) = ($a[2],$a[3],$a[4]); $state = ""; @@ -1912,7 +1922,7 @@ sub CUL_HM_Set($@) { 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 "supported register are ".join(" ",sort @regArr); + return "$regName failed: supported register are ".join(" ",sort @regArr); } my $reg = $culHmRegDefine{$regName}; @@ -1950,13 +1960,13 @@ sub CUL_HM_Set($@) { my $dataStr = substr(sprintf("%08X",($data & $mask) << $bit), 8-int($reg->{s}+0.99)*2,); - my ($lChn,$peerID,$peerChn) = ($chn,"000000","00"); + my ($lChn,$peerId,$peerChn) = ($chn,"000000","00"); if (($list == 3) ||($list == 4)){ # peer is necessary for list 3/4 return "Peer not specified" if (!$peerChnIn); - $peerID = CUL_HM_peerChId($peerChnIn,$dst,$id); - $peerChn = ((length($peerID) == 8)?substr($peerID,6,2):"01"); - $peerID = substr($peerID,0,6); - return "Peer not specified" if (!$peerID); + $peerId = CUL_HM_peerChId($peerChnIn,$dst,$id); + $peerChn = ((length($peerId) == 8)?substr($peerId,6,2):"01"); + $peerId = substr($peerId,0,6); + return "Peer not specified" if (!$peerId); } elsif($list == 0){ $lChn = "00"; @@ -1971,7 +1981,7 @@ sub CUL_HM_Set($@) { my $rName = CUL_HM_id2Name($dst.$lChn); $rName =~ s/_chn:.*//; my $curVal = CUL_HM_getRegFromStore($rName, - $addr,$list,$peerID.$peerChn); + $addr,$list,$peerId.$peerChn); return "cannot read current value for Bitfield - retrieve Data first" if (!$curVal); $curVal =~ s/set_//; # set is not relevant, we take it as given @@ -1983,7 +1993,9 @@ sub CUL_HM_Set($@) { $addrData.=sprintf("%02X",$addr+$cnt).substr($dataStr,$cnt*2,2); } } - CUL_HM_pushConfig($hash,$id,$dst,$lChn,$peerID,$peerChn,$list,$addrData); + my $cHash = CUL_HM_id2Hash($dst.($chn eq '00'?"":$chn)); + $cHash = $hash if (!$cHash); + CUL_HM_pushConfig($cHash,$id,$dst,$lChn,$peerId,$peerChn,$list,$addrData); } elsif($cmd eq "level") { #################################################### #level =>" ..." @@ -2026,7 +2038,7 @@ sub CUL_HM_Set($@) { } elsif($cmd eq "toggle") { ################################################### CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'02'.$chn. - (ReadingsVal($name,"state","on") eq "off" ?"C80000":"000000")); + (CUL_HM_getChnLvl($name) != 0 ?"000000":"C80000")); $hash = $chnHash; # report to channel if defined } elsif($cmd eq "lock") { ##################################################### @@ -2049,31 +2061,30 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.$val.'01'); # SET_LOCK $state = ""; } - elsif($cmd eq "pct") { ###################################################### - $a[1] = 100 if ($a[1] > 100); - $tval = CUL_HM_encodeTime16(((@a > 2)&&$a[2]!=0)?$a[2]:6709248);# onTime 0.0..6709248, 0=forever - $rval = CUL_HM_encodeTime16((@a > 3)?$a[3]:2.5); # rampTime 0.0..6709248, 0=immediate - CUL_HM_PushCmdStack($hash, - sprintf("++%s11%s%s02%s%02X%s%s",$flag,$id,$dst,$chn,$a[1]*2,$rval,$tval)); - } - elsif($cmd =~ m/^(up|down)$/) { ############################################# -# elsif($cmd eq "up" || $cmd eq "down") { ############################################# - #dim [|up|down] ... [ontime] [ramptime] - my $lvl = (defined $a[2])?$a[2]:10; - $lvl = -1*$lvl if ($cmd eq "down"); - my $curVal = ReadingsVal($name,"state",0); - $curVal = ($curVal eq "on")?100:(($curVal eq "off")?0:$curVal); - $lvl += $curVal; + elsif($cmd =~ m/^(up|down|pct)$/) { ######################################### + my $lvl; + if ($cmd eq "pct"){ + $lvl = $a[1]; + } + else{#dim [|up|down] ... [ontime] [ramptime] + shift @a; # align array with 'pct' + $lvl = (defined $a[1])?$a[1]:10; + $lvl = -1*$lvl if ($cmd eq "down"); + $lvl += CUL_HM_getChnLvl($name); + } $lvl = ($lvl > 100)?100:(($lvl < 0)?0:$lvl); - $tval = CUL_HM_encodeTime16(((@a > 2)&&$a[3]!=0)?$a[3]:6709248);# onTime 0.0..6709248, 0=forever + $tval = CUL_HM_encodeTime16(((@a > 2)&&$a[2]!=0)?$a[3]:6709248);# onTime 0.0..6709248, 0=forever $rval = CUL_HM_encodeTime16((@a > 3)?$a[3]:2.5); # rampTime 0.0..6709248, 0=immediate CUL_HM_PushCmdStack($hash, sprintf("++%s11%s%s02%s%02X%s%s",$flag,$id,$dst,$chn,$lvl*2,$rval,$tval)); + if (defined $hash->{READINGS}{"virtLevel"}{VAL}){ + readingsSingleUpdate($hash,"virtLevel",$state,1); + }else{$state = "set_".$lvl;} } elsif($cmd eq "stop") { ##################################################### CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'03'.$chn); } - elsif($cmd eq "text") { ##################################################### + elsif($cmd eq "text") { ################################################# reg $state = ""; return "$a[2] is not a button number" if($a[2] !~ m/^\d$/ || $a[2] < 1); return "$a[3] is not on or off" if($a[3] !~ m/^(on|off)$/); @@ -2241,7 +2252,7 @@ sub CUL_HM_Set($@) { } CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'0202'.$mp3Bytes); } - elsif($cmd eq "ilum") { ##################################################### + elsif($cmd eq "ilum") { ################################################# reg return "$a[2] not specified. choose 0-15 for brightness" if ($a[2]>15); return "$a[3] not specified. choose 0-127 for duration" if ($a[3]>127); return "unsupported for HMid:".$hash->{DEF}.", use HMId:".substr($hash->{DEF},0,6) @@ -2250,46 +2261,16 @@ sub CUL_HM_Set($@) { # write list0, CUL_HM_pushConfig($hash,$id,$dst,0,0,0,0,$addrData); } - elsif(($cmd eq "displayMode")||($cmd eq "displayTemp")|| - ($cmd eq "controlMode")||($cmd eq "decalcDay") || - ($cmd eq "displayTempUnit") ){ ######################################## - my %regs = (displayTemp =>{actual=>0,setpoint=>2}, - displayMode =>{"temp-only"=>0,"temp-hum"=>1}, - displayTempUnit =>{celsius=>0,fahrenheit=>4}, - controlMode =>{manual=>0,auto=>8,central=>16,party=>24}, - decalcDay =>{Sat=>0 ,Sun=>32 ,Mon=>64,Tue=>96, - Wed=>128,Thu=>160,Fri=>192}); - return $a[2]."invalid for ".$cmd." select one of ". - join (" ",sort keys %{$regs{$cmd}}) if(!defined($regs{$cmd}{$a[2]})); - readingsSingleUpdate($hash,$cmd,$a[2],1); - my $tcnf = 0; - my $missingEntries; - foreach my $entry (keys %regs){ - if (!$hash->{READINGS}{$entry}){ - $missingEntries .= $entry." "; - } - else{ - $tcnf |= $regs{$entry}{$hash->{READINGS}{$entry}{VAL}}; - } - } - return "please complete settings for ".$missingEntries if($missingEntries); - - CUL_HM_pushConfig($hash, $id, $dst, 2,0,0,5, "01".sprintf("%02X",$tcnf)); - } elsif($cmd eq "desired-temp") { ############################################# CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'0202'. CUL_HM_convTemp($a[2])); my $chnHash = CUL_HM_id2Hash($dst."02"); my $mode = ReadingsVal($chnHash->{NAME},"R-MdTempReg",""); + $mode =~ s/set_//;#consider set as given readingsSingleUpdate($chnHash,"desired-temp-cent",$a[2],1) if($mode eq 'central '); } - elsif($cmd =~ m/^(day|night|party)-temp$/) { ################################ - my %tt = (day=>"03", night=>"04", party=>"06"); - my $tt = $tt{$1}; - CUL_HM_pushConfig($hash, $id, $dst, 2,0,0,5, "$tt".CUL_HM_convTemp($a[2])); - } - elsif($cmd =~ m/^tempList(...)/) { ########################################## + elsif($cmd =~ m/^tempList(...)/) { ###################################### reg my %day2off = ( "Sat"=>"5 0B", "Sun"=>"5 3B", "Mon"=>"5 6B", "Tue"=>"5 9B", "Wed"=>"5 CB", "Thu"=>"6 01", "Fri"=>"6 31"); @@ -2346,7 +2327,7 @@ sub CUL_HM_Set($@) { CUL_HM_PushCmdStack($hash, sprintf("++A001%s%s0104%s%02X%s", $id, $dst, $id, $a[2], $chn)); } - elsif($cmd eq "keydef") { ################################################### + elsif($cmd eq "keydef") { ############################################### reg if ( $a[3] eq "tilt") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0B220D838B228D83");#JT_ON/OFF/RAMPON/RAMPOFF short and long } elsif ($a[3] eq "close") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0B550D838B558D83");#JT_ON/OFF/RAMPON/RAMPOFF short and long } elsif ($a[3] eq "closed") {CUL_HM_pushConfig($hash,$id,$dst,1,$id,$a[2],3,"0F008F00"); #offLevel (also thru register) @@ -3346,6 +3327,13 @@ sub CUL_HM_secSince2000() {##################### - 7200; # HM Special return $t; } +sub CUL_HM_getChnLvl($){# in: name out: vit or phys level + my $name = shift; + my $curVal = ReadingsVal($name,"virtLevel",undef); + $curVal = ReadingsVal($name,"state",0) if (!defined $curVal); + $curVal =~ s/set_//; + return ($curVal eq "on")?100:(($curVal eq "off")?0:$curVal); +} #--------------- Conversion routines for register settings--------------------- sub CUL_HM_initRegHash() { #duplicate short and long press register @@ -3434,7 +3422,7 @@ sub CUL_HM_TCtempReadings($) {# parse TC readings $tSpan = $time[$reg]; } push (@changedRead,"tempList".$days[$day].":".$dayRead); - } + } CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead); return $setting; } diff --git a/FHEM/HMConfig.pm b/FHEM/HMConfig.pm index 23580d7b6..08b8e89b3 100644 --- a/FHEM/HMConfig.pm +++ b/FHEM/HMConfig.pm @@ -295,25 +295,39 @@ my %culHmRegDefShLg = (# register that are available for short AND long button p ); my %culHmRegDefine = ( +#--- list 0, device and protocol level----------------- intKeyVisib =>{a=> 2.7,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>'visibility of internal channel',lit=>{invisib=>0,visib=>1}}, pairCentral =>{a=> 10.0,s=>3.0,l=>0,min=>0 ,max=>16777215,c=>'hex' ,f=>'' ,u=>'' ,d=>1,t=>'pairing to central'}, -#blindActuator mainly - lgMultiExec =>{a=>138.5,s=>0.1,l=>3,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"multiple execution per repeat of long trigger" ,lit=>{off=>0,on=>1}}, - driveDown =>{a=> 11.0,s=>2.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"drive time up"}, - driveUp =>{a=> 13.0,s=>2.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"drive time up"}, - driveTurn =>{a=> 15.0,s=>1.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"fliptime up <=>down"}, - refRunCounter =>{a=> 16.0,s=>1.0,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"reference run counter"}, - #repeater compMode =>{a=> 23.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"compatibility moden" ,lit=>{off=>0,on=>1}}, #remote mainly + backlOnTime =>{a=> 5.0,s=>0.6,l=>0,min=>1 ,max=>25 ,c=>"" ,f=>'' ,u=>'s' ,d=>0,t=>"Backlight ontime"}, + backlOnMode =>{a=> 5.6,s=>0.2,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Backlight mode" ,lit=>{off=>0,auto=>1}}, language =>{a=> 7.0,s=>1.0,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Language" ,lit=>{English=>0,German=>1}}, backAtKey =>{a=> 13.7,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight at keystroke",lit=>{off=>0,on=>1}}, backAtMotion =>{a=> 13.6,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight at motion" ,lit=>{off=>0,on=>1}}, backAtCharge =>{a=> 13.5,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight at Charge" ,lit=>{off=>0,on=>1}}, stbyTime =>{a=> 14.0,s=>1.0,l=>0,min=>1 ,max=>99 ,c=>'' ,f=>'' ,u=>'s' ,d=>1,t=>"Standby Time"}, backOnTime =>{a=> 14.0,s=>1.0,l=>0,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'s' ,d=>1,t=>"Backlight On Time"}, - + btnLock =>{a=> 15.0,s=>1.0,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Button Lock" ,lit=>{unlock=>0,lock=>1}}, +# keymatic/winmatic secific register + keypressSignal =>{a=> 3.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Keypress beep" ,lit=>{off=>0,on=>1}}, + signal =>{a=> 3.4,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Confirmation beep" ,lit=>{off=>0,on=>1}}, + signalTone =>{a=> 3.6,s=>0.2,l=>0,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"" ,lit=>{low=>0,mid=>1,high=>2,veryHigh=>3}}, +# sec_mdir + cyclicInfoMsg =>{a=> 9.0,s=>1.0,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"cyclic message",lit=>{off=>0,on=>1}}, + sabotageMsg =>{a=> 16.0,s=>1.0,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"enable sabotage message" ,lit=>{off=>0,on=>1}}, + lowBatLimit =>{a=> 18.0,s=>1.0,l=>0,min=>10 ,max=>12 ,c=>'factor' ,f=>10 ,u=>'V' ,d=>1,t=>"low batterie limit"}, + batDefectLimit =>{a=> 19.0,s=>1.0,l=>0,min=>0.1,max=>2 ,c=>'factor' ,f=>100 ,u=>'Ohm' ,d=>1,t=>"batterie defect detection"}, + transmDevTryMax =>{a=> 20.0,s=>1.0,l=>0,min=>1 ,max=>10 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"max message re-transmit"}, + localResDis =>{a=> 24.0,s=>1.0,l=>0,min=>1 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"local reset disable" ,lit=>{off=>0,on=>1}}, +#--- list 1, Channel level------------------ +#blindActuator mainly + driveDown =>{a=> 11.0,s=>2.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"drive time up"}, + driveUp =>{a=> 13.0,s=>2.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"drive time up"}, + driveTurn =>{a=> 15.0,s=>1.0,l=>1,min=>0 ,max=>6000.0 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>1,t=>"fliptime up <=>down"}, + refRunCounter =>{a=> 16.0,s=>1.0,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"reference run counter"}, +#remote mainly longPress =>{a=> 4.4,s=>0.4,l=>1,min=>0.3,max=>1.8 ,c=>'m10s3' ,f=>'' ,u=>'s' ,d=>0,t=>"time to detect key long press"}, dblPress =>{a=> 9.0,s=>0.4,l=>1,min=>0 ,max=>1.5 ,c=>'factor' ,f=>10 ,u=>'s' ,d=>0,t=>"time to detect double press"}, msgShowTime =>{a=> 45.0,s=>1.0,l=>1,min=>0.0,max=>120 ,c=>'factor' ,f=>2 ,u=>'s' ,d=>1,t=>"Message show time(RC19). 0=always on"}, @@ -324,10 +338,6 @@ my %culHmRegDefine = ( backlAtService =>{a=> 47.2,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight Service" ,lit=>{off=>0,on=>1,blinkSlow=>2,blinkFast=>3}}, backlAtInfo =>{a=> 47.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight Info" ,lit=>{off=>0,on=>1,blinkSlow=>2,blinkFast=>3}}, - peerNeedsBurst =>{a=> 1.0,s=>0.1,l=>4,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"peer expects burst",lit=>{off=>0,on=>1}}, - expectAES =>{a=> 1.7,s=>0.1,l=>4,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"expect AES" ,lit=>{off=>0,on=>1}}, - lcdSymb =>{a=> 2.0,s=>0.1,l=>4,min=>0 ,max=>255 ,c=>'hex' ,f=>'' ,u=>'' ,d=>0,t=>"bitmask which symbol to display on message"}, - lcdLvlInterp =>{a=> 3.0,s=>0.1,l=>4,min=>0 ,max=>255 ,c=>'hex' ,f=>'' ,u=>'' ,d=>0,t=>"bitmask fro symbols"}, #dimmer mainly loadErrCalib =>{a=> 18.0,s=>1.0,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>"" ,d=>0,t=>"Load Error Calibration"}, transmitTryMax =>{a=> 48.0,s=>1.0,l=>1,min=>1 ,max=>10 ,c=>'' ,f=>'' ,u=>"" ,d=>0,t=>"max message re-transmit"}, @@ -341,6 +351,58 @@ my %culHmRegDefine = ( statusInfoRandom=>{a=> 87.5,s=>0.3,l=>1,min=>0 ,max=>7 ,c=>'' ,f=>'' ,u=>"s" ,d=>0,t=>"status message random delay"}, characteristic =>{a=> 88.0,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>"" ,d=>1,t=>"" ,lit=>{linear=>0,square=>1}}, logicCombination=>{a=> 89.0,s=>0.5,l=>1,min=>0 ,max=>16 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{inactive=>0,or=>1,and=>2,xor=>3,nor=>4,nand=>5,orinv=>6,andinv=>7,plus=>8,minus=>9,mul=>10,plusinv=>11,minusinv=>12,mulinv=>13,invPlus=>14,invMinus=>15,invMul=>16}}, +#SCD + msgScdPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,lvlNormal=>1}}, + msgScdPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, + msgScdPosC =>{a=> 32.2,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position C",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, + msgScdPosD =>{a=> 32.0,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position D",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, + evtFltrTime =>{a=> 35.0,s=>1 ,l=>1,min=>600,max=>1200 ,c=>'' ,f=>1.6 ,u=>'s' ,d=>0,t=>"Event filter time",},#todo check calculation +#rhs - different literals + msgRhsPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,closed=>1,open=>2,tilted=>3}}, + msgRhsPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,closed=>1,open=>2,tilted=>3}}, + msgRhsPosC =>{a=> 32.2,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position C",lit=>{noMsg=>0,closed=>1,open=>2,tilted=>3}}, + evtDly =>{a=> 33 ,s=>1 ,l=>1,min=>0 ,max=>7620 ,c=>'factor' ,f=>1.6 ,u=>'s' ,d=>0,t=>"Event delay time",},#todo check calculation +# keymatic/winmatic secific register + holdTime =>{a=> 20 ,s=>1, l=>1,min=>0 ,max=>8.16 ,c=>'factor' ,f=>31.25 ,u=>'s' ,d=>0,t=>"Holdtime for door opening"}, + holdPWM =>{a=> 21 ,s=>1, l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"Holdtime pulse wide modulation"}, + setupDir =>{a=> 22 ,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Rotation direction for locking",lit=>{right=>0,left=>1}}, + setupPosition =>{a=> 23 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Rotation angle neutral position"}, + angelOpen =>{a=> 24 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Door opening angle"}, + angelMax =>{a=> 25 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Angle maximum"}, + angelLocked =>{a=> 26 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Angle Locked position"}, + pullForce =>{a=> 28 ,s=>1 ,l=>1,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"pull force level"}, + pushForce =>{a=> 29 ,s=>1 ,l=>1,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"push force level"}, + tiltMax =>{a=> 30 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"maximum tilt level"}, + ledFlashUnlocked=>{a=> 31.3,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"LED blinks when not locked",lit=>{off=>0,on=>1}}, + ledFlashLocked =>{a=> 31.6,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"LED blinks when locked" ,lit=>{off=>0,on=>1}}, + + waterUppThr =>{a=> 6.0,s=>1 ,l=>1,min=>0 ,max=>256 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"water upper threshold"}, + waterlowThr =>{a=> 7.0,s=>1 ,l=>1,min=>0 ,max=>256 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"water lower threshold"}, + caseDesign =>{a=> 90.0,s=>1 ,l=>1,min=>1 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"case desing" ,lit=>{verticalBarrel=>1,horizBarrel=>2,rectangle=>3}}, + caseHigh =>{a=> 94.0,s=>2 ,l=>1,min=>100,max=>10000 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"case hight"}, + fillLevel =>{a=> 98.0,s=>2 ,l=>1,min=>100,max=>300 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"fill level"}, + caseWidth =>{a=>102.0,s=>2 ,l=>1,min=>100,max=>10000 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"case width"}, + caseLength =>{a=>106.0,s=>2 ,l=>1,min=>100,max=>10000 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"case length"}, + meaLength =>{a=>108.0,s=>2 ,l=>1,min=>110,max=>310 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>""}, + useCustom =>{a=>110.0,s=>1 ,l=>1,min=>110,max=>310 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"use custom" ,lit=>{off=>0,on=>1}}, + + evtFltrPeriod =>{a=> 1.0,s=>0.4,l=>1,min=>0.5,max=>7.5 ,c=>'factor' ,f=>2 ,u=>'s' ,d=>1,t=>"event filter period"}, + evtFltrNum =>{a=> 1.4,s=>0.4,l=>1,min=>1 ,max=>15 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"sensitivity - read sach n-th puls"}, + minInterval =>{a=> 2.0,s=>0.3,l=>1,min=>0 ,max=>4 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"minimum interval in sec" ,lit=>{15=>0,30=>1,60=>2,120=>3,240=>4}}, + captInInterval =>{a=> 2.3,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"capture within interval" ,lit=>{off=>0,on=>1}}, + brightFilter =>{a=> 2.4,s=>0.4,l=>1,min=>0 ,max=>7 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"brightness filter - ignore light at night"}, + msgScPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>2 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,closed=>1,open=>2}}, + msgScPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>2 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,closed=>1,open=>2}}, + eventDlyTime =>{a=> 33 ,s=>1 ,l=>1,min=>0 ,max=>7620 ,c=>'fltCvT' ,f=>'' ,u=>'s' ,d=>1,t=>"event delay time"}, + ledOnTime =>{a=> 34 ,s=>1 ,l=>1,min=>0 ,max=>1.275 ,c=>'factor' ,f=>200 ,u=>'s' ,d=>0,t=>"LED ontime"}, + eventFilterTime =>{a=> 35 ,s=>1 ,l=>1,min=>0 ,max=>7620 ,c=>'fltCvT' ,f=>'' ,u=>'s' ,d=>0,t=>"event filter time"}, + +# weather units + stormUpThresh =>{a=> 6 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"Storm upper threshold"}, + stormLowThresh =>{a=> 7 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"Storm lower threshold"}, +# others + localResetDis =>{a=> 7 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"LocalReset disable",lit=>{off=>0,on=>1}}, + # logicCombination=>{a=> 89.0,s=>0.5,l=>1,min=>0 ,max=>16 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"". # "inactive=>unused\n". # "or =>max(state,chan)\n". @@ -362,20 +424,30 @@ my %culHmRegDefine = ( # # #CC-TC - backlOnTime =>{a=> 5.0,s=>0.6,l=>0,min=>1 ,max=>25 ,c=>"" ,f=>'' ,u=>'s' ,d=>0,t=>"Backlight ontime"}, - backlOnMode =>{a=> 5.6,s=>0.2,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Backlight mode" ,lit=>{off=>0,auto=>1}}, - btnLock =>{a=> 15 ,s=>1 ,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Button Lock" ,lit=>{unlock=>0,lock=>1}}, - dispTempHum =>{a=> 1.0,s=>0.1,l=>5,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{temp=>0,tempHumidity=>1}}, - dispTempInfo =>{a=> 1.1,s=>0.1,l=>5,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{actual=>0,setPoint=>1}}, - dispTempUnit =>{a=> 1.2,s=>0.1,l=>5,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{Celsius=>0,Fahrenheit=>1}}, - mdTempReg =>{a=> 1.3,s=>0.2,l=>5,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{manual=>0,auto=>1,central=>2,party=>3}}, - decalDay =>{a=> 1.5,s=>0.3,l=>5,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Decalc weekday" ,lit=>{sat=>0,sun=>1,mon=>2,tue=>3,wed=>4,thu=>5,fri=>6}}, +#--- list 3, link level for actor - mainly in short/long hash, only specials here------------------ + lgMultiExec =>{a=>138.5,s=>0.1,l=>3,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"multiple execution per repeat of long trigger" ,lit=>{off=>0,on=>1}}, + +#--- list 4, link level for Button ------------------ + peerNeedsBurst =>{a=> 1.0,s=>0.1,l=>4,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"peer expects burst",lit=>{off=>0,on=>1}}, + expectAES =>{a=> 1.7,s=>0.1,l=>4,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"expect AES" ,lit=>{off=>0,on=>1}}, + lcdSymb =>{a=> 2.0,s=>0.1,l=>4,min=>0 ,max=>255 ,c=>'hex' ,f=>'' ,u=>'' ,d=>0,t=>"bitmask which symbol to display on message"}, + lcdLvlInterp =>{a=> 3.0,s=>0.1,l=>4,min=>0 ,max=>255 ,c=>'hex' ,f=>'' ,u=>'' ,d=>0,t=>"bitmask fro symbols"}, + + fillLvlUpThr =>{a=> 4.0,s=>1 ,l=>4,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"fill level upper threshold"}, + fillLvlLoThr =>{a=> 5.0,s=>1 ,l=>4,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"fill level lower threshold"}, + +#--- list 5,6 parameter for channel ------------------ + displayMode =>{a=> 1.0,s=>0.1,l=>5,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{"temp-only"=>0,"temp-hum"=>1}}, + displayTemp =>{a=> 1.1,s=>0.1,l=>5,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{actual=>0,setpoint=>1}}, + displayTempUnit =>{a=> 1.2,s=>0.1,l=>5,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{celsius=>0,fahrenheit=>1}}, + controlMode =>{a=> 1.3,s=>0.2,l=>5,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{manual=>0,auto=>1,central=>2,party=>3}}, + decalcDay =>{a=> 1.5,s=>0.3,l=>5,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Decalc weekday" ,lit=>{Sat=>0,Sun=>1,Mon=>2,Tue=>3,Wed=>4,Thu=>5,Fri=>6}}, mdTempValve =>{a=> 2.6,s=>0.2,l=>5,min=>0 ,max=>2 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{auto=>0,close=>1,open=>2}}, - tempComfort =>{a=> 3 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"comfort temp value"}, - tempLower =>{a=> 4 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"comfort temp value"}, + "day-temp" =>{a=> 3 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"comfort temp value"}, + "night-temp" =>{a=> 4 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"comfort temp value"}, tempWinOpen =>{a=> 5 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"Temperature for Win open !chan 3 only!"}, - tempParty =>{a=> 6 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"Temperature for Party"}, + "party-temp" =>{a=> 6 ,s=>0.6,l=>5,min=>6 ,max=>30 ,c=>'factor' ,f=>2 ,u=>'C' ,d=>1,t=>"Temperature for Party"}, decalMin =>{a=> 8 ,s=>0.3,l=>5,min=>0 ,max=>50 ,c=>'factor' ,f=>0.1 ,u=>'min' ,d=>1,t=>"Decalc min"}, decalHr =>{a=> 8.3,s=>0.5,l=>5,min=>0 ,max=>23 ,c=>'' ,f=>'' ,u=>'h' ,d=>1,t=>"Decalc hour"}, partyEndHr =>{a=> 97 ,s=>0.6,l=>6,min=>0 ,max=>23 ,c=>'' ,f=>'' ,u=>'h' ,d=>1,t=>"Party end Hour"}, @@ -384,70 +456,6 @@ my %culHmRegDefine = ( #Thermal-cc-VD valveOffset =>{a=> 9 ,s=>0.5,l=>5,min=>0 ,max=>25 ,c=>'' ,f=>'' ,u=>'%' ,d=>1,t=>"Valve offset"}, # size actually 0.5 valveError =>{a=> 10 ,s=>1 ,l=>5,min=>0 ,max=>99 ,c=>'' ,f=>'' ,u=>'%' ,d=>1,t=>"Valve position when error"},# size actually 0.7 -#SCD - msgScdPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,lvlNormal=>1}}, - msgScdPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, - msgScdPosC =>{a=> 32.2,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position C",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, - msgScdPosD =>{a=> 32.0,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position D",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, - evtFltrTime =>{a=> 35.0,s=>1 ,l=>1,min=>600,max=>1200 ,c=>'' ,f=>1.6 ,u=>'s' ,d=>0,t=>"Event filter time",},#todo check calculation -#rhs - different literals - msgRhsPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,closed=>1,open=>2,tilted=>3}}, - msgRhsPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,closed=>1,open=>2,tilted=>3}}, - msgRhsPosC =>{a=> 32.2,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position C",lit=>{noMsg=>0,closed=>1,open=>2,tilted=>3}}, - evtDly =>{a=> 33 ,s=>1 ,l=>1,min=>0 ,max=>7620 ,c=>'factor' ,f=>1.6 ,u=>'s' ,d=>0,t=>"Event delay time",},#todo check calculation -# keymatic/winmatic secific register - signal =>{a=> 3.4,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Confirmation beep" ,lit=>{off=>0,on=>1}}, - signalTone =>{a=> 3.6,s=>0.2,l=>0,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"" ,lit=>{low=>0,mid=>1,high=>2,veryHigh=>3}}, - keypressSignal =>{a=> 3.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Keypress beep" ,lit=>{off=>0,on=>1}}, - holdTime =>{a=> 20 ,s=>1, l=>1,min=>0 ,max=>8.16 ,c=>'factor' ,f=>31.25 ,u=>'s' ,d=>0,t=>"Holdtime for door opening"}, - holdPWM =>{a=> 21 ,s=>1, l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"Holdtime pulse wide modulation"}, - setupDir =>{a=> 22 ,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Rotation direction for locking",lit=>{right=>0,left=>1}}, - setupPosition =>{a=> 23 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Rotation angle neutral position"}, - angelOpen =>{a=> 24 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Door opening angle"}, - angelMax =>{a=> 25 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Angle maximum"}, - angelLocked =>{a=> 26 ,s=>1 ,l=>1,min=>0 ,max=>3000 ,c=>'factor' ,f=>0.06666 ,u=>'deg' ,d=>1,t=>"Angle Locked position"}, - pullForce =>{a=> 28 ,s=>1 ,l=>1,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"pull force level"}, - pushForce =>{a=> 29 ,s=>1 ,l=>1,min=>0 ,max=>100 ,c=>'factor' ,f=>2 ,u=>'%' ,d=>1,t=>"push force level"}, - tiltMax =>{a=> 30 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"maximum tilt level"}, - ledFlashUnlocked=>{a=> 31.3,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"LED blinks when not locked",lit=>{off=>0,on=>1}}, - ledFlashLocked =>{a=> 31.6,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"LED blinks when locked" ,lit=>{off=>0,on=>1}}, -# sec_mdir - cyclicInfoMsg =>{a=> 9 ,s=>1 ,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"cyclic message",lit=>{off=>0,on=>1}}, - sabotageMsg =>{a=> 16.0,s=>1 ,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"enable sabotage message" ,lit=>{off=>0,on=>1}}, - lowBatLimit =>{a=> 18.0,s=>1 ,l=>0,min=>10 ,max=>12 ,c=>'factor' ,f=>10 ,u=>'V' ,d=>1,t=>"low batterie limit"}, - batDefectLimit =>{a=> 19.0,s=>1 ,l=>0,min=>0.1,max=>2 ,c=>'factor' ,f=>100 ,u=>'Ohm' ,d=>1,t=>"batterie defect detection"}, - transmDevTryMax =>{a=> 20.0,s=>1.0,l=>0,min=>1 ,max=>10 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"max message re-transmit"}, - localResDis =>{a=> 24.0,s=>1.0,l=>0,min=>1 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"local reset disable" ,lit=>{off=>0,on=>1}}, - - waterUppThr =>{a=> 6.0,s=>1 ,l=>1,min=>0 ,max=>256 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"water upper threshold"}, - waterlowThr =>{a=> 7.0,s=>1 ,l=>1,min=>0 ,max=>256 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"water lower threshold"}, - caseDesign =>{a=> 90.0,s=>1 ,l=>1,min=>1 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"case desing" ,lit=>{verticalBarrel=>1,horizBarrel=>2,rectangle=>3}}, - caseHigh =>{a=> 94.0,s=>2 ,l=>1,min=>100,max=>10000 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"case hight"}, - fillLevel =>{a=> 98.0,s=>2 ,l=>1,min=>100,max=>300 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"fill level"}, - caseWidth =>{a=>102.0,s=>2 ,l=>1,min=>100,max=>10000 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"case width"}, - caseLength =>{a=>106.0,s=>2 ,l=>1,min=>100,max=>10000 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>"case length"}, - meaLength =>{a=>108.0,s=>2 ,l=>1,min=>110,max=>310 ,c=>'' ,f=>'' ,u=>'cm' ,d=>1,t=>""}, - useCustom =>{a=>110.0,s=>1 ,l=>1,min=>110,max=>310 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"use custom" ,lit=>{off=>0,on=>1}}, - - fillLvlUpThr =>{a=> 4.0,s=>1 ,l=>4,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"fill level upper threshold"}, - fillLvlLoThr =>{a=> 5.0,s=>1 ,l=>4,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"fill level lower threshold"}, - - evtFltrPeriod =>{a=> 1.0,s=>0.4,l=>1,min=>0.5,max=>7.5 ,c=>'factor' ,f=>2 ,u=>'s' ,d=>1,t=>"event filter period"}, - evtFltrNum =>{a=> 1.4,s=>0.4,l=>1,min=>1 ,max=>15 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"sensitivity - read sach n-th puls"}, - minInterval =>{a=> 2.0,s=>0.3,l=>1,min=>0 ,max=>4 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"minimum interval in sec" ,lit=>{15=>0,30=>1,60=>2,120=>3,240=>4}}, - captInInterval =>{a=> 2.3,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"capture within interval" ,lit=>{off=>0,on=>1}}, - brightFilter =>{a=> 2.4,s=>0.4,l=>1,min=>0 ,max=>7 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"brightness filter - ignore light at night"}, - msgScPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>2 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,closed=>1,open=>2}}, - msgScPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>2 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,closed=>1,open=>2}}, - eventDlyTime =>{a=> 33 ,s=>1 ,l=>1,min=>0 ,max=>7620 ,c=>'fltCvT' ,f=>'' ,u=>'s' ,d=>1,t=>"event delay time"}, - ledOnTime =>{a=> 34 ,s=>1 ,l=>1,min=>0 ,max=>1.275 ,c=>'factor' ,f=>200 ,u=>'s' ,d=>0,t=>"LED ontime"}, - eventFilterTime =>{a=> 35 ,s=>1 ,l=>1,min=>0 ,max=>7620 ,c=>'fltCvT' ,f=>'' ,u=>'s' ,d=>0,t=>"event filter time"}, - -# weather units - stormUpThresh =>{a=> 6 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"Storm upper threshold"}, - stormLowThresh =>{a=> 7 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"Storm lower threshold"}, -# others - localResetDis =>{a=> 7 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"LocalReset disable",lit=>{off=>0,on=>1}}, ); my %culHmRegGeneral = ( @@ -506,7 +514,7 @@ my %culHmRegType = ( KeyJtOn =>1,KeyJtOff =>1, OnTime =>1, }, - motionDetector =>{evtFltrPeriod =>1,evtFltrNum =>1,minInterval =>1, + motionDetector =>{evtFltrPeriod =>1,evtFltrNum =>1,minInterval =>1, captInInterval=>1,brightFilter =>1,ledOnTime =>1, }, ); @@ -578,11 +586,13 @@ my %culHmRegModel = ( expectAES =>1,peerNeedsBurst =>1,}, ); my %culHmRegChan = (# if channelspecific then enter them here - "HM-CC-TC02" =>{dispTempHum =>1,dispTempInfo =>1,dispTempUnit =>1,mdTempReg =>1, - mdTempValve =>1,tempComfort =>1,tempLower =>1,partyEndDay =>1, - partyEndMin =>1,partyEndHr =>1,tempParty =>1,decalDay =>1, + "HM-CC-TC02" =>{displayMode =>1,displayTemp =>1,displayTempUnit=>1, + controlMode =>1,decalcDay =>1, + "day-temp" =>1,"night-temp" =>1,"party-temp" =>1, + mdTempValve =>1,partyEndDay =>1, + partyEndMin =>1,partyEndHr =>1, decalHr =>1,decalMin =>1, - }, + }, "HM-CC-TC03" =>{tempWinOpen =>1, }, #window channel "HM-RC-1912" =>{msgShowTime =>1, beepAtAlarm =>1, beepAtService =>1,beepAtInfo =>1, backlAtAlarm =>1, backlAtService =>1, backlAtInfo =>1, @@ -617,6 +627,7 @@ my @culHmCmdFlags = ("WAKEUP", "WAKEMEUP", "CFG", "Bit3", ##--------------- Conversion routines for register settings +##############################---get---######################################## #define gets - try use same names as for set my %culHmGlobalGets = ( param => "", @@ -631,7 +642,7 @@ my %culHmModelGets = ( none4Mod =>{ "none"=>"" }, ); -################################### +##############################---set---######################################## my %culHmGlobalSetsDevice = ( raw => "data ...", reset => "", @@ -754,7 +765,7 @@ my %culHmChanSets = ( level =>" ..."}, ); -############################# +##############################---messages---################################### my %culHmBits = ( "00" => { txt => "DEVICE_INFO", params => { FIRMWARE => '00,2',