diff --git a/FHEM/10_CUL_HM.pm b/FHEM/10_CUL_HM.pm index 47fdcca21..6202747d5 100755 --- a/FHEM/10_CUL_HM.pm +++ b/FHEM/10_CUL_HM.pm @@ -165,6 +165,11 @@ sub CUL_HM_Initialize($) { $hash->{helper}{qReqStatWu} = \@statQWuArr; $hash->{helper}{qReqConf} = \@confQArr; $hash->{helper}{qReqConfWu} = \@confQWuArr; + #statistics + $hash->{stat}{s}{dummy}=0; + $hash->{stat}{r}{dummy}=0; + InternalTimer(gettimeofday()+3600*20,"CUL_HM_statCntRfresh","StatCntRfresh", 0); + CUL_HM_initRegHash(); $hash->{hmIoMaxDly} = 60;# poll timeout - stop poll and discard $hash->{hmAutoReadScan} = 4; # delay autoConf readings @@ -189,8 +194,7 @@ sub CUL_HM_updateConfig($){ if ( $hash->{helper}{role}{dev} && AttrVal($name,"subType","") ne "virtual"){ $attr{$name}{expert} = AttrVal($name,"expert" ,"2_full"); - $attr{$name}{autoReadReg}= AttrVal($name,"autoReadReg","4_reqStatus") - if(CUL_HM_getRxType($hash)&0xEB); + $attr{$name}{autoReadReg}= AttrVal($name,"autoReadReg","4_reqStatus"); } CUL_HM_Attr("attr",$name,"expert",$attr{$name}{expert});#need update after readings are available } @@ -529,7 +533,8 @@ sub CUL_HM_Parse($$) {############################## # $shash will be replaced for multichannel commands my $shash = $modules{CUL_HM}{defptr}{$src}; my $dhash = $modules{CUL_HM}{defptr}{$dst}; - + CUL_HM_statCnt($ioName,"r"); + $respRemoved = 0; #set to 'no response in this message' at start if(!$shash) { # Unknown source # Generate an UNKNOWN event for pairing requests, ignore everything else @@ -1066,12 +1071,14 @@ sub CUL_HM_Parse($$) {############################## push @event, "timedOn:".(($err&0x40)?"running":"off"); if ($st ne "switch"){ - push @event, "$eventName:up:$vs" if(($err&0x30) == 0x10); - push @event, "$eventName:down:$vs" if(($err&0x30) == 0x20); - push @event, "$eventName:stop:$vs" if(($err&0x30) == 0x00); + my $dir = $err&0x30; + if ($dir == 0x10){push @event, "$eventName:up:$vs" ;} + elsif($dir == 0x20){push @event, "$eventName:down:$vs";} + elsif($dir == 0x00){push @event, "$eventName:stop:$vs";} + elsif($dir == 0x30){push @event, "$eventName:err:$vs";} if (!$rSUpdt){#dont touch if necessary for dimmer - if(($err&0x30) != 0x00){CUL_HM_stateUpdatDly($shash->{NAME},120);} - else {CUL_HM_unQEntity($shash->{NAME},"qReqStat");} + if($dir != 0x00){CUL_HM_stateUpdatDly($shash->{NAME},120);} + else {CUL_HM_unQEntity($shash->{NAME},"qReqStat");} } } if ($st eq "dimmer"){ @@ -1576,6 +1583,7 @@ sub CUL_HM_parseCommon(@){##################################################### foreach (keys%{$shash->{helper}{prt}{rspWaitSec}}); #back to original message delete $shash->{helper}{prt}{rspWaitSec}; IOWrite($shash, "", $shash->{helper}{prt}{rspWait}{cmd}); # and send + CUL_HM_statCnt($shash->{IODev}{NAME},"s"); #General set timer return "done" } @@ -1675,10 +1683,11 @@ sub CUL_HM_parseCommon(@){##################################################### $idstr =~ s/(..)/sprintf("%02X%s",$s++,$1)/ge; CUL_HM_pushConfig($shash, $id, $src,0,0,0,0, "0201$idstr"); CUL_HM_ProcessCmdStack($shash); # start processing immediately + CUL_HM_qAutoRead($shash->{NAME},0); CUL_HM_appFromQ($shash->{NAME},"cf");# stack cmds if waiting - } elsif(CUL_HM_getRxType($shash) & 0x04){# nothing to pair - maybe send config + CUL_HM_qAutoRead($shash->{NAME},0); CUL_HM_appFromQ($shash->{NAME},"cf"); # stack cmds if waiting if (hex($mFlg)&0x20){CUL_HM_SndCmd($shash,$mNo."8002".$id.$src."00");} else{ CUL_HM_ProcessCmdStack($shash);} ;#config @@ -2215,7 +2224,7 @@ sub CUL_HM_Set($@) { elsif($cmd eq "text") { ################################################# reg my ($bn,$l1, $l2) = ($chn,$a[2],$a[3]); # Create CONFIG_WRITE_INDEX string if (!$roleC){# if used on device. - return "$a[2] is not a button number" if($a[2] !~ m/^\d$/ || $a[2] < 1); + 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)$/); $bn = $a[2]*2-($a[3] eq "on" ? 0 : 1); ($l1, $l2) = ($a[4],$a[5]); @@ -3690,11 +3699,58 @@ sub CUL_HM_SndCmd($$) { } $cmd = sprintf("As%02X%02X%s", length($cmd2)/2+1, $mn, $cmd2); IOWrite($hash, "", $cmd); + CUL_HM_statCnt($ioName,"s"); CUL_HM_eventP($hash,"Snd"); CUL_HM_responseSetup($hash,$cmd); $cmd =~ m/As(..)(..)(..)(..)(......)(......)(.*)/; CUL_HM_DumpProtocol("SND", $io, ($1,$2,$3,$4,$5,$6,$7)); } +sub CUL_HM_statCnt($$) {# set msg statistics for (r)ecive (s)end or (u)pdate + my ($ioName,$dir) = @_; + my $stat = $modules{CUL_HM}{stat}; + if (!$stat->{$ioName}){ + $stat->{r}{$ioName}{h}{$_} = 0 foreach(0..23); + $stat->{r}{$ioName}{d}{$_} = 0 foreach(0..6); + $stat->{s}{$ioName}{h}{$_} = 0 foreach(0..23); + $stat->{s}{$ioName}{d}{$_} = 0 foreach(0..6); + $stat->{$ioName}{last} = 0; + } + my @l = localtime(gettimeofday()); + + if ($l[2] != $stat->{$ioName}{last}){#next field + my $end = $l[2]; + if ($l[2] < $stat->{$ioName}{last}){#next day + $end += 24; + my $recentD = ($l[6]+6)%7; + foreach my $ud ("r","s"){ + $stat->{$ud}{$ioName}{d}{$recentD} = 0; + $stat->{$ud}{$ioName}{d}{$recentD} += $stat->{$ud}{$ioName}{h}{$_} + foreach (0..23); + } + } + foreach (($stat->{$ioName}{last}+1)..$end){ + $stat->{r}{$ioName}{h}{$_%24} = 0; + $stat->{s}{$ioName}{h}{$_%24} = 0; + } + $stat->{$ioName}{last} = $l[2]; + } + $stat->{$dir}{$ioName}{h}{$l[2]}++ if ($dir ne "u"); +} +sub CUL_HM_statCntRfresh($) {# update statistic once a day + my ($ioName,$dir) = @_; + foreach (keys %{$modules{CUL_HM}{stat}{r}}){ + if (!$defs{$ioName}){#IO device is deleted, clear counts + delete $modules{CUL_HM}{stat}{$ioName}; + delete $modules{CUL_HM}{stat}{r}{$ioName}{h}; + delete $modules{CUL_HM}{stat}{r}{$ioName}{d}; + delete $modules{CUL_HM}{stat}{s}{$ioName}{h}; + delete $modules{CUL_HM}{stat}{s}{$ioName}{d}; + next; + } + CUL_HM_statCnt($_,"u") if ($_ ne "dummy"); + } + InternalTimer(gettimeofday()+3600*20,"CUL_HM_statCntRfresh","StatCntRfrh",0); +} sub CUL_HM_respPendRm($) {#del response related entries in messageing entity my ($hash) = @_; @@ -3757,6 +3813,7 @@ sub CUL_HM_respPendTout($) { else{# normal device resend CUL_HM_eventP($hash,"Resnd"); IOWrite($hash, "", $pHash->{rspWait}{cmd}); + CUL_HM_statCnt($hash->{IODev}{NAME},"s"); $pHash->{rspWait}{reSent}++; Log GetLogLevel($name,4),"CUL_HM_Resend: ".$name. " nr ".$pHash->{rspWait}{reSent}; InternalTimer(gettimeofday()+rand(20)/10+4,"CUL_HM_respPendTout","respPend:$hash->{DEF}", 0); diff --git a/FHEM/98_HMinfo.pm b/FHEM/98_HMinfo.pm index a82865728..33246267f 100644 --- a/FHEM/98_HMinfo.pm +++ b/FHEM/98_HMinfo.pm @@ -249,6 +249,44 @@ use warnings; return sort(@names); } +sub HMinfo_getMsgStat() { ##################################################### + my ($hr,$dr,$hs,$ds); + $hr = sprintf("\n %-14s:","receive hour"); + $hs = sprintf("\n %-14s:","send hour"); + $dr = sprintf("\n %-14s:","receive day"); + $ds = sprintf("\n %-14s:","send day"); + $hr .= sprintf("| %02d",$_) foreach (0..23); + $hs .= sprintf("| %02d",$_) foreach (0..23); + $dr .= sprintf("|%4s",$_) foreach ("Mon","Tue","Wed","Thu","Fri","Sat","Sun","# tdy"); + $ds .= sprintf("|%4s",$_) foreach ("Mon","Tue","Wed","Thu","Fri","Sat","Sun","# tdy"); + foreach my $ioD(keys %{$modules{CUL_HM}{stat}{r}}){ + next if ($ioD eq "dummy"); + $hr .= sprintf("\n %-10s:",$ioD); + $hs .= sprintf("\n %-10s:",$ioD); + $dr .= sprintf("\n %-10s:",$ioD); + $ds .= sprintf("\n %-10s:",$ioD); + $hr .= sprintf("|%3d",$modules{CUL_HM}{stat}{r}{$ioD}{h}{$_}) foreach (0..23); + $hs .= sprintf("|%3d",$modules{CUL_HM}{stat}{s}{$ioD}{h}{$_}) foreach (0..23); + $dr .= sprintf("|%4d",$modules{CUL_HM}{stat}{r}{$ioD}{d}{$_}) foreach (0..6); + $ds .= sprintf("|%4d",$modules{CUL_HM}{stat}{s}{$ioD}{d}{$_}) foreach (0..6); + + my ($tdr,$tds); + $tdr += $modules{CUL_HM}{stat}{r}{$ioD}{h}{$_} foreach (0..23); + $tds += $modules{CUL_HM}{stat}{s}{$ioD}{h}{$_} foreach (0..23); + $dr .= sprintf("|#%4d",$tdr); + $ds .= sprintf("|#%4d",$tds); + } + my @l = localtime(gettimeofday()); + my $tsts = "\n |"; + $tsts .= "----" foreach (1..$l[2]); + $tsts .= ">*" ; + return "msg statistics\n" + .$tsts + .$hr.$hs + .$tsts + .$dr.$ds + ; +} sub HMinfo_SetFn($@) {######################################################### my ($hash,$name,$cmd,@a) = @_; my ($opt,$optEmpty,$filter) = ("",1,""); @@ -274,17 +312,28 @@ sub HMinfo_SetFn($@) {######################################################### } elsif($cmd eq "clear" ) {##actionImmediate: clear parameter-------------- my ($type) = @a; - $opt .= "d" if ($type !~ m/(readings|register)/);# readings apply to all, others device only - my @entities; - return "unknown parameter - use Protocol, readings, register or rssi" - if ($type !~ m/^(Protocol|readings|register|rssi)$/); - $type = "msgEvents" if ($type eq "Protocol");# translate parameter - foreach my $dName (HMinfo_getEntities($opt."v",$filter)){ - push @entities,$dName; - CUL_HM_Set($defs{$dName},$dName,"clear",$type); + if ($type eq "msgStat"){ + foreach (keys %{$modules{CUL_HM}{stat}{r}}){ + next if ($_ ne "dummy"); + delete $modules{CUL_HM}{stat}{$_}; + delete $modules{CUL_HM}{stat}{r}{$_}; + delete $modules{CUL_HM}{stat}{s}{$_}; + } + return; + } + else{ + return "unknown parameter - use Protocol, readings, msgStat, register or rssi" + if ($type !~ m/^(Protocol|readings|register|rssi)$/); + $opt .= "d" if ($type !~ m/(readings|register)/);# readings apply to all, others device only + my @entities; + $type = "msgEvents" if ($type eq "Protocol");# translate parameter + foreach my $dName (HMinfo_getEntities($opt."v",$filter)){ + push @entities,$dName; + CUL_HM_Set($defs{$dName},$dName,"clear",$type); + } + return $cmd.$type." done:" ."\n cleared" ."\n ".(join "\n ",sort @entities) + ; } - return $cmd.$type." done:" ."\n cleared" ."\n ".(join "\n ",sort @entities) - ; } elsif($cmd eq "autoReadReg"){##actionImmediate: re-issue register Read------- my @entities; @@ -357,6 +406,9 @@ sub HMinfo_SetFn($@) {######################################################### } $ret .= "\n IODevs:".(join"\n ",HMinfo_noDup(@IOlist)); } + elsif($cmd eq "msgStat") {##print message statistics---------------------- + $ret = HMinfo_getMsgStat(); + } elsif($cmd eq "rssi") {##print RSSI protocol-events-------------------- my @rssiList; foreach my $dName (HMinfo_getEntities($opt."dv",$filter)){ @@ -551,6 +603,7 @@ sub HMinfo_SetFn($@) {######################################################### ."\n peerXref [] # peer cross-reference" ."\n models [] # list of models incl native parameter" ."\n protoEvents [] [short|long] # protocol status - names can be filtered" + ."\n msgStat # view message statistic" ."\n param [] [] [] ... # displays params for all entities as table" ."\n rssi [] # displays receive level of the HM devices" ."\n last: most recent" @@ -558,11 +611,12 @@ sub HMinfo_SetFn($@) {######################################################### ."\n range: min to max value" ."\n count: number of events in calculation" ."\n ---clear status---" - ."\n clear [] [Protocol|Readings|Rssi]" + ."\n clear [] [Protocol|readings|msgStat|register|rssi]" ."\n Protocol # delete all protocol-events" ."\n readings # delete all readings" ."\n register # delete all register-readings" ."\n rssi # delete all rssi data" + ."\n msgStat # delete message statistics" ."\n ---help---" ."\n help #" ."\n ***footnote***" @@ -627,7 +681,7 @@ sub HMinfo_SetFnDly($) {####################################################### else{ return "autoReadReg clear " ."configCheck param peerCheck peerXref " - ."protoEvents models regCheck register rssi saveConfig update " + ."protoEvents msgStat:view,clear models regCheck register rssi saveConfig update " ."cpRegs templateChk templateDef templateList templateSet"; } return $ret; @@ -1230,12 +1284,14 @@ sub HMinfo_noDup(@) {#return list with no duplicates
  • autoReadReg [filter]
    schedules a read of the configuration for the CUL_HM devices with attribut autoReadReg set to 1 or higher.
  • -
  • clear [Protocol|Readings|Rssi] [filter]
    +
  • clear [Protocol|readings|msgStat|register|rssi] [filter]
    executes a set clear ... on all HM entities
    • Protocol relates to set clear msgEvents
    • -
    • Readings relates to set clear readings
    • -
    • Rssi clears all rssi counters
    • +
    • readings relates to set clear readings
    • +
    • rssi clears all rssi counters
    • +
    • msgStat clear HM general message statistics
    • +
    • register clears all register-entries in readings
  • saveConfig [filter]
    diff --git a/FHEM/HMConfig.pm b/FHEM/HMConfig.pm index 63439b828..b91e5aad2 100644 --- a/FHEM/HMConfig.pm +++ b/FHEM/HMConfig.pm @@ -520,9 +520,10 @@ my %culHmRegDefine = ( # SEC-WM55 08:01 (AES on?) # SEC-WDS 34:0x64 ? # SEC-SC 08:00 ? -# RC19 08:00 ? +# RC19 08:00 ? RC19 Button 08:08 # Bl1PBU 08:00 09:00 10:00 + # 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". @@ -551,8 +552,8 @@ my %culHmRegDefine = ( #--- 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 for symbols"}, + lcdSymb =>{a=> 2.0,s=>0.1,l=>4,min=>0 ,max=>8 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"symbol to display on message",lit=>{"none"=>0,"bulb"=>1,"switch"=>2,"window"=>3,"door"=>4,"blind"=>5,"scene"=>6,"phone"=>7,"bell"=>8}}, + lcdLvlInterp =>{a=> 3.0,s=>0.1,l=>4,min=>0 ,max=>5 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"bitmask for symbols",lit=>{"none"=>0,"light"=>1,"blind"=>2,"marquee"=>3,"door"=>4,"window"=>5}}, 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"}, @@ -640,182 +641,182 @@ my %culHmRegGeneral = ( pairCentral=>1, ); my %culHmRegType = ( - swi =>{peerNeedsBurst =>1,expectAES =>1}, - remote =>{peerNeedsBurst =>1,expectAES =>1,dblPress =>1,longPress =>1, - sign =>1 - }, - blindActuator =>{intKeyVisib =>1, - driveUp =>1,driveDown =>1,driveTurn =>1,refRunCounter =>1, - sign =>1, - MaxTimeF =>1, - OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1, - OffLevel =>1,OnLevel =>1, - ActionType =>1,OnTimeMode =>1,OffTimeMode =>1,DriveMode =>1, - BlJtOn =>1,BlJtOff =>1,BlJtDlyOn =>1,BlJtDlyOff =>1, - BlJtRampOn =>1,BlJtRampOff =>1,BlJtRefOn =>1,BlJtRefOff =>1, - CtValLo =>1,CtValHi =>1, - CtOn =>1,CtDlyOn =>1,CtRampOn =>1,CtRefOn =>1, - CtOff =>1,CtDlyOff =>1,CtRampOff =>1,CtRefOff =>1, - lgMultiExec =>1 - }, - dimmer =>{intKeyVisib =>1, - transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,powerUpAction =>1, - OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1, - OffDlyBlink =>1,OnLvlPrio =>1,OnDlyMode =>1, - ActionTypeDim =>1,OnTimeMode =>1,OffTimeMode =>1, - OffLevel =>1,OnMinLevel =>1,OnLevel =>1, - RampSstep =>1,RampOnTime =>1,RampOffTime =>1, - DimMinLvl =>1,DimMaxLvl =>1,DimStep =>1, - DimJtOn =>1,DimJtOff =>1,DimJtDlyOn =>1, - DimJtDlyOff =>1,DimJtRampOn =>1,DimJtRampOff =>1, - CtValLo =>1,CtValHi =>1, - CtOn =>1,CtDlyOn =>1,CtRampOn =>1, - CtOff =>1,CtDlyOff =>1,CtRampOff =>1, - OffDlyNewTime =>1,OffDlyOldTime =>1, - lgMultiExec =>1 - }, - switch =>{intKeyVisib =>1,sign =>1, - OnTime =>1,OffTime =>1,OnDly =>1,OffDly =>1, - SwJtOn =>1,SwJtOff =>1,SwJtDlyOn =>1,SwJtDlyOff =>1, - CtValLo =>1,CtValHi =>1, - CtOn =>1,CtDlyOn =>1,CtOff =>1,CtDlyOff =>1, - ActionType =>1,OnTimeMode =>1,OffTimeMode =>1, - lgMultiExec =>1 - }, - winMatic =>{signal =>1,signalTone =>1,keypressSignal =>1}, - keyMatic =>{signal =>1,signalTone =>1,keypressSignal =>1, - holdTime =>1,holdPWM =>1,setupDir =>1,setupPosition =>1, - angelOpen =>1,angelMax =>1,angelLocked =>1, - ledFlashUnlocked=>1,ledFlashLocked =>1, - CtValLo =>1,CtValHi =>1, - CtOn =>1,CtOff =>1, - KeyJtOn =>1,KeyJtOff =>1, - OnTime =>1 - }, - motionDetector =>{evtFltrPeriod =>1,evtFltrNum =>1,minInterval =>1, - captInInterval =>1,brightFilter =>1,ledOnTime =>1, - peerNeedsBurst =>1 - }, - threeStateSensor =>{cyclicInfoMsg =>1, transmDevTryMax =>1, - transmitTryMax =>1, - peerNeedsBurst =>1,expectAES =>1 - }, - sensRain =>{transmDevTryMax =>1,localResDis =>1}, - tipTronic =>{cyclicInfoMsg =>1,cyclicInfoMsgDis=>1,localResDis =>1,RS485IdleTime =>1}, - powerMeter =>{intKeyVisib =>1}, - + swi =>{ peerNeedsBurst =>1,expectAES =>1}, + remote =>{ peerNeedsBurst =>1,expectAES =>1,dblPress =>1,longPress =>1 + ,sign =>1 + }, + blindActuator =>{ intKeyVisib =>1 + ,driveUp =>1,driveDown =>1,driveTurn =>1,refRunCounter =>1 + ,sign =>1 + ,MaxTimeF =>1 + ,OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1 + ,OffLevel =>1,OnLevel =>1 + ,ActionType =>1,OnTimeMode =>1,OffTimeMode =>1,DriveMode =>1 + ,BlJtOn =>1,BlJtOff =>1,BlJtDlyOn =>1,BlJtDlyOff =>1 + ,BlJtRampOn =>1,BlJtRampOff =>1,BlJtRefOn =>1,BlJtRefOff =>1 + ,CtValLo =>1,CtValHi =>1 + ,CtOn =>1,CtDlyOn =>1,CtRampOn =>1,CtRefOn =>1 + ,CtOff =>1,CtDlyOff =>1,CtRampOff =>1,CtRefOff =>1 + ,lgMultiExec =>1 + }, + dimmer =>{ intKeyVisib =>1 + ,transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,powerUpAction =>1 + ,OnDly =>1,OnTime =>1,OffDly =>1,OffTime =>1 + ,OffDlyBlink =>1,OnLvlPrio =>1,OnDlyMode =>1 + ,ActionTypeDim =>1,OnTimeMode =>1,OffTimeMode =>1 + ,OffLevel =>1,OnMinLevel =>1,OnLevel =>1 + ,RampSstep =>1,RampOnTime =>1,RampOffTime =>1 + ,DimMinLvl =>1,DimMaxLvl =>1,DimStep =>1 + ,DimJtOn =>1,DimJtOff =>1,DimJtDlyOn =>1 + ,DimJtDlyOff =>1,DimJtRampOn =>1,DimJtRampOff =>1 + ,CtValLo =>1,CtValHi =>1 + ,CtOn =>1,CtDlyOn =>1,CtRampOn =>1 + ,CtOff =>1,CtDlyOff =>1,CtRampOff =>1 + ,OffDlyNewTime =>1,OffDlyOldTime =>1 + ,lgMultiExec =>1 + }, + switch =>{ intKeyVisib =>1,sign =>1 + ,OnTime =>1,OffTime =>1,OnDly =>1,OffDly =>1 + ,SwJtOn =>1,SwJtOff =>1,SwJtDlyOn =>1,SwJtDlyOff =>1 + ,CtValLo =>1,CtValHi =>1 + ,CtOn =>1,CtDlyOn =>1,CtOff =>1,CtDlyOff =>1 + ,ActionType =>1,OnTimeMode =>1,OffTimeMode =>1 + ,lgMultiExec =>1 + }, + winMatic =>{ signal =>1,signalTone =>1,keypressSignal =>1}, + keyMatic =>{ signal =>1,signalTone =>1,keypressSignal =>1 + ,holdTime =>1,holdPWM =>1,setupDir =>1,setupPosition =>1 + ,angelOpen =>1,angelMax =>1,angelLocked =>1 + ,ledFlashUnlocked=>1,ledFlashLocked =>1 + ,CtValLo =>1,CtValHi =>1 + ,CtOn =>1,CtOff =>1 + ,KeyJtOn =>1,KeyJtOff =>1 + ,OnTime =>1 + }, + motionDetector =>{ evtFltrPeriod =>1,evtFltrNum =>1,minInterval =>1 + ,captInInterval =>1,brightFilter =>1,ledOnTime =>1 + ,peerNeedsBurst =>1 + }, + threeStateSensor =>{ cyclicInfoMsg =>1, transmDevTryMax =>1 + , transmitTryMax =>1 + ,peerNeedsBurst =>1,expectAES =>1 + }, + sensRain =>{ transmDevTryMax =>1,localResDis =>1}, + tipTronic =>{ cyclicInfoMsg =>1,cyclicInfoMsgDis=>1,localResDis =>1,RS485IdleTime =>1}, + powerMeter =>{ intKeyVisib =>1}, + ); #clones - - - - - - - - - - - - - - - $culHmRegType{pushButton} = $culHmRegType{remote}; my %culHmRegModel = ( - "HM-RC-12" =>{backAtKey =>1, backAtMotion =>1, backOnTime =>1}, - "HM-RC-19" =>{backAtKey =>1, backAtMotion =>1, backOnTime =>1,backAtCharge =>1,language =>1}, - "HM-RC-4-2" =>{localResDis =>1}, + "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-4-2" =>{ localResDis =>1}, - "HM-LC-Bl1PBU-FM" =>{transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,localResDis =>1}, + "HM-LC-Bl1PBU-FM" =>{ transmitTryMax =>1,statusInfoMinDly=>1,statusInfoRandom=>1,localResDis =>1}, - "HM-LC-Dim1L-Pl" =>{confBtnTime =>1,loadAppearBehav =>1,loadErrCalib =>1 - }, - "HM-LC-Dim1L-CV-2"=>{confBtnTime =>1,loadAppearBehav =>1,loadErrCalib =>1, - logicCombination=>1, - DimElsOffTimeMd =>1,DimElsOnTimeMd =>1, - DimElsActionType=>1, - DimElsJtOn =>1,DimElsJtOff =>1,DimElsJtDlyOn =>1, - DimElsJtDlyOff =>1,DimElsJtRampOn =>1,DimElsJtRampOff =>1 - }, - "HM-LC-Dim1PWM-CV"=>{confBtnTime =>1,ovrTempLvl =>1,redTempLvl =>1,redLvl =>1, - characteristic =>1,localResDis =>1, - logicCombination=>1, - DimElsOffTimeMd =>1,DimElsOnTimeMd =>1, - DimElsActionType=>1, - DimElsJtOn =>1,DimElsJtOff =>1,DimElsJtDlyOn =>1, - DimElsJtDlyOff =>1,DimElsJtRampOn =>1,DimElsJtRampOff =>1 - }, - "HM-LC-Dim1T-Pl" =>{confBtnTime =>1,ovrTempLvl =>1,redTempLvl =>1,redLvl =>1, - fuseDelay =>1 - }, - "HM-LC-Dim1TPBU-FM"=>{ ovrTempLvl =>1,redTempLvl =>1,redLvl =>1, - fuseDelay =>1,localResDis =>1, - logicCombination=>1, - DimElsOffTimeMd =>1,DimElsOnTimeMd =>1, - DimElsActionType=>1, - DimElsJtOn =>1,DimElsJtOff =>1,DimElsJtDlyOn =>1, - DimElsJtDlyOff =>1,DimElsJtRampOn =>1,DimElsJtRampOff =>1 - }, + "HM-LC-Dim1L-Pl" =>{ confBtnTime =>1,loadAppearBehav =>1,loadErrCalib =>1}, + "HM-LC-Dim1L-CV-2" =>{ confBtnTime =>1,loadAppearBehav =>1,loadErrCalib =>1 + ,logicCombination=>1 + ,DimElsOffTimeMd =>1,DimElsOnTimeMd =>1 + ,DimElsActionType=>1 + ,DimElsJtOn =>1,DimElsJtOff =>1,DimElsJtDlyOn =>1 + ,DimElsJtDlyOff =>1,DimElsJtRampOn =>1,DimElsJtRampOff =>1 + }, + "HM-LC-Dim1PWM-CV" =>{ confBtnTime =>1,ovrTempLvl =>1,redTempLvl =>1,redLvl =>1 + ,characteristic =>1,localResDis =>1 + ,logicCombination=>1 + ,DimElsOffTimeMd =>1,DimElsOnTimeMd =>1 + ,DimElsActionType=>1 + ,DimElsJtOn =>1,DimElsJtOff =>1,DimElsJtDlyOn =>1 + ,DimElsJtDlyOff =>1,DimElsJtRampOn =>1,DimElsJtRampOff =>1 + }, + "HM-LC-Dim1T-Pl" =>{ confBtnTime =>1,ovrTempLvl =>1,redTempLvl =>1,redLvl =>1 + ,fuseDelay =>1 + }, + "HM-LC-Dim1TPBU-FM" =>{ ovrTempLvl =>1,redTempLvl =>1,redLvl =>1 + ,fuseDelay =>1,localResDis =>1 + ,logicCombination=>1 + ,DimElsOffTimeMd =>1,DimElsOnTimeMd =>1 + ,DimElsActionType=>1 + ,DimElsJtOn =>1,DimElsJtOff =>1,DimElsJtDlyOn =>1 + ,DimElsJtDlyOff =>1,DimElsJtRampOn =>1,DimElsJtRampOff =>1 + }, - "HM-CC-VD" =>{valveOffset =>1,valveErrorPos =>1}, - "HM-CC-TC" =>{burstRx =>1,backlOnTime =>1,backlOnMode =>1,btnLock =>1}, - "HM-CC-RT-DN" =>{btnLock =>1,localResDis =>1,globalBtnLock =>1,modusBtnLock =>1, - cyclicInfoMsg =>1,cyclicInfoMsgDis=>1, - burstRx =>1,lowBatLimitRT =>1,backOnTime =>1, - sign =>1 - }, + "HM-CC-VD" =>{ valveOffset =>1,valveErrorPos =>1}, + "HM-CC-TC" =>{ burstRx =>1,backlOnTime =>1,backlOnMode =>1,btnLock =>1}, + "HM-CC-RT-DN" =>{ btnLock =>1,localResDis =>1,globalBtnLock =>1,modusBtnLock =>1 + ,cyclicInfoMsg =>1,cyclicInfoMsgDis=>1 + ,burstRx =>1,lowBatLimitRT =>1,backOnTime =>1 + ,sign =>1 + }, - "HM-PB-4DIS-WM" =>{peerNeedsBurst =>1,expectAES =>1,language =>1,stbyTime =>1}, - "HM-WDS100-C6-O" =>{burstRx =>1,sunThresh =>1,stormUpThresh =>1,stormLowThresh =>1}, - "KS550" =>{stormUpThresh =>1,stormLowThresh =>1}, - "HM-OU-LED16" =>{brightness =>1,energyOpt =>1,localResDis =>1}, - "HM-OU-CFM-PL" =>{localResetDis =>1, - OnTime =>1,OffTime =>1,OnDly =>1,OffDly =>1, - OnTimeMode =>1,OffTimeMode =>1, - SwJtOn =>1,SwJtOff =>1,SwJtDlyOn =>1,SwJtDlyOff =>1, - CtValLo =>1,CtValHi =>1, - CtOn =>1,CtDlyOn =>1,CtOff =>1,CtDlyOff =>1, - ActionType =>1,ActNum =>1,lgMultiExec =>1}, - "HM-OU-CF-PL" =>{ActTypeOuCf =>1,ActNum =>1}, - "HM-OU-CM-PCB" =>{localResetDis =>1, - OnTime =>1,OffTime =>1,OnDly =>1,OffDly =>1, - OnTimeMode =>1,OffTimeMode =>1, - SwJtOn =>1,SwJtOff =>1,SwJtDlyOn =>1,SwJtDlyOff =>1, - CtValLo =>1,CtValHi =>1, - CtOn =>1,CtDlyOn =>1,CtOff =>1,CtDlyOff =>1, - ActionType =>1, - ActTypeMp3 =>1,ActNum =>1,Intense =>1,lgMultiExec =>1}, - "HM-SEC-MDIR" =>{ sabotageMsg =>1}, - "HM-CC-SCD" =>{peerNeedsBurst =>1,expectAES =>1, - transmitTryMax =>1,evtFltrTime =>1, - msgScdPosA =>1,msgScdPosB =>1,msgScdPosC =>1,msgScdPosD =>1}, - "HM-SEC-RHS" =>{msgRhsPosA =>1,msgRhsPosB =>1,msgRhsPosC =>1, - ledOnTime =>1,eventDlyTime =>1}, - "HM-SEC-SC" =>{ sabotageMsg =>1, - msgScPosA =>1,msgScPosB =>1, - ledOnTime =>1,eventDlyTime =>1}, - "HM-SCI-3-FM" =>{msgScPosA =>1,msgScPosB =>1, - eventDlyTime =>1}, - "HM-SEC-TIS" =>{ sabotageMsg =>1, - msgScPosA =>1,msgScPosB =>1, - ledOnTime =>1,eventFilterTime =>1}, - "HM-SEC-WDS" =>{msgWdsPosA =>1,msgWdsPosB =>1,msgWdsPosC =>1, - eventFilterTimeB=>1}, - "HM-SEC-SFA-SM" =>{cyclicInfoMsg =>1,sabotageMsg =>1,transmDevTryMax =>1, - lowBatLimit =>1,batDefectLimit =>1, - transmitTryMax =>1}, - "HM-Dis-TD-T" =>{lowBatLimitFS =>1,ledMode =>1}, - "HM-LC-SW1-BA-PCB"=>{lowBatLimitBA =>1,ledMode =>1}, - "HM-Sys-sRP-Pl" =>{compMode =>1}, - "KFM-Display" =>{CtDlyOn =>1,CtDlyOff =>1, - CtOn =>1,CtOff =>1,CtRampOn =>1,CtRampOff =>1, - CtValLo =>1,CtValHi =>1, - ActionType =>1,OffTimeMode =>1,OnTimeMode =>1, - DimJtOn =>1,DimJtOff =>1,DimJtDlyOn =>1,DimJtDlyOff =>1, - DimJtRampOn =>1,DimJtRampOff =>1, - lgMultiExec =>1 - }, - "HM-Sen-Wa-Od" =>{cyclicInfoMsgDis=>1, transmDevTryMax =>1,localResDis =>1, - ledOnTime =>1,transmitTryMax =>1, - waterUppThr =>1,waterlowThr =>1,caseDesign =>1,caseHigh =>1, - fillLevel =>1,caseWidth =>1,caseLength =>1,meaLength =>1, - useCustom =>1, - fillLvlUpThr =>1,fillLvlLoThr =>1, - expectAES =>1,peerNeedsBurst =>1}, - "HM-WDS10-TH-O" =>{burstRx =>1}, - "HM-WDS30-OT2-SM" =>{burstRx =>1,cyclicInfoMsgDis=>1,localResDis =>1,paramSel =>1}, - "HM-TC-IT-WM-W-EU"=>{burstRx =>1,cyclicInfoMsgDis=>1,localResDis =>1,cyclicInfoMsg =>1, - btnLock =>1,globalBtnLock =>1,modusBtnLock =>1,lowBatLimitRT =>1, - }, - "HM-ES-PMSw1-Pl" =>{localResDis =>1,}, - + "HM-PB-4DIS-WM" =>{ peerNeedsBurst =>1,expectAES =>1,language =>1,stbyTime =>1}, + "HM-WDS100-C6-O" =>{ burstRx =>1,sunThresh =>1,stormUpThresh =>1,stormLowThresh =>1}, + "KS550" =>{ stormUpThresh =>1,stormLowThresh =>1}, + "HM-OU-LED16" =>{ brightness =>1,energyOpt =>1,localResDis =>1}, + "HM-OU-CFM-PL" =>{ localResetDis =>1 + ,OnTime =>1,OffTime =>1,OnDly =>1,OffDly =>1 + ,OnTimeMode =>1,OffTimeMode =>1, + ,SwJtOn =>1,SwJtOff =>1,SwJtDlyOn =>1,SwJtDlyOff =>1 + ,CtValLo =>1,CtValHi =>1 + ,CtOn =>1,CtDlyOn =>1,CtOff =>1,CtDlyOff =>1 + ,ActionType =>1,ActNum =>1,lgMultiExec =>1}, + "HM-OU-CF-PL" =>{ ActTypeOuCf =>1,ActNum =>1}, + "HM-OU-CM-PCB" =>{ localResetDis =>1, + ,OnTime =>1,OffTime =>1,OnDly =>1,OffDly =>1 + ,OnTimeMode =>1,OffTimeMode =>1, + ,SwJtOn =>1,SwJtOff =>1,SwJtDlyOn =>1,SwJtDlyOff =>1 + ,CtValLo =>1,CtValHi =>1 + ,CtOn =>1,CtDlyOn =>1,CtOff =>1,CtDlyOff =>1 + ,ActionType =>1 + ,ActTypeMp3 =>1,ActNum =>1,Intense =>1,lgMultiExec =>1}, + "HM-SEC-MDIR" =>{ sabotageMsg =>1}, + "HM-CC-SCD" =>{ peerNeedsBurst =>1,expectAES =>1 + , transmitTryMax =>1,evtFltrTime =>1 + ,msgScdPosA =>1,msgScdPosB =>1,msgScdPosC =>1,msgScdPosD =>1}, + "HM-SEC-RHS" =>{ msgRhsPosA =>1,msgRhsPosB =>1,msgRhsPosC =>1 + , ledOnTime =>1,eventDlyTime =>1}, + "HM-SEC-SC" =>{ sabotageMsg =>1 + ,msgScPosA =>1,msgScPosB =>1 + , ledOnTime =>1,eventDlyTime =>1}, + "HM-SCI-3-FM" =>{ msgScPosA =>1,msgScPosB =>1 + , eventDlyTime =>1}, + "HM-SEC-TIS" =>{ sabotageMsg =>1 + ,msgScPosA =>1,msgScPosB =>1 + , ledOnTime =>1,eventFilterTime =>1}, + "HM-SEC-WDS" =>{ msgWdsPosA =>1,msgWdsPosB =>1,msgWdsPosC =>1 + , eventFilterTimeB=>1}, + "HM-SEC-SFA-SM" =>{ cyclicInfoMsg =>1,sabotageMsg =>1,transmDevTryMax =>1 + ,lowBatLimit =>1,batDefectLimit =>1 + , transmitTryMax =>1}, + "HM-Dis-TD-T" =>{ lowBatLimitFS =>1,ledMode =>1}, + "HM-LC-SW1-BA-PCB" =>{ lowBatLimitBA =>1,ledMode =>1}, + "HM-Sys-sRP-Pl" =>{ compMode =>1}, + "KFM-Display" =>{ CtDlyOn =>1,CtDlyOff =>1 + ,CtOn =>1,CtOff =>1,CtRampOn =>1,CtRampOff =>1 + ,CtValLo =>1,CtValHi =>1 + ,ActionType =>1,OffTimeMode =>1,OnTimeMode =>1 + ,DimJtOn =>1,DimJtOff =>1,DimJtDlyOn =>1,DimJtDlyOff =>1 + ,DimJtRampOn =>1,DimJtRampOff =>1 + ,lgMultiExec =>1 + }, + "HM-Sen-Wa-Od" =>{ cyclicInfoMsgDis=>1, transmDevTryMax =>1,localResDis =>1 + , ledOnTime =>1,transmitTryMax =>1 + ,waterUppThr =>1,waterlowThr =>1,caseDesign =>1,caseHigh =>1 + ,fillLevel =>1,caseWidth =>1,caseLength =>1,meaLength =>1 + ,useCustom =>1, + ,fillLvlUpThr =>1,fillLvlLoThr =>1 + ,expectAES =>1,peerNeedsBurst =>1}, + "HM-WDS10-TH-O" =>{ burstRx =>1}, + "HM-WDS30-OT2-SM" =>{ burstRx =>1,cyclicInfoMsgDis=>1,localResDis =>1,paramSel =>1}, + "HM-TC-IT-WM-W-EU" =>{ burstRx =>1,cyclicInfoMsgDis=>1,localResDis =>1,cyclicInfoMsg =>1 + ,btnLock =>1,globalBtnLock =>1,modusBtnLock =>1,lowBatLimitRT =>1 + }, + "HM-ES-PMSw1-Pl" =>{ localResDis =>1}, ); #clones - - - - - - - - - - - - - - - @@ -882,7 +883,6 @@ my %culHmRegChan = (# if channelspecific then enter them here "HM-CC-TC03" =>{ tempWinOpen =>1 }, #window channel "HM-RC-1912" =>{ msgShowTime =>1, beepAtAlarm =>1, beepAtService =>1,beepAtInfo =>1 ,backlAtAlarm =>1, backlAtService =>1, backlAtInfo =>1 - ,lcdSymb =>1, lcdLvlInterp =>1 }, "HM-OU-CFM-PL01" =>{ ActTypeLed =>1}, "HM-OU-CFM-PL02" =>{ ActTypeMp3 =>1,Intense =>1}, @@ -1027,15 +1027,15 @@ my %culHmSubTypeDevSets = (# device of this subtype blindActuator =>{ statusRequest => "", getSerial => ""}, # remote =>{ }, - threeStateSensor =>{ statusRequest =>""}, +# threeStateSensor =>{ statusRequest =>""}, # THSensor =>{ statusRequest =>""}, at least OT/OT2 do not support this # virtual =>{ }, -# smokeDetector =>{ statusRequest => ""}, +# smokeDetector =>{ statusRequest => ""},#not SCD winMatic =>{ statusRequest => ""}, keyMatic =>{ statusRequest => ""}, repeater =>{ statusRequest => "", getSerial => ""}, - outputUnit =>{ statusRequest => ""}, + outputUnit =>{ statusRequest => ""},# also LED16? proof ); my %culHmGlobalSetsChn = (# all channels but virtuals @@ -1075,17 +1075,18 @@ my %culHmSubTypeSets = (# channels of this subtype ,statusRequest =>""}, remote =>{ peerChan =>" ... [single|dual] [set|unset] [actor|remote|both]"}, threeStateSensor =>{ peerChan =>" ... single [set|unset] [actor|remote|both]" - ,statusRequest =>""}, +# ,statusRequest =>"" + }, THSensor =>{ peerChan =>" ... single [set|unset] [actor|remote|both]"}, virtual =>{ peerChan =>" ... [single|dual] [set|unset] [actor|remote|both]" ,press =>"[long|short]..." ,postEvent =>"" - ,valvePos =>""},#acting as TC +# ,valvePos =>"" + },#acting as TC smokeDetector =>{ test =>"" ,alarmOn =>"" ,alarmOff =>"" - ,peerChan =>" ... single [set|unset] actor" - ,statusRequest =>""}, + ,peerChan =>" ... single [set|unset] actor"}, winMatic =>{ matic =>"" ,keydef =>" " ,create =>"" @@ -1109,6 +1110,7 @@ $culHmSubTypeSets{sensor} = $culHmSubTypeSets{outputUnit}; $culHmSubTypeSets{KFM100} = $culHmSubTypeSets{outputUnit}; $culHmSubTypeSets{blindActuatorSol}= $culHmSubTypeSets{outputUnit}; $culHmSubTypeSets{tipTronic} = $culHmSubTypeSets{outputUnit}; +$culHmSubTypeSets{powerMeter} = $culHmSubTypeSets{outputUnit}; $culHmSubTypeSets{motionDetector} = $culHmSubTypeSets{threeStateSensor}; @@ -1131,6 +1133,7 @@ my %culHmModelSets = (# channels of this subtype------------- ,inhibit =>"[on|off]"}, "HM-CC-TC" =>{ burstXmit =>""}, "HM-CC-RT-DN" =>{ burstXmit =>""}, + "HM-CC-RT-DN-BoM"=>{ statusRequest =>""}, ); # clones- - - - - - - - - - - - - - - - - $culHmModelSets{"HM-RC-19-B"} = $culHmModelSets{"HM-RC-19"};