2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-17 05:16:02 +00:00

fix for RC19, cfm and others

git-svn-id: https://svn.fhem.de/fhem/trunk@3118 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2013-04-25 19:15:59 +00:00
parent 5fa9696237
commit 4e80cb4525
3 changed files with 290 additions and 182 deletions

View File

@ -10,7 +10,7 @@ sub HMLAN_Parse($$);
sub HMLAN_Read($); sub HMLAN_Read($);
sub HMLAN_Write($$$); sub HMLAN_Write($$$);
sub HMLAN_ReadAnswer($$$); sub HMLAN_ReadAnswer($$$);
sub HMLAN_uptime($); sub HMLAN_uptime($$);
sub HMLAN_secSince2000(); sub HMLAN_secSince2000();
sub HMLAN_SimpleWrite(@); sub HMLAN_SimpleWrite(@);
@ -149,9 +149,8 @@ sub HMLAN_ReadAnswer($$$) {# This is a direct read for commands like get
DevIo_Disconnected($hash); DevIo_Disconnected($hash);
return("HMLAN_ReadAnswer $arg: $err", undef); return("HMLAN_ReadAnswer $arg: $err", undef);
} }
return ("Timeout reading answer for get $arg", undef) return ("Timeout reading answer for get $arg", undef) if($nfound == 0);
if($nfound == 0); $buf = DevIo_SimpleRead($hash);# and now read
$buf = DevIo_SimpleRead($hash);
return ("No data", undef) if(!defined($buf)); return ("No data", undef) if(!defined($buf));
if($buf) { if($buf) {
@ -162,7 +161,7 @@ sub HMLAN_ReadAnswer($$$) {# This is a direct read for commands like get
if($regexp && $mdata !~ m/$regexp/) { if($regexp && $mdata !~ m/$regexp/) {
HMLAN_Parse($hash, $mdata); HMLAN_Parse($hash, $mdata);
} else { } else {
return (undef, $mdata) return (undef, $mdata);
} }
} }
} }
@ -231,11 +230,42 @@ sub HMLAN_Read($) {############################################################
} }
$hash->{PARTIAL} = $hmdata; $hash->{PARTIAL} = $hmdata;
} }
sub HMLAN_uptime($) {########################################################## sub HMLAN_uptime($$) {#########################################################
my $msec = shift; my ($hash,$msec) = @_;
$msec = hex($msec); $msec = hex($msec);
my $sec = int($msec/1000); my $sec = int($msec/1000);
# my ($sysec, $syusec) = gettimeofday();
# if (!$hash->{helper}{refTime}){ #init referenceTime
# $hash->{helper}{refTime} = $syusec/1000;
# $hash->{helper}{refTimeS} = $sysec*1000+$syusec/1000;
# $hash->{helper}{refTStmp} = $msec;
# }
# else{
# my $dly = ($sysec*1000+$syusec/1000 - $hash->{helper}{refTimeS} ) -
# ($msec - $hash->{helper}{refTStmp});
# $hash->{helper}{msgdly} = $dly;
# $hash->{helper}{msgdlymin} = $dly
# if (!$hash->{helper}{msgdlymin} || $hash->{helper}{msgdlymin} > $dly);
# $hash->{helper}{msgdlymax} = $dly
# if (!$hash->{helper}{msgdlymax} || $hash->{helper}{msgdlymax} < $dly);
# readingsSingleUpdate($hash,"msgDly","last:".$hash->{helper}{msgdly}
# ." min:".$hash->{helper}{msgdlymin}
# ." max:".$hash->{helper}{msgdlymax},0);
# Log 1,"General msgDly: ".$hash->{helper}{msgdly}
# ." min:".$hash->{helper}{msgdlymin}
# ." max:".$hash->{helper}{msgdlymax}
# ." syss:".$sysec
# ." sysus:".$syusec/1000
# ." sysref:".$hash->{helper}{refTime}
# ." sysrefS:".$hash->{helper}{refTimeS}
# ." sysrefC:".($sysec*1000+$syusec/1000)
# ." sysrefSd:".($sysec*1000+$syusec/1000 - $hash->{helper}{refTimeS})
# ." lan:".$msec
# ." land:".($msec- $hash->{helper}{refTStmp})
# ;
# }
return sprintf("%03d %02d:%02d:%02d.%03d", return sprintf("%03d %02d:%02d:%02d.%03d",
int($msec/86400000), int($sec/3600), int($msec/86400000), int($sec/3600),
int(($sec%3600)/60), $sec%60, $msec % 1000); int(($sec%3600)/60), $sec%60, $msec % 1000);
@ -301,7 +331,7 @@ sub HMLAN_Parse($$) {##########################################################
# HMLAN sends ACK for flag 'A0' but not for 'A4'(config mode)- # HMLAN sends ACK for flag 'A0' but not for 'A4'(config mode)-
# we ack ourself an long as logic is uncertain - also possible is 'A6' for RHS # we ack ourself an long as logic is uncertain - also possible is 'A6' for RHS
if (hex($flg)&0x4){#General 4 oder 2 ? if (hex($flg)&0x4){#not sure: 4 oder 2 ?
$hash->{helper}{nextSend}{$src} = gettimeofday() + 0.100; $hash->{helper}{nextSend}{$src} = gettimeofday() + 0.100;
} }
if (hex($flg)&0xA4 == 0xA4 && $hash->{owner} eq $dst){ if (hex($flg)&0xA4 == 0xA4 && $hash->{owner} eq $dst){
@ -309,11 +339,11 @@ sub HMLAN_Parse($$) {##########################################################
HMLAN_Write($hash,undef, "As15".$mNo."8002".$dst.$src."00"); HMLAN_Write($hash,undef, "As15".$mNo."8002".$dst.$src."00");
} }
#update some User information ------ #update some User information ------
$hash->{uptime} = HMLAN_uptime($mFld[2]); $hash->{uptime} = HMLAN_uptime($hash,$mFld[2]);
$hash->{RSSI} = $rssi; $hash->{RSSI} = $rssi;
$hash->{RAWMSG} = $rmsg; $hash->{RAWMSG} = $rmsg;
$hash->{"${name}_MSGCNT"}++; $hash->{"${name}_MSGCNT"}++;
$hash->{"${name}_TIME"} = TimeNow(); $hash->{"${name}_TIME"} = TimeNow();
if (($hash->{helper}{$src}{flg}) && ($letter eq 'R')){ #HMLAN is done? if (($hash->{helper}{$src}{flg}) && ($letter eq 'R')){ #HMLAN is done?
$hash->{helper}{$src}{flg} = 0; #release send-holdoff $hash->{helper}{$src}{flg} = 0; #release send-holdoff
@ -333,13 +363,13 @@ sub HMLAN_Parse($$) {##########################################################
$hash->{serialNr} = $mFld[2]; $hash->{serialNr} = $mFld[2];
$hash->{firmware} = sprintf("%d.%d", (hex($mFld[1])>>12)&0xf, hex($mFld[1]) & 0xffff); $hash->{firmware} = sprintf("%d.%d", (hex($mFld[1])>>12)&0xf, hex($mFld[1]) & 0xffff);
$hash->{owner} = $mFld[4]; $hash->{owner} = $mFld[4];
$hash->{uptime} = HMLAN_uptime($mFld[5]); $hash->{uptime} = HMLAN_uptime($hash,$mFld[5]);
$hash->{assignIDsReport}=$mFld[6]; $hash->{assignIDsReport}=$mFld[6];
$hash->{helper}{keepAliveRec} = 1; $hash->{helper}{keepAliveRec} = 1;
$hash->{helper}{keepAliveRpt} = 0; $hash->{helper}{keepAliveRpt} = 0;
Log $ll5, 'HMLAN_Parse: '.$name. ' V:'.$mFld[1] Log $ll5, 'HMLAN_Parse: '.$name. ' V:'.$mFld[1]
.' sNo:'.$mFld[2].' d:'.$mFld[3] .' sNo:'.$mFld[2].' d:'.$mFld[3]
.' O:' .$mFld[4].' m:'.$mFld[5].' IDcnt:'.$mFld[6]; .' O:' .$mFld[4].' t:'.$mFld[5].' IDcnt:'.$mFld[6];
my $myId = AttrVal($name, "hmId", $mFld[4]); my $myId = AttrVal($name, "hmId", $mFld[4]);
if(lc($mFld[4]) ne lc($myId) && !AttrVal($name, "dummy", 0)) { if(lc($mFld[4]) ne lc($myId) && !AttrVal($name, "dummy", 0)) {
Log 1, 'HMLAN setting owner to '.$myId.' from '.$mFld[4]; Log 1, 'HMLAN setting owner to '.$myId.' from '.$mFld[4];
@ -429,6 +459,8 @@ sub HMLAN_DoInit($) {##########################################################
HMLAN_SimpleWrite($hash, "Y03,00,"); HMLAN_SimpleWrite($hash, "Y03,00,");
HMLAN_SimpleWrite($hash, "Y03,00,"); HMLAN_SimpleWrite($hash, "Y03,00,");
HMLAN_SimpleWrite($hash, "T$s2000,04,00,00000000"); HMLAN_SimpleWrite($hash, "T$s2000,04,00,00000000");
$hash->{helper}{refTime}=0;
foreach (keys %lhash){delete ($lhash{$_})};# clear IDs - HMLAN might have a reset foreach (keys %lhash){delete ($lhash{$_})};# clear IDs - HMLAN might have a reset
$hash->{helper}{keepAliveRec} = 1; # ok for first time $hash->{helper}{keepAliveRec} = 1; # ok for first time
@ -449,7 +481,7 @@ sub HMLAN_KeepAlive($) {#######################################################
RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer
my $rt = AttrVal($name,"respTime",1); my $rt = AttrVal($name,"respTime",1);
InternalTimer(gettimeofday()+$rt,"HMLAN_KeepAliveCheck","keepAliveCk:".$name,1); InternalTimer(gettimeofday()+$rt,"HMLAN_KeepAliveCheck","keepAliveCk:".$name,1);
InternalTimer(gettimeofday()+25, "HMLAN_KeepAlive", "keepAlive:".$name, 1); InternalTimer(gettimeofday()+25 ,"HMLAN_KeepAlive", "keepAlive:".$name, 1);
} }
sub HMLAN_KeepAliveCheck($) {################################################## sub HMLAN_KeepAliveCheck($) {##################################################
my($in ) = shift; my($in ) = shift;

View File

@ -124,7 +124,7 @@ sub CUL_HM_autoReadConfig($){
while(@{$modules{CUL_HM}{helper}{updtCfgLst}}){ while(@{$modules{CUL_HM}{helper}{updtCfgLst}}){
my $name = shift(@{$modules{CUL_HM}{helper}{updtCfgLst}}); my $name = shift(@{$modules{CUL_HM}{helper}{updtCfgLst}});
my $hash = CUL_HM_name2Hash($name); my $hash = CUL_HM_name2Hash($name);
if (0 != CUL_HM_getARead($name)){ if (0 != CUL_HM_getAttrInt($name,"autoReadReg")){
CUL_HM_Set($hash,$name,"getSerial"); CUL_HM_Set($hash,$name,"getSerial");
CUL_HM_Set($hash,$name,"getConfig"); CUL_HM_Set($hash,$name,"getConfig");
CUL_HM_Set($hash,$name,"statusRequest"); CUL_HM_Set($hash,$name,"statusRequest");
@ -144,7 +144,8 @@ sub CUL_HM_updateConfig($){
my $name = shift(@nameList); my $name = shift(@nameList);
my $hash = CUL_HM_name2Hash($name); my $hash = CUL_HM_name2Hash($name);
my $id = CUL_HM_hash2Id($hash); my $id = CUL_HM_hash2Id($hash);
my $chn = substr($id."00",6,2);
if ($id ne $K_actDetID){# if not action detector if ($id ne $K_actDetID){# if not action detector
CUL_HM_ID2PeerList($name,"",1); # update peerList out of peerIDs CUL_HM_ID2PeerList($name,"",1); # update peerList out of peerIDs
my $actCycle = AttrVal($name,"actCycle",undef); my $actCycle = AttrVal($name,"actCycle",undef);
@ -211,7 +212,7 @@ sub CUL_HM_updateConfig($){
$hash->{helper}{role}{vrt} = 1; $hash->{helper}{role}{vrt} = 1;
} }
# add default web-commands # -+-+-+-+-+ add default web-commands
my $webCmd; my $webCmd;
$webCmd = AttrVal($name,"webCmd",undef); $webCmd = AttrVal($name,"webCmd",undef);
if(!defined $webCmd){ if(!defined $webCmd){
@ -224,6 +225,8 @@ sub CUL_HM_updateConfig($){
}elsif($st eq "switch" ){$webCmd="toggle:on:off:statusRequest"; }elsif($st eq "switch" ){$webCmd="toggle:on:off:statusRequest";
}elsif($st eq "smokeDetector"){$webCmd="test:alarmOn:alarmOff"; }elsif($st eq "smokeDetector"){$webCmd="test:alarmOn:alarmOff";
}elsif($st eq "keyMatic" ){$webCmd="lock:inhibit on:inhibit off"; }elsif($st eq "keyMatic" ){$webCmd="lock:inhibit on:inhibit off";
}elsif($md eq "HM-OU-CFM-PL" ){$webCmd="press short:press long"
.($chn eq "02"?":playTone replay":"");
} }
if ($webCmd){ if ($webCmd){
my $eventMap = AttrVal($name,"eventMap",undef); my $eventMap = AttrVal($name,"eventMap",undef);
@ -234,7 +237,7 @@ sub CUL_HM_updateConfig($){
} }
} }
$attr{$name}{webCmd} = $webCmd if ($webCmd); $attr{$name}{webCmd} = $webCmd if ($webCmd);
push @getConfList,$name if (0 != CUL_HM_getARead($name)); push @getConfList,$name if (0 != CUL_HM_getAttrInt($name,"autoReadReg"));
} }
$modules{CUL_HM}{helper}{updtCfgLst} = \@getConfList; $modules{CUL_HM}{helper}{updtCfgLst} = \@getConfList;
CUL_HM_autoReadConfig("updateConfig"); CUL_HM_autoReadConfig("updateConfig");
@ -333,7 +336,7 @@ sub CUL_HM_Attr(@) {#################################
} }
push(@hashL,$eHash); push(@hashL,$eHash);
foreach my $hash (@hashL){ foreach my $hash (@hashL){
my $exLvl = CUL_HM_getExpertMode($hash); my $exLvl = CUL_HM_getAttrInt($hash->{NAME},"expert");
if ($exLvl eq "0"){# off if ($exLvl eq "0"){# off
foreach my $rdEntry (keys %{$hash->{READINGS}}){ foreach my $rdEntry (keys %{$hash->{READINGS}}){
my $rdEntryNew; my $rdEntryNew;
@ -1430,7 +1433,7 @@ sub CUL_HM_parseCommon(@){#####################################################
} }
} }
my $peer = $shash->{helper}{respWait}{forPeer}; my $peer = $shash->{helper}{respWait}{forPeer};
my $regLN = ((CUL_HM_getExpertMode($chnHash) eq "2")?"":".")."RegL_".$list.":".$peer; my $regLN = ((CUL_HM_getAttrInt($chnName,"expert") == 2)?"":".")."RegL_".$list.":".$peer;
readingsSingleUpdate($chnHash,$regLN, readingsSingleUpdate($chnHash,$regLN,
ReadingsVal($chnName,$regLN,"")." ".$data,0); ReadingsVal($chnName,$regLN,"")." ".$data,0);
if ($data =~m/00:00$/){ # this was the last message in the block if ($data =~m/00:00$/){ # this was the last message in the block
@ -1456,7 +1459,7 @@ sub CUL_HM_parseCommon(@){#####################################################
my($chn,$peerID,$list,$data) = ($1,$2,$3,$4) if($p =~ m/^04(..)(........)(..)(.*)/); my($chn,$peerID,$list,$data) = ($1,$2,$3,$4) if($p =~ m/^04(..)(........)(..)(.*)/);
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn}; my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
$chnHash = $shash if(!$chnHash); # will add param to dev if no chan $chnHash = $shash if(!$chnHash); # will add param to dev if no chan
my $regLN = ((CUL_HM_getExpertMode($chnHash) eq "2")?"":".")."RegL_".$list.":".CUL_HM_id2Name($peerID); my $regLN = ((CUL_HM_getAttrInt($chnHash->{NAME},"expert") == 2)?"":".")."RegL_".$list.":".CUL_HM_id2Name($peerID);
$regLN =~ s/broadcast//; $regLN =~ s/broadcast//;
$regLN =~ s/ /_/g; #remove blanks $regLN =~ s/ /_/g; #remove blanks
@ -1496,7 +1499,7 @@ sub CUL_HM_parseCommon(@){#####################################################
my ($chn) = ($1) if($p =~ m/^..(..)/); my ($chn) = ($1) if($p =~ m/^..(..)/);
if ($chn eq "00"){ if ($chn eq "00"){
CUL_HM_queueAutoRead(CUL_HM_hash2Name($shash)) CUL_HM_queueAutoRead(CUL_HM_hash2Name($shash))
if (1 < CUL_HM_getARead($shash->{NAME})); if (1 < CUL_HM_getAttrInt($shash->{NAME},"autoReadReg"));
return "powerOn" ;# check dst eq "000000" as well? return "powerOn" ;# check dst eq "000000" as well?
} }
} }
@ -2070,7 +2073,7 @@ sub CUL_HM_Set($@) {
elsif($cmd eq "inhibit") { ################################################## elsif($cmd eq "inhibit") { ##################################################
return "$a[2] is not on or off" if($a[2] !~ m/^(on|off)$/); return "$a[2] is not on or off" if($a[2] !~ m/^(on|off)$/);
my $val = ($a[2] eq "on") ? "01" : "00"; my $val = ($a[2] eq "on") ? "01" : "00";
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.$val.'01'); # SET_LOCK CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.$val.$chn); # SET_LOCK
} }
elsif($cmd =~ m/^(up|down|pct)$/) { ######################################### elsif($cmd =~ m/^(up|down|pct)$/) { #########################################
my ($lvl,$tval,$rval) = ($a[2],"",""); my ($lvl,$tval,$rval) = ($a[2],"","");
@ -2095,12 +2098,15 @@ sub CUL_HM_Set($@) {
elsif($cmd eq "text") { ################################################# reg elsif($cmd eq "text") { ################################################# reg
$state = ""; $state = "";
my ($bn,$l1, $l2, $s) = ($chn,$a[2],$a[3],54); # Create CONFIG_WRITE_INDEX string my ($bn,$l1, $l2, $s) = ($chn,$a[2],$a[3],54); # Create CONFIG_WRITE_INDEX string
if (!$roleC){# if used on device. Should be removed :todo 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)$/); return "$a[3] is not on or off" if($a[3] !~ m/^(on|off)$/);
$bn = $a[2]*2-($a[3] eq "on" ? 0 : 1); $bn = $a[2]*2-($a[3] eq "on" ? 0 : 1);
($l1, $l2) = ($a[4],$a[5]); ($l1, $l2) = ($a[4],$a[5]);
} }
else{
return "to many parameter. Try set $a[0] text $a[2] $a[3]" if($a[4]);
}
$l1 = substr($l1."\x00", 0, 13); $l1 = substr($l1."\x00", 0, 13);
$s = 54; $s = 54;
@ -2259,18 +2265,26 @@ sub CUL_HM_Set($@) {
} }
} }
elsif($cmd eq "playTone") { ################################################# elsif($cmd eq "playTone") { #################################################
my @itemList = split(',',$a[2]); my $msg;
my $repeat = (defined $a[3] && $a[3] =~ m/^(\d+)$/)?$a[3]:1; if ($a[2] eq 'replay'){
my $itemCnt = int(@itemList); $msg = ReadingsVal($chnHash->{NAME},".lastTone","");
return "no more then 12 entries please" if ($itemCnt>12);
return "repetition $repeat out of range [1..255]"
if($repeat < 1 || $repeat > 255);
#<entries><multiply><MP3><MP3>
my $msgBytes = sprintf("%02X%02X",$itemCnt,$repeat);
foreach my $mp3 (@itemList){
$msgBytes .= sprintf("%02X",$mp3);
} }
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.$msgBytes); else{
my @itemList = split(',',$a[2]);
my $repeat = (defined $a[3] && $a[3] =~ m/^(\d+)$/)?$a[3]:1;
my $itemCnt = int(@itemList);
return "no more then 12 entries please" if ($itemCnt>12);
return "repetition $repeat out of range [1..255]"
if($repeat < 1 || $repeat > 255);
#<entries><multiply><MP3><MP3>
my $msgBytes = sprintf("%02X%02X",$itemCnt,$repeat);
foreach my $mp3 (@itemList){
$msgBytes .= sprintf("%02X",$mp3);
}
$msg = '++'.$flag.'11'.$id.$dst.'80'.$chn.$msgBytes;
CUL_HM_UpdtReadSingle($chnHash,".lastTone",$msg,0);
}
CUL_HM_PushCmdStack($hash,$msg) if ($msg);
} }
elsif($cmd eq "ilum") { ################################################# reg elsif($cmd eq "ilum") { ################################################# reg
return "$a[2] not specified. choose 0-15 for brightness" if ($a[2]>15); return "$a[2] not specified. choose 0-15 for brightness" if ($a[2]>15);
@ -2630,34 +2644,39 @@ sub CUL_HM_getConfig($$$$$){
my ($hash,$chnhash,$id,$dst,$chn) = @_; my ($hash,$chnhash,$id,$dst,$chn) = @_;
my $flag = CUL_HM_getFlag($hash); my $flag = CUL_HM_getFlag($hash);
foreach my $readEntry (keys %{$chnhash->{READINGS}}){ foreach my $readEntry (keys %{$chnhash->{READINGS}}){
delete $chnhash->{READINGS}{$readEntry} if ($readEntry =~ m/^[\.]?RegL_/); delete $chnhash->{READINGS}{$readEntry} if ($readEntry =~ m/^[\.]?(RegL_|R-)/);
} }
#get Peer-list in any case - it is part of config
CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s%s03",$flag,$id,$dst,$chn));
my $lstAr = $culHmModel{CUL_HM_getMId($hash)}{lst}; my $lstAr = $culHmModel{CUL_HM_getMId($hash)}{lst};
if($lstAr){ if($lstAr){
my @list = split(",",$lstAr); #get valid lists e.g."1, 5:2:3.p ,6:2" my @list = split(",",$lstAr); #get valid lists e.g."1, 5:2.3p ,6:2"
my $pReq = 0; # Peer request not issued, do only once for channel
foreach my$listEntry (@list){# each list that is define for this channel foreach my$listEntry (@list){# each list that is define for this channel
my ($peerReq,$chnValid)= (0,0); my ($peerReq,$chnValid)= (0,0);
my ($listNo,$chnLst1) = split(":",$listEntry); my ($listNo,$chnLst1) = split(":",$listEntry);
if (!$chnLst1){ if (!$chnLst1){
$chnValid = 1; #if no entry channel is valid $chnValid = 1; #if no entry go for all channels
$peerReq = 1 if($listNo==3 ||$listNo==4); #default $peerReq = 1 if($listNo eq 'p' || $listNo==3 ||$listNo==4); #default
} }
else{ else{
my @chnLst = split('\.',$chnLst1); my @chnLst = split('\.',$chnLst1);
foreach my $lchn (@chnLst){ foreach my $lchn (@chnLst){
$peerReq = 1 if ($lchn =~ m/p/); $peerReq = 1 if ($lchn =~ m/p/);
no warnings;#know that lchan may be followed by a 'p' causing a warning no warnings;#know that lchan may be followed by a 'p' causing a warning
$chnValid = 1 if (int($lchn) == hex($chn)); $chnValid = 1 if (int($lchn) == hex($chn));
use warnings; use warnings;
last if ($chnValid); last if ($chnValid);
} }
} }
if ($chnValid){# yes, we will go for a list if ($chnValid){# yes, we will go for a list
if ($peerReq){# need to get the peers first if ($peerReq){# need to get the peers first
$chnhash->{helper}{getCfgList} = "all"; # peers first if($listNo ne 'p'){# not if 'only peers'!
$chnhash->{helper}{getCfgListNo} = $listNo; $chnhash->{helper}{getCfgList} = "all";
$chnhash->{helper}{getCfgListNo} = $listNo;
}
if (!$pReq){#get peers first, but only once per channel
CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s%s03",$flag,$id,$dst,$chn));
$pReq = 1;
}
} }
else{ else{
CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s%s0400000000%02X",$flag,$id,$dst,$chn,$listNo)); CUL_HM_PushCmdStack($hash,sprintf("++%s01%s%s%s0400000000%02X",$flag,$id,$dst,$chn,$listNo));
@ -2665,7 +2684,7 @@ sub CUL_HM_getConfig($$$$$){
} }
} }
} }
} }
#+++++++++++++++++ Protocol stack, sending, repeat+++++++++++++++++++++++++++++ #+++++++++++++++++ Protocol stack, sending, repeat+++++++++++++++++++++++++++++
sub CUL_HM_SndCmd($$) { sub CUL_HM_SndCmd($$) {
@ -2737,7 +2756,7 @@ sub CUL_HM_responseSetup($$) {#store all we need to handle the response
$peer ="" if($list !~ m/^0[34]$/); $peer ="" if($list !~ m/^0[34]$/);
#empty val since reading will be cumulative #empty val since reading will be cumulative
my $rlName = ((CUL_HM_getExpertMode($hash) eq "2")?"":".")."RegL_".$list.":".$peer; my $rlName = ((CUL_HM_getAttrInt($hash->{NAME},"expert") == 2)?"":".")."RegL_".$list.":".$peer;
$chnhash->{READINGS}{$rlName}{VAL}=""; $chnhash->{READINGS}{$rlName}{VAL}="";
delete ($chnhash->{READINGS}{$rlName}{TIME}); delete ($chnhash->{READINGS}{$rlName}{TIME});
return; return;
@ -2898,7 +2917,7 @@ sub CUL_HM_pushConfig($$$$$$$$) {#generate messages to cnfig data to register
my $peerN = ($peerAddr ne "000000")?CUL_HM_id2Name($peerAddr.$peerChn):""; my $peerN = ($peerAddr ne "000000")?CUL_HM_id2Name($peerAddr.$peerChn):"";
$peerN =~ s/broadcast//; $peerN =~ s/broadcast//;
$peerN =~ s/ /_/g;#remote blanks $peerN =~ s/ /_/g;#remote blanks
my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":"."). my $regLN = ((CUL_HM_getAttrInt($hash->{NAME},"expert") == 2)?"":".").
"RegL_".$list.":".$peerN; "RegL_".$list.":".$peerN;
#--- copy data from readings to shadow #--- copy data from readings to shadow
my $chnhash = $modules{CUL_HM}{defptr}{$dst.$chn}; my $chnhash = $modules{CUL_HM}{defptr}{$dst.$chn};
@ -2928,7 +2947,7 @@ sub CUL_HM_pushConfig($$$$$$$$) {#generate messages to cnfig data to register
} }
CUL_HM_PushCmdStack($hash,"++A001".$src.$dst.$chn."06"); CUL_HM_PushCmdStack($hash,"++A001".$src.$dst.$chn."06");
CUL_HM_queueAutoRead(CUL_HM_hash2Name($hash)) CUL_HM_queueAutoRead(CUL_HM_hash2Name($hash))
if (2 < CUL_HM_getARead($hash->{NAME})); if (2 < CUL_HM_getAttrInt($hash->{NAME},"autoReadReg"));
} }
sub CUL_HM_Resend($) {#resend a message if there is no answer sub CUL_HM_Resend($) {#resend a message if there is no answer
my $hash = shift; my $hash = shift;
@ -3058,15 +3077,6 @@ sub CUL_HM_getAssChnIds($) { #in: name out:ID list of assotiated channels
push @chnIdList,$dId if (length($dId) == 8); push @chnIdList,$dId if (length($dId) == 8);
return sort(@chnIdList); return sort(@chnIdList);
} }
sub CUL_HM_getExpertMode($) { # get expert level for the entity.
# if expert level is not set try to get it for device
my ($hash) = @_;
my $expLvl = AttrVal($hash->{NAME},"expert","");
my $dHash = CUL_HM_getDeviceHash($hash);
$expLvl = AttrVal($dHash->{NAME},"expert","0")
if ($expLvl eq "");
return substr($expLvl,0,1);
}
#+++++++++++++++++ Conversions names, hashes, ids++++++++++++++++++++++++++++++ #+++++++++++++++++ Conversions names, hashes, ids++++++++++++++++++++++++++++++
sub CUL_HM_Id($) {#in: ioHash out: ioHMid sub CUL_HM_Id($) {#in: ioHash out: ioHMid
@ -3134,6 +3144,12 @@ sub CUL_HM_getDeviceHash($) {#in: hash out: devicehash
my $devHash = $modules{CUL_HM}{defptr}{substr($hash->{DEF},0,6)}; my $devHash = $modules{CUL_HM}{defptr}{substr($hash->{DEF},0,6)};
return ($devHash)?$devHash:$hash; return ($devHash)?$devHash:$hash;
} }
sub CUL_HM_getDeviceName($) {#in: name out: name of device
my $name = shift;
return $name if(!$defs{$name});#unknown, return input
my $devHash = $modules{CUL_HM}{defptr}{substr($defs{$name}{DEF},0,6)};
return ($devHash)?$devHash->{NAME}:$name;
}
#+++++++++++++++++ debug ++++++++++++++++++++++++++++++++++++++++++++++++++++++ #+++++++++++++++++ debug ++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub CUL_HM_DumpProtocol($$@) { sub CUL_HM_DumpProtocol($$@) {
@ -3207,7 +3223,7 @@ sub CUL_HM_getRegFromStore($$$$) {#read a register from backup data
} }
$peerId = CUL_HM_peerChId(($peerId?$peerId:"00000000"),$dId,$iId); $peerId = CUL_HM_peerChId(($peerId?$peerId:"00000000"),$dId,$iId);
my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":"."). my $regLN = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":".").
"RegL_".sprintf("%02X",$list).":".CUL_HM_peerChName($peerId,$dId,$iId); "RegL_".sprintf("%02X",$list).":".CUL_HM_peerChName($peerId,$dId,$iId);
$regLN =~ s/broadcast//; $regLN =~ s/broadcast//;
@ -3265,7 +3281,7 @@ sub CUL_HM_updtRegDisp($$$) {
push @regArr, keys %{$culHmRegModel{$md}} if($culHmRegModel{$md}); push @regArr, keys %{$culHmRegModel{$md}} if($culHmRegModel{$md});
push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn}); push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn});
my @changedRead; my @changedRead;
my $expLvl = (CUL_HM_getExpertMode($hash) ne "0")?1:0; my $expLvl = (CUL_HM_getAttrInt($name,"expert") == 0)?1:0;
foreach my $regName (@regArr){ foreach my $regName (@regArr){
next if ($culHmRegDefine{$regName}->{l} ne $listNo); next if ($culHmRegDefine{$regName}->{l} ne $listNo);
my $rgVal = CUL_HM_getRegFromStore($name,$regName,$list,$peerId); my $rgVal = CUL_HM_getRegFromStore($name,$regName,$list,$peerId);
@ -3278,11 +3294,18 @@ sub CUL_HM_updtRegDisp($$$) {
CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead); CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead);
# --- handle specifics - Devices with abnormal or long register # --- handle specifics - Devices with abnormal or long register
CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) && my $md = CUL_HM_Get($hash,$name,"param","model");
substr($hash->{DEF},6,2) eq "02" && my $st = CUL_HM_Get($hash,$name,"param","subType");
CUL_HM_Get($hash,$name,"param","model") eq "HM-CC-TC"); if ($md eq "HM-CC-TC"){#handle temperature readings
CUL_HM_repReadings($hash) if (($list == 2) && CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) &&
CUL_HM_Get($hash,$name,"param","subType") eq "repeater"); substr($hash->{DEF},6,2) eq "02");
}
if ($md eq "HM-PB-4DIS-WM"){#add text
CUL_HM_4DisText($hash) if ($list == 1) ;
}
elsif ($st eq "repeater"){
CUL_HM_repReadings($hash) if ($list == 2);
}
# CUL_HM_dimLog($hash) if(CUL_HM_Get($hash,$name,"param","subType") eq "dimmer"); # CUL_HM_dimLog($hash) if(CUL_HM_Get($hash,$name,"param","subType") eq "dimmer");
} }
############################# #############################
@ -3417,10 +3440,34 @@ sub CUL_HM_CvTflt($) { # config time -> float
return ($inValue & 0x1f)*((sort {$a <=> $b} keys(%fltCvT))[$inValue >> 5]); return ($inValue & 0x1f)*((sort {$a <=> $b} keys(%fltCvT))[$inValue >> 5]);
} }
sub CUL_HM_4DisText($) {# convert text for 4dis
#text1: start at 54 (0x36) length 12 (0x0c)
#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."05:" ,"");
my %txt;
foreach my $sAddr (54,70){
my $txtHex = $reg1; #one row
my $sStr = sprintf("%02X:",$sAddr);
$txtHex =~ s/.* $sStr//; #remove reg prior to string
$sStr = sprintf("%02X:",$sAddr+11);
$txtHex =~ s/$sStr(..).*/,$1/; #remove reg after string
$txtHex =~ s/ ..:/,/g; #remove addr
$txtHex =~ s/,00.*//; #remove trailing string
my @ch = split(",",$txtHex,12);
foreach (@ch){$txt{$sAddr}.=chr(hex($_))};
}
CUL_HM_UpdtReadBulk($hash,1,"text1:".$txt{54},
"text2:".$txt{70});
return "text1:".$txt{54}."\n".
"text2:".$txt{70}."\n";
}
sub CUL_HM_TCtempReadings($) {# parse TC readings sub CUL_HM_TCtempReadings($) {# parse TC readings
my ($hash)=@_; my ($hash)=@_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $regLN = ((CUL_HM_getExpertMode($hash) eq "2")?"":".")."RegL_"; my $regLN = ((CUL_HM_getAttrInt($name,"expert") == 2)?"":".")."RegL_";
my $reg5 = ReadingsVal($name,$regLN."05:" ,""); my $reg5 = ReadingsVal($name,$regLN."05:" ,"");
my $reg6 = ReadingsVal($name,$regLN."06:" ,""); my $reg6 = ReadingsVal($name,$regLN."06:" ,"");
my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"); my @days = ("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri");
@ -3562,10 +3609,10 @@ sub CUL_HM_ActGetCreateHash() {# get ActionDetector - create if necessary
sub CUL_HM_time2sec($) { sub CUL_HM_time2sec($) {
my ($timeout) = @_; my ($timeout) = @_;
my ($h,$m) = split(":",$timeout); my ($h,$m) = split(":",$timeout);
no warnings; no warnings 'numeric';
$h = int($h); $h = int($h);
$m = int($m); $m = int($m);
use warnings; use warnings 'numeric';
return ((sprintf("%03s:%02d",$h,$m)),((int($h)*60+int($m))*60)); return ((sprintf("%03s:%02d",$h,$m)),((int($h)*60+int($m))*60));
} }
sub CUL_HM_ActAdd($$) {# add an HMid to list for activity supervision sub CUL_HM_ActAdd($$) {# add an HMid to list for activity supervision
@ -3775,7 +3822,7 @@ sub CUL_HM_qStateUpdatIfEnab($){#in:name or id, queue stat-request after 12 sec
$name = CUL_HM_id2Name($name) if ($name =~ m/^[A-F0-9]{6,8}$/i); $name = CUL_HM_id2Name($name) if ($name =~ m/^[A-F0-9]{6,8}$/i);
$name =~ s /_chn:..$//; $name =~ s /_chn:..$//;
return if (!$defs{$name}); #device unknown, ignore return if (!$defs{$name}); #device unknown, ignore
if (CUL_HM_getARead($name) > 3){ if (CUL_HM_getAttrInt($name,"autoReadReg") > 3){
@{$modules{CUL_HM}{helper}{reqStatus}}= @{$modules{CUL_HM}{helper}{reqStatus}}=
CUL_HM_noDup(@{$modules{CUL_HM}{helper}{reqStatus}},$name); CUL_HM_noDup(@{$modules{CUL_HM}{helper}{reqStatus}},$name);
RemoveInternalTimer("CUL_HM_reqStatus"); RemoveInternalTimer("CUL_HM_reqStatus");
@ -3792,10 +3839,14 @@ sub CUL_HM_qStateUpdat($){#in:name or id, queue send stat-request after 12 sec
RemoveInternalTimer("CUL_HM_reqStatus"); RemoveInternalTimer("CUL_HM_reqStatus");
InternalTimer(gettimeofday()+120,"CUL_HM_reqStatus","CUL_HM_reqStatus", 0); InternalTimer(gettimeofday()+120,"CUL_HM_reqStatus","CUL_HM_reqStatus", 0);
} }
sub CUL_HM_getARead($){#return valid autoRegRead as integer sub CUL_HM_getAttrInt($$){#return attrValue as integer
my $name = shift; my ($name,$attrName) = @_;
my $aRd = CUL_HM_Get($defs{$name},$name,"param","autoReadReg"); my $val = AttrVal($name,$attrName,"");
return ($aRd eq "undefined")?0:int($aRd); no warnings 'numeric';
$val = int(AttrVal(CUL_HM_getDeviceName($name),$attrName,0))+0
if ($val eq "");
use warnings 'numeric';
return substr($val,0,1);
} }
#+++++++++++++++++ external use +++++++++++++++++++++++++++++++++++++++++++++++ #+++++++++++++++++ external use +++++++++++++++++++++++++++++++++++++++++++++++
@ -3973,43 +4024,54 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
data!. It controlls actions taken upon receive of a trigger from the data!. It controlls actions taken upon receive of a trigger from the
peer.<br> peer.<br>
List4: settings for channel (button) of a remote<br><br> List4: settings for channel (button) of a remote<br><br>
&lt;PeerChannel&gt; paired HMid+ch, i.e. 4 byte (8 digit) value like &lt;PeerChannel&gt; paired HMid+ch, i.e. 4 byte (8 digit) value like
'12345601'. It is mendatory for List 3 and 4 and can be left out for '12345601'. It is mendatory for List 3 and 4 and can be left out for
List 0 and 1. <br> List 0 and 1. <br>
'all' can be used to get data of each paired link of the channel. <br> 'all' can be used to get data of each paired link of the channel. <br>
'selfxx' can be used to address data for internal channels (associated 'selfxx' can be used to address data for internal channels (associated
with the build-in switches if any). xx is the number of the channel in with the build-in switches if any). xx is the number of the channel in
decimal.<br> decimal.<br>
Note1: execution depends on the entity. If List1 is requested on a Note1: execution depends on the entity. If List1 is requested on a
device rather then a channel the command will retrieve List1 for all device rather then a channel the command will retrieve List1 for all
channels assotiated. List3 with peerChannel = all will get all link channels assotiated. List3 with peerChannel = all will get all link
for all channel if executed on a device.<br> for all channel if executed on a device.<br>
Note2: for 'sender' see <a href="#CUL_HMremote">remote</a> <br> Note2: for 'sender' see <a href="#CUL_HMremote">remote</a> <br>
Note3: the information retrieval may take a while - especially for Note3: the information retrieval may take a while - especially for
devices with a lot of channels and links. It may be necessary to devices with a lot of channels and links. It may be necessary to
refresh the web interface manually to view the results <br> refresh the web interface manually to view the results <br>
Note4: the direct buttons on a HM device are hidden by default. Note4: the direct buttons on a HM device are hidden by default.
Nevertheless those are implemented as links as well. To get access to Nevertheless those are implemented as links as well. To get access to
the 'internal links' it is necessary to issue 'set &lt;name&gt; regSet the 'internal links' it is necessary to issue 'set &lt;name&gt; regSet
intKeyVisib 1' or 'set &lt;name&gt; setRegRaw List0 2 81'. Reset it intKeyVisib 1' or 'set &lt;name&gt; setRegRaw List0 2 81'. Reset it
by replacing '81' with '01'<br> example:<br> by replacing '81' with '01'<br> example:<br>
<ul><code> <ul><code>
set mydimmer getRegRaw List1<br> set mydimmer getRegRaw List1<br>
set mydimmer getRegRaw List3 all <br> set mydimmer getRegRaw List3 all <br>
</code></ul> </code></ul>
</li> </li>
<li><B>getSerial</B><a name="CUL_HMgetSerial"></a><br> <li><B>getSerial</B><a name="CUL_HMgetSerial"></a><br>
Read serial number from device and write it to attribute serialNr. Read serial number from device and write it to attribute serialNr.
</li> </li>
<li><B>inhibit [on|off]</B><br>
Block / unblock all directly peered remotes and the hardware buttons of the
device. If inhibit set on, the channel status can be controlled only by
FHEM.<br><br>
Examples:
<ul><code>
# Block operation<br>
set keymatic inhibit on <br><br>
</ul></code>
</li>
<li><B>pair</B><a name="CUL_HMpair"></a><br> <li><B>pair</B><a name="CUL_HMpair"></a><br>
Pair the device with a known serialNumber (e.g. after a device reset) Pair the device with a known serialNumber (e.g. after a device reset)
to FHEM Central unit. FHEM Central is usualy represented by CUL/CUNO, to FHEM Central unit. FHEM Central is usualy represented by CUL/CUNO,
@ -4341,17 +4403,31 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
</li> </li>
<li>OutputUnit (HM-OU-CFM-PL) <li>OutputUnit (HM-OU-CFM-PL)
<ul> <ul>
<li><B>led &lt;color&gt;[,&lt;color&gt;..]</B><br> <li><B>led &lt;color&gt;[,&lt;color&gt;..] [&lt;repeat&gt..]</B><br>
Possible colors are [redL|greenL|yellowL|redS|greenS|yellowS]. A Possible colors are [redL|greenL|yellowL|redS|greenS|yellowS]. A
sequence of colors can be given separating the color entries by ','. sequence of colors can be given separating the color entries by ','.
White spaces must not be used in the list. 'S' indicates short and White spaces must not be used in the list. 'S' indicates short and
'L' long ilumination. <br> 'L' long ilumination. <br>
<b>repeat</b> defines how often the sequence shall be executed. Defaults to 1.<br> <b>repeat</b> defines how often the sequence shall be executed. Defaults to 1.<br>
</li> </li>
<li><B>playTone &lt;MP3No&gt[,&lt;MP3No&gt..] [,&lt;repeat&gt..]</B><br> <li><B>playTone &lt;MP3No&gt[,&lt;MP3No&gt..] [&lt;repeat&gt..]</B><br>
Play a series of tones. List is to be entered separated by ','. White Play a series of tones. List is to be entered separated by ','. White
spaces must not be used in the list.<br> spaces must not be used in the list.<br>
<b>replay</b> can be entered to repeat the last sound played once more.<br>
<b>repeat</b> defines how often the sequence shall be played. Defaults to 1.<br> <b>repeat</b> defines how often the sequence shall be played. Defaults to 1.<br>
Example:
<ul><code>
# "hello" in display, symb bulb on, backlight, beep<br>
set cfm_Mp3 playTone 3 # MP3 title 3 once<br>
set cfm_Mp3 playTone 3 3 # MP3 title 3 3 times<br>
set cfm_Mp3 playTone 3,6,8,3,4 # MP3 title list 3,6,8,3,4 once<br>
set cfm_Mp3 playTone 3,6,8,3,4 255# MP3 title list 3,6,8,3,4 255 times<br>
set cfm_Mp3 playTone replay # repeat last sequence<br>
<br>
set cfm_Led led redL 4 # led red blink 3 times long<br>
set cfm_Led led redS,redS,redS,redL,redL,redL,redS,redS,redS 255 # SOS 255 times<br>
</ul></code>
</li> </li>
</ul><br> </ul><br>
</li> </li>
@ -4412,18 +4488,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
Unlocked the door so that the door can be opened.<br> Unlocked the door so that the door can be opened.<br>
[sec]: Sets the delay in seconds after the lock automatically locked [sec]: Sets the delay in seconds after the lock automatically locked
again.<br>0 - 65535 seconds</li> again.<br>0 - 65535 seconds</li>
<li><B>inhibit [on|off]</B><br> </li>
Block / unblock all directly peered remotes and the hardware buttons of the
keyMatic. If inhibit set on, the door lock drive can be controlled only by
FHEM.<br><br>
Examples:
<ul><code>
# Lock the lock<br>
set keymatic lock<br><br>
# open the door and relock the lock after 60 seconds<br>
set keymatic unlock 60
</ul></code>
</li>
</ul> </ul>
</li> </li>

View File

@ -60,10 +60,10 @@ my %culHmModel=(
"0008" => {name=>"HM-RC-4" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",}, "0008" => {name=>"HM-RC-4" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",},
"0009" => {name=>"HM-LC-SW2-FM" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2",}, "0009" => {name=>"HM-LC-SW2-FM" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2",},
"000A" => {name=>"HM-LC-SW2-SM" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2",}, "000A" => {name=>"HM-LC-SW2-SM" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2",},
"000B" => {name=>"HM-WDC7000" ,st=>'THSensor' ,cyc=>'' ,rxt=>'' ,lst=>'' ,chn=>"",}, "000B" => {name=>"HM-WDC7000" ,st=>'THSensor' ,cyc=>'' ,rxt=>'' ,lst=>'p' ,chn=>"",},
"000D" => {name=>"ASH550" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "000D" => {name=>"ASH550" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"000E" => {name=>"ASH550I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "000E" => {name=>"ASH550I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"000F" => {name=>"S550IA" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "000F" => {name=>"S550IA" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"0011" => {name=>"HM-LC-SW1-PL" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"",}, "0011" => {name=>"HM-LC-SW1-PL" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"",},
"0012" => {name=>"HM-LC-DIM1L-CV" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, "0012" => {name=>"HM-LC-DIM1L-CV" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
"0013" => {name=>"HM-LC-DIM1L-PL" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, "0013" => {name=>"HM-LC-DIM1L-PL" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
@ -90,29 +90,33 @@ my %culHmModel=(
"0034" => {name=>"HM-PBI-4-FM" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",}, # HM Push Button Interface "0034" => {name=>"HM-PBI-4-FM" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",}, # HM Push Button Interface
"0035" => {name=>"HM-PB-4-WM" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",}, "0035" => {name=>"HM-PB-4-WM" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",},
"0036" => {name=>"HM-PB-2-WM" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:2",}, "0036" => {name=>"HM-PB-2-WM" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:2",},
"0037" => {name=>"HM-RC-19" ,st=>'remote' ,cyc=>'' ,rxt=>'c:b' ,lst=>'1,4' ,chn=>"Btn:1:17,Disp:18:18",},
"0038" => {name=>"HM-RC-19-B" ,st=>'remote' ,cyc=>'' ,rxt=>'c:b' ,lst=>'1,4' ,chn=>"Btn:1:17,Disp:18:18",}, "0037" => {name=>"HM-RC-19" ,st=>'remote' ,cyc=>'' ,rxt=>'c:b' ,lst=>'1,4:1p.2p.3p.4p.5p.6p.7p.8p.9p.10p.11p.12p.13p.14p.15p.16p'
,chn=>"Btn:1:17,Disp:18:18",},
"0038" => {name=>"HM-RC-19-B" ,st=>'remote' ,cyc=>'' ,rxt=>'c:b' ,lst=>'1,4:1p.2p.3p.4p.5p.6p.7p.8p.9p.10p.11p.12p.13p.14p.15p.16p'
,chn=>"Btn:1:17,Disp:18:18",},
"0039" => {name=>"HM-CC-TC" ,st=>'thermostat' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'5:2.3p,6:2' ,chn=>"Weather:1:1,Climate:2:2,WindowRec:3:3",}, "0039" => {name=>"HM-CC-TC" ,st=>'thermostat' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'5:2.3p,6:2' ,chn=>"Weather:1:1,Climate:2:2,WindowRec:3:3",},
"003A" => {name=>"HM-CC-VD" ,st=>'thermostat' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'5' ,chn=>"",}, "003A" => {name=>"HM-CC-VD" ,st=>'thermostat' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'p,5' ,chn=>"",},
"003B" => {name=>"HM-RC-4-B" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",}, "003B" => {name=>"HM-RC-4-B" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",},
"003C" => {name=>"HM-WDS20-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "003C" => {name=>"HM-WDS20-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"003D" => {name=>"HM-WDS10-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "003D" => {name=>"HM-WDS10-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"003E" => {name=>"HM-WDS30-T-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "003E" => {name=>"HM-WDS30-T-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"003F" => {name=>"HM-WDS40-TH-I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "003F" => {name=>"HM-WDS40-TH-I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"0040" => {name=>"HM-WDS100-C6-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'1' ,chn=>"",}, "0040" => {name=>"HM-WDS100-C6-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p,1' ,chn=>"",},
"0041" => {name=>"HM-WDC7000" ,st=>'THSensor' ,cyc=>'' ,rxt=>'' ,lst=>'1,4' ,chn=>"",}, "0041" => {name=>"HM-WDC7000" ,st=>'THSensor' ,cyc=>'' ,rxt=>'' ,lst=>'1,4' ,chn=>"",},
"0042" => {name=>"HM-SEC-SD" ,st=>'smokeDetector' ,cyc=>'99:00' ,rxt=>'b' ,lst=>'' ,chn=>"",}, "0042" => {name=>"HM-SEC-SD" ,st=>'smokeDetector' ,cyc=>'99:00' ,rxt=>'b' ,lst=>'p' ,chn=>"",},
"0043" => {name=>"HM-SEC-TIS" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0043" => {name=>"HM-SEC-TIS" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"0044" => {name=>"HM-SEN-EP" ,st=>'sensor' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0044" => {name=>"HM-SEN-EP" ,st=>'sensor' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"0045" => {name=>"HM-SEC-WDS" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0045" => {name=>"HM-SEC-WDS" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"0046" => {name=>"HM-SWI-3-FM" ,st=>'swi' ,cyc=>'' ,rxt=>'c' ,lst=>'4' ,chn=>"Sw:1:3",}, "0046" => {name=>"HM-SWI-3-FM" ,st=>'swi' ,cyc=>'' ,rxt=>'c' ,lst=>'4' ,chn=>"Sw:1:3",},
"0047" => {name=>"KFM-Sensor" ,st=>'KFM100' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, "0047" => {name=>"KFM-Sensor" ,st=>'KFM100' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
"0048" => {name=>"IS-WDS-TH-OD-S-R3" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, "0048" => {name=>"IS-WDS-TH-OD-S-R3" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",},
"0049" => {name=>"KFM-Display" ,st=>'KFM100' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, "0049" => {name=>"KFM-Display" ,st=>'KFM100' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
"004A" => {name=>"HM-SEC-MDIR" ,st=>'motionDetector' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "004A" => {name=>"HM-SEC-MDIR" ,st=>'motionDetector' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"004B" => {name=>"HM-Sec-Cen" ,st=>'AlarmControl' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, "004B" => {name=>"HM-Sec-Cen" ,st=>'AlarmControl' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
"004C" => {name=>"HM-RC-12-SW" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:12",}, "004C" => {name=>"HM-RC-12-SW" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:12",},
"004D" => {name=>"HM-RC-19-SW" ,st=>'remote' ,cyc=>'' ,rxt=>'c:b' ,lst=>'1,4' ,chn=>"Btn:1:17,Disp:18:18",}, "004D" => {name=>"HM-RC-19-SW" ,st=>'remote' ,cyc=>'' ,rxt=>'c:b' ,lst=>'1,4:1p.2p.3p.4p.5p.6p.7p.8p.9p.10p.11p.12p.13p.14p.15p.16p'
,chn=>"Btn:1:17,Disp:18:18",},
"004E" => {name=>"HM-LC-DDC1-PCB" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, # door drive controller 1-channel (PCB) "004E" => {name=>"HM-LC-DDC1-PCB" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, # door drive controller 1-channel (PCB)
"004F" => {name=>"HM-SEN-MDIR-SM" ,st=>'motionDetector' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "004F" => {name=>"HM-SEN-MDIR-SM" ,st=>'motionDetector' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
"0050" => {name=>"HM-SEC-SFA-SM" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Siren:1:1,Flash:2:2",}, "0050" => {name=>"HM-SEC-SFA-SM" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Siren:1:1,Flash:2:2",},
@ -140,7 +144,7 @@ my %culHmModel=(
"006A" => {name=>"HM-LC-Bl1PBU-FM" ,st=>'blindActuator' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, "006A" => {name=>"HM-LC-Bl1PBU-FM" ,st=>'blindActuator' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",},
"006B" => {name=>"HM-PB-2-WM55" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"Btn:1:2",}, "006B" => {name=>"HM-PB-2-WM55" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"Btn:1:2",},
"006C" => {name=>"HM-LC-SW1-BA-PCB" ,st=>'switch' ,cyc=>'' ,rxt=>'b' ,lst=>'3' ,chn=>"",}, "006C" => {name=>"HM-LC-SW1-BA-PCB" ,st=>'switch' ,cyc=>'' ,rxt=>'b' ,lst=>'3' ,chn=>"",},
"006D" => {name=>"HM-OU-LED16" ,st=>'outputUnit' ,cyc=>'' ,rxt=>'' ,lst=>'' ,chn=>"Led:1:16",}, "006D" => {name=>"HM-OU-LED16" ,st=>'outputUnit' ,cyc=>'' ,rxt=>'' ,lst=>'p' ,chn=>"Led:1:16",},
"006E" => {name=>"HM-LC-Dim1L-CV" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",}, "006E" => {name=>"HM-LC-Dim1L-CV" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",},
"006F" => {name=>"HM-LC-Dim1L-Pl" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",}, "006F" => {name=>"HM-LC-Dim1L-Pl" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",},
"0070" => {name=>"HM-LC-Dim2L-SM" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2,Sw1_V:3:4,Sw2_V:5:6",},# "0070" => {name=>"HM-LC-Dim2L-SM" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2,Sw1_V:3:4,Sw2_V:5:6",},#
@ -149,7 +153,7 @@ my %culHmModel=(
"0073" => {name=>"HM-LC-Dim1T-FM" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",}, "0073" => {name=>"HM-LC-Dim1T-FM" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:1,Sw1_V:2:3",},
"0074" => {name=>"HM-LC-Dim2T-SM" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2,Sw1_V:3:4,Sw2_V:5:6",},# "0074" => {name=>"HM-LC-Dim2T-SM" ,st=>'dimmer' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"Sw:1:2,Sw1_V:3:4,Sw2_V:5:6",},#
"0075" => {name=>"HM-OU-CFM-PL" ,st=>'outputUnit' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"Led:1:1,Mp3:2:2",}, "0075" => {name=>"HM-OU-CFM-PL" ,st=>'outputUnit' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"Led:1:1,Mp3:2:2",},
"0076" => {name=>"HM-Sys-sRP-Pl" ,st=>'repeater' ,cyc=>'' ,rxt=>'' ,lst=>'2' ,chn=>"",}, # repeater "0076" => {name=>"HM-Sys-sRP-Pl" ,st=>'repeater' ,cyc=>'' ,rxt=>'' ,lst=>'p,2' ,chn=>"",}, # repeater
"0078" => {name=>"HM-Dis-TD-T" ,st=>'switch' ,cyc=>'' ,rxt=>'b' ,lst=>'3' ,chn=>"",}, # "0078" => {name=>"HM-Dis-TD-T" ,st=>'switch' ,cyc=>'' ,rxt=>'b' ,lst=>'3' ,chn=>"",}, #
"0079" => {name=>"ROTO_ZEL-STG-RM-FWT" ,st=>'' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,3' ,chn=>"",}, # "0079" => {name=>"ROTO_ZEL-STG-RM-FWT" ,st=>'' ,cyc=>'' ,rxt=>'c:w' ,lst=>'1,3' ,chn=>"",}, #
"007A" => {name=>"ROTO_ZEL-STG-RM-FSA" ,st=>'' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, # "007A" => {name=>"ROTO_ZEL-STG-RM-FSA" ,st=>'' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, #
@ -175,8 +179,8 @@ my %culHmModel=(
"008F" => {name=>"Schueco_263-145" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"",}, # HM Push Button Interface "008F" => {name=>"Schueco_263-145" ,st=>'pushButton' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"",}, # HM Push Button Interface
"0090" => {name=>"Schueco_263-162" ,st=>'motionDetector' ,cyc=>'00:30' ,rxt=>'c:w' ,lst=>'1,3' ,chn=>"",}, # HM radio-controlled motion detector "0090" => {name=>"Schueco_263-162" ,st=>'motionDetector' ,cyc=>'00:30' ,rxt=>'c:w' ,lst=>'1,3' ,chn=>"",}, # HM radio-controlled motion detector
"0092" => {name=>"Schueco_263-144" ,st=>'switch' ,cyc=>'' ,rxt=>'c' ,lst=>'4' ,chn=>"",}, # HM Switch Interface 3 switches "0092" => {name=>"Schueco_263-144" ,st=>'switch' ,cyc=>'' ,rxt=>'c' ,lst=>'4' ,chn=>"",}, # HM Switch Interface 3 switches
"0093" => {name=>"Schueco_263-158" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, # "0093" => {name=>"Schueco_263-158" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",}, #
"0094" => {name=>"Schueco_263-157" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",}, # "0094" => {name=>"Schueco_263-157" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p' ,chn=>"",}, #
"009F" => {name=>"HM-Sen-Wa-Od" ,st=>'sensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, #capacitive filling level sensor "009F" => {name=>"HM-Sen-Wa-Od" ,st=>'sensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, #capacitive filling level sensor
"00A1" => {name=>"HM-LC-SW1-PL2" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"",}, # "00A1" => {name=>"HM-LC-SW1-PL2" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'3' ,chn=>"",}, #
"00A2" => {name=>"ROTO_ZEL-STG-RM-FZS-2" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, #radio-controlled socket adapter switch actuator 1-channel "00A2" => {name=>"ROTO_ZEL-STG-RM-FZS-2" ,st=>'switch' ,cyc=>'' ,rxt=>'' ,lst=>'1,3' ,chn=>"",}, #radio-controlled socket adapter switch actuator 1-channel
@ -276,8 +280,8 @@ my %culHmRegDefShLg = (# register that are available for short AND long button p
SwJtDlyOn =>{a=> 12.0,s=>0.4,l=>3,min=>0 ,max=>6 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from delayOn" ,lit=>{no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6}}, SwJtDlyOn =>{a=> 12.0,s=>0.4,l=>3,min=>0 ,max=>6 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from delayOn" ,lit=>{no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6}},
SwJtDlyOff =>{a=> 12.4,s=>0.4,l=>3,min=>0 ,max=>6 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from delayOff",lit=>{no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6}}, SwJtDlyOff =>{a=> 12.4,s=>0.4,l=>3,min=>0 ,max=>6 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from delayOff",lit=>{no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6}},
KeyJtOn =>{a=> 11.0,s=>0.4,l=>3,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from on" ,lit=>{no=>0,dlyUnlock=>1,rampUnlock=>2,lock=>3,dlyLock=>4,rampLock=>5,lock=>6,open=>8}}, KeyJtOn =>{a=> 11.0,s=>0.4,l=>3,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from on" ,lit=>{no=>0,dlyUnlock=>1,rampUnlock=>2,unLock=>3,dlyLock=>4,rampLock=>5,lock=>6,open=>8}},
KeyJtOff =>{a=> 11.4,s=>0.4,l=>3,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from off" ,lit=>{no=>0,dlyUnlock=>1,rampUnlock=>2,lock=>3,dlyLock=>4,rampLock=>5,lock=>6,open=>8}}, KeyJtOff =>{a=> 11.4,s=>0.4,l=>3,min=>0 ,max=>7 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from off" ,lit=>{no=>0,dlyUnlock=>1,rampUnlock=>2,unLock=>3,dlyLock=>4,rampLock=>5,lock=>6,open=>8}},
WinJtOn =>{a=> 11.0,s=>0.4,l=>3,min=>0 ,max=>9 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from off" ,lit=>{no=>0,rampOnDly=>1,rampOn=>2,on=>3,ramoOffDly=>4,rampOff=>5,off=>6,rampOnFast=>8,rampOffFast=>9}}, WinJtOn =>{a=> 11.0,s=>0.4,l=>3,min=>0 ,max=>9 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from off" ,lit=>{no=>0,rampOnDly=>1,rampOn=>2,on=>3,ramoOffDly=>4,rampOff=>5,off=>6,rampOnFast=>8,rampOffFast=>9}},
WinJtOff =>{a=> 11.4,s=>0.4,l=>3,min=>0 ,max=>9 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from off" ,lit=>{no=>0,rampOnDly=>1,rampOn=>2,on=>3,ramoOffDly=>4,rampOff=>5,off=>6,rampOnFast=>8,rampOffFast=>9}}, WinJtOff =>{a=> 11.4,s=>0.4,l=>3,min=>0 ,max=>9 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from off" ,lit=>{no=>0,rampOnDly=>1,rampOn=>2,on=>3,ramoOffDly=>4,rampOff=>5,off=>6,rampOnFast=>8,rampOffFast=>9}},
@ -427,9 +431,10 @@ my %culHmRegDefine = (
# others # 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}}, 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}},
#un-identified List1 #un-identified List1
# SEC-WM55 8:01 (AES on?) # SEC-WM55 08:01 (AES on?)
# SEC-WDS 34:0x64 ? # SEC-WDS 34:0x64 ?
# SEC-SC 8:00 ? # SEC-SC 08:00 ?
# RC19 08:00 ?
# Bl1PBU 08:00 09:00 10:00 # 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=>"". # logicCombination=>{a=> 89.0,s=>0.5,l=>1,min=>0 ,max=>16 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"".
@ -661,14 +666,14 @@ $culHmRegModel{"HM-LC-Dim2T-SM"} = $culHmRegModel{"HM-LC-Dim1T-Pl"};
$culHmRegModel{"Schueco-263-133"} = $culHmRegModel{"HM-LC-Dim1TPBU-FM"}; $culHmRegModel{"Schueco-263-133"} = $culHmRegModel{"HM-LC-Dim1TPBU-FM"};
$culHmRegModel{"Schueco-263-134"} = $culHmRegModel{"HM-LC-Dim1T-Pl-2"}; $culHmRegModel{"Schueco-263-134"} = $culHmRegModel{"HM-LC-Dim1T-Pl-2"};
$culHmRegModel{"ASH550I"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"ASH550I"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"ASH550"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"ASH550"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"HM-WDS10-TH-O"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"HM-WDS10-TH-O"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"Schueco_263-158"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"Schueco_263-158"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"HM-WDS20-TH-O"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"HM-WDS20-TH-O"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"HM-WDS40-TH-I"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"HM-WDS40-TH-I"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"Schueco_263-157"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"Schueco_263-157"} = $culHmRegModel{"HM-WDS10-TH-O"};
$culHmRegModel{"IS-WDS-TH-OD-S-R3"} = $culHmRegModel{"HM-WDS10-TH-O"}; $culHmRegModel{"IS-WDS-TH-OD-S-R3"}= $culHmRegModel{"HM-WDS10-TH-O"};
my %culHmRegChan = (# if channelspecific then enter them here my %culHmRegChan = (# if channelspecific then enter them here
"HM-CC-TC02" =>{displayMode =>1,displayTemp =>1,displayTempUnit =>1, "HM-CC-TC02" =>{displayMode =>1,displayTemp =>1,displayTempUnit =>1,
@ -740,18 +745,19 @@ my %culHmGlobalSetsChn = (# all channels but virtuals
my %culHmSubTypeSets = (# channels of this subtype my %culHmSubTypeSets = (# channels of this subtype
switch =>{ "on-for-timer"=>"sec", "on-till"=>"time", switch =>{ "on-for-timer"=>"sec", "on-till"=>"time",
on=>"", off=>"", toggle=>"", on=>"", off=>"", toggle=>"",
press => "[long|short] [on|off] ..."}, press => "[long|short] [on|off] ...",
inhibit =>"[on|off]"},
dimmer =>{ "on-for-timer"=>"sec", "on-till"=>"time", dimmer =>{ "on-for-timer"=>"sec", "on-till"=>"time",
on=>"", off=>"", toggle=>"", pct=>"[value] ... [time] [ramp]", stop=>"", on=> "", off=> "", toggle=> "", pct=>"[value] ... [time] [ramp]", stop=>"",
press => "[long|short] [on|off] ...", press => "[long|short] [on|off] ...",
up => "[<changeValue>] [ontime] [ramptime]...", up => "[<changeValue>] [ontime] [ramptime]...",
down => "[<changeValue>] [ontime] [ramptime]...", down => "[<changeValue>] [ontime] [ramptime]...",
}, inhibit => "[on|off]"},
blindActuator =>{ on=>"", off=>"", toggle=>"", pct=>"[value] ... [time] [ramp]", stop=>"", blindActuator =>{ on=> "", off=>" ", toggle=> "", pct=>"[value] ... [time] [ramp]", stop=>"",
press => "[long|short] [on|off] ...", press => "[long|short] [on|off] ...",
up => "[<changeValue>] [ontime] [ramptime]...", up => "[<changeValue>] [ontime] [ramptime]...",
down => "[<changeValue>] [ontime] [ramptime]..." down => "[<changeValue>] [ontime] [ramptime]...",
}, inhibit =>"[on|off]"},
remote =>{ peerChan => "<btnNumber> <actChn> ... [single|dual] [set|unset] [actor|remote|both]",}, remote =>{ peerChan => "<btnNumber> <actChn> ... [single|dual] [set|unset] [actor|remote|both]",},
threeStateSensor =>{ peerChan => "<btnNumber> <actChn> ... single [set|unset] [actor|remote|both]",}, threeStateSensor =>{ peerChan => "<btnNumber> <actChn> ... single [set|unset] [actor|remote|both]",},
virtual =>{ peerChan => "<btnNumber> <actChn> ... [single|dual] [set|unset] [actor|remote|both]", virtual =>{ peerChan => "<btnNumber> <actChn> ... [single|dual] [set|unset] [actor|remote|both]",
@ -761,7 +767,8 @@ my %culHmSubTypeSets = (# channels of this subtype
peerChan => "<btnNumber> <actChn> ... single [set|unset] actor",}, peerChan => "<btnNumber> <actChn> ... single [set|unset] actor",},
winMatic =>{ matic => "<btn>", winMatic =>{ matic => "<btn>",
keydef => "<btn> <txt1> <txt2>", keydef => "<btn> <txt1> <txt2>",
create => "<txt>" }, create => "<txt>",
inhibit =>"[on|off]"},
keyMatic =>{ lock =>"", keyMatic =>{ lock =>"",
unlock =>"[sec] ...", unlock =>"[sec] ...",
open =>"[sec] ...", open =>"[sec] ...",
@ -776,11 +783,15 @@ my %culHmModelSets = (# channels of this subtype-------------
"HM-RC-19" =>{service => "<count>", "HM-RC-19" =>{service => "<count>",
alarm => "<count>", alarm => "<count>",
display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>"}, display => "<text> [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] <symbol>"},
"HM-PB-4DIS-WM"=>{text => "<btn> [on|off] <txt1> <txt2>"}, "HM-PB-4DIS-WM"=>{ text => "<txt1> <txt2>...",
"HM-OU-LED16" =>{led =>"[off|red|green|orange]" , #text => "<btn> [on|off] <txt1> <txt2>...", old style will not be offered anymore
ilum =>"[0-15] [0-127]" }, },
"HM-OU-CFM-PL" =>{press => "[long|short] [on|off] ..."}, "HM-OU-LED16" =>{ led =>"[off|red|green|orange]" ,
"HM-Sys-sRP-Pl"=>{setRepeat => "[no1..36] <sendName> <recName> [bdcast-yes|no]"}, ilum =>"[0-15] [0-127]" },
"HM-OU-CFM-PL" =>{ press => "[long|short] [on|off] ...",
inhibit =>"[on|off]"},
"HM-Sys-sRP-Pl"=>{ setRepeat => "[no1..36] <sendName> <recName> [bdcast-yes|no]",
inhibit =>"[on|off]"},
); );
# clones- - - - - - - - - - - - - - - - - # clones- - - - - - - - - - - - - - - - -
$culHmModelSets{"HM-RC-19-B"} = $culHmModelSets{"HM-RC-19"}; $culHmModelSets{"HM-RC-19-B"} = $culHmModelSets{"HM-RC-19"};
@ -788,32 +799,32 @@ $culHmModelSets{"HM-RC-19-SW"} = $culHmModelSets{"HM-RC-19"};
#%{$culHmModelSets{"HM-RC-19-SW"}} = %{$culHmModelSets{"HM-RC-19"}}; copy #%{$culHmModelSets{"HM-RC-19-SW"}} = %{$culHmModelSets{"HM-RC-19"}}; copy
my %culHmChanSets = ( my %culHmChanSets = (
"HM-CC-TC02" =>{ "HM-CC-TC02" =>{ peerChan => "<btnNumber> <actChn> ... single [set|unset] [actor|remote|both]",
peerChan => "<btnNumber> <actChn> ... single [set|unset] [actor|remote|both]", "day-temp" => "[on,off,6.0..30.0]",
"day-temp" => "[on,off,6.0..30.0]", "night-temp" => "[on,off,6.0..30.0]",
"night-temp" => "[on,off,6.0..30.0]", "party-temp" => "[on,off,6.0..30.0]",
"party-temp" => "[on,off,6.0..30.0]", "desired-temp" => "[on,off,6.0..30.0]",
"desired-temp" => "[on,off,6.0..30.0]", tempListSat => "HH:MM temp ...",
tempListSat => "HH:MM temp ...", tempListSun => "HH:MM temp ...",
tempListSun => "HH:MM temp ...", tempListMon => "HH:MM temp ...",
tempListMon => "HH:MM temp ...", tempListTue => "HH:MM temp ...",
tempListTue => "HH:MM temp ...", tempListThu => "HH:MM temp ...",
tempListThu => "HH:MM temp ...", tempListWed => "HH:MM temp ...",
tempListWed => "HH:MM temp ...", tempListFri => "HH:MM temp ...",
tempListFri => "HH:MM temp ...", displayMode => "[temp-only|temp-hum]",
displayMode => "[temp-only|temp-hum]", displayTemp => "[actual|setpoint]",
displayTemp => "[actual|setpoint]", displayTempUnit => "[celsius|fahrenheit]",
displayTempUnit => "[celsius|fahrenheit]", controlMode => "[manual|auto|central|party]",
controlMode => "[manual|auto|central|party]", decalcDay => "day",
decalcDay => "day", sysTime => "" },
sysTime => "" }, "HM-SEC-WIN01" =>{ stop =>"",
"HM-SEC-WIN01"=>{ stop =>"", level =>"<level> <relockDly> <speed>..."},
level =>"<level> <relockDly> <speed>..."}, "HM-OU-CFM-PL01" =>{ led => "<color>[,<color>...] [<repeat>]"},
"HM-OU-CFM-PL01" =>{led => "<color>[,<color>...] [<repeat>]"}, "HM-OU-CFM-PL02" =>{ playTone => "<MP3No>[,<MP3No>...] [<repeat>]"}
"HM-OU-CFM-PL02" =>{playTone => "<MP3No>[,<MP3No>...] [<repeat>]"},
); );
# clones- - - - - - - - - - - - - - - - - # clones- - - - - - - - - - - - - - - - -
$culHmChanSets{"HM-CC-TC00"} = $culHmChanSets{"HM-CC-TC02"}; $culHmChanSets{"HM-CC-TC00"} = $culHmChanSets{"HM-CC-TC02"};
$culHmChanSets{"HM-OU-CF-PL02"} = $culHmChanSets{"HM-OU-CF-PL01"};
# RC send BCAST to specific address. Is the meaning understood? # RC send BCAST to specific address. Is the meaning understood?
my @culHmCmdFlags = ("WAKEUP", "WAKEMEUP", "CFG", "Bit3", my @culHmCmdFlags = ("WAKEUP", "WAKEMEUP", "CFG", "Bit3",