mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-08 13:24:56 +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:
parent
5fa9696237
commit
4e80cb4525
@ -10,7 +10,7 @@ sub HMLAN_Parse($$);
|
||||
sub HMLAN_Read($);
|
||||
sub HMLAN_Write($$$);
|
||||
sub HMLAN_ReadAnswer($$$);
|
||||
sub HMLAN_uptime($);
|
||||
sub HMLAN_uptime($$);
|
||||
sub HMLAN_secSince2000();
|
||||
|
||||
sub HMLAN_SimpleWrite(@);
|
||||
@ -149,9 +149,8 @@ sub HMLAN_ReadAnswer($$$) {# This is a direct read for commands like get
|
||||
DevIo_Disconnected($hash);
|
||||
return("HMLAN_ReadAnswer $arg: $err", undef);
|
||||
}
|
||||
return ("Timeout reading answer for get $arg", undef)
|
||||
if($nfound == 0);
|
||||
$buf = DevIo_SimpleRead($hash);
|
||||
return ("Timeout reading answer for get $arg", undef) if($nfound == 0);
|
||||
$buf = DevIo_SimpleRead($hash);# and now read
|
||||
return ("No data", undef) if(!defined($buf));
|
||||
|
||||
if($buf) {
|
||||
@ -162,7 +161,7 @@ sub HMLAN_ReadAnswer($$$) {# This is a direct read for commands like get
|
||||
if($regexp && $mdata !~ m/$regexp/) {
|
||||
HMLAN_Parse($hash, $mdata);
|
||||
} else {
|
||||
return (undef, $mdata)
|
||||
return (undef, $mdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -231,11 +230,42 @@ sub HMLAN_Read($) {############################################################
|
||||
}
|
||||
$hash->{PARTIAL} = $hmdata;
|
||||
}
|
||||
sub HMLAN_uptime($) {##########################################################
|
||||
my $msec = shift;
|
||||
sub HMLAN_uptime($$) {#########################################################
|
||||
my ($hash,$msec) = @_;
|
||||
|
||||
$msec = hex($msec);
|
||||
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",
|
||||
int($msec/86400000), int($sec/3600),
|
||||
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)-
|
||||
# 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;
|
||||
}
|
||||
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");
|
||||
}
|
||||
#update some User information ------
|
||||
$hash->{uptime} = HMLAN_uptime($mFld[2]);
|
||||
$hash->{RSSI} = $rssi;
|
||||
$hash->{RAWMSG} = $rmsg;
|
||||
$hash->{"${name}_MSGCNT"}++;
|
||||
$hash->{"${name}_TIME"} = TimeNow();
|
||||
$hash->{uptime} = HMLAN_uptime($hash,$mFld[2]);
|
||||
$hash->{RSSI} = $rssi;
|
||||
$hash->{RAWMSG} = $rmsg;
|
||||
$hash->{"${name}_MSGCNT"}++;
|
||||
$hash->{"${name}_TIME"} = TimeNow();
|
||||
|
||||
if (($hash->{helper}{$src}{flg}) && ($letter eq 'R')){ #HMLAN is done?
|
||||
$hash->{helper}{$src}{flg} = 0; #release send-holdoff
|
||||
@ -333,13 +363,13 @@ sub HMLAN_Parse($$) {##########################################################
|
||||
$hash->{serialNr} = $mFld[2];
|
||||
$hash->{firmware} = sprintf("%d.%d", (hex($mFld[1])>>12)&0xf, hex($mFld[1]) & 0xffff);
|
||||
$hash->{owner} = $mFld[4];
|
||||
$hash->{uptime} = HMLAN_uptime($mFld[5]);
|
||||
$hash->{uptime} = HMLAN_uptime($hash,$mFld[5]);
|
||||
$hash->{assignIDsReport}=$mFld[6];
|
||||
$hash->{helper}{keepAliveRec} = 1;
|
||||
$hash->{helper}{keepAliveRpt} = 0;
|
||||
$hash->{helper}{keepAliveRpt} = 0;
|
||||
Log $ll5, 'HMLAN_Parse: '.$name. ' V:'.$mFld[1]
|
||||
.' 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]);
|
||||
if(lc($mFld[4]) ne lc($myId) && !AttrVal($name, "dummy", 0)) {
|
||||
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, "T$s2000,04,00,00000000");
|
||||
|
||||
$hash->{helper}{refTime}=0;
|
||||
|
||||
foreach (keys %lhash){delete ($lhash{$_})};# clear IDs - HMLAN might have a reset
|
||||
$hash->{helper}{keepAliveRec} = 1; # ok for first time
|
||||
@ -449,7 +481,7 @@ sub HMLAN_KeepAlive($) {#######################################################
|
||||
RemoveInternalTimer( "keepAlive:".$name);# avoid duplicate timer
|
||||
my $rt = AttrVal($name,"respTime",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($) {##################################################
|
||||
my($in ) = shift;
|
||||
|
@ -124,7 +124,7 @@ sub CUL_HM_autoReadConfig($){
|
||||
while(@{$modules{CUL_HM}{helper}{updtCfgLst}}){
|
||||
my $name = shift(@{$modules{CUL_HM}{helper}{updtCfgLst}});
|
||||
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,"getConfig");
|
||||
CUL_HM_Set($hash,$name,"statusRequest");
|
||||
@ -144,7 +144,8 @@ sub CUL_HM_updateConfig($){
|
||||
my $name = shift(@nameList);
|
||||
my $hash = CUL_HM_name2Hash($name);
|
||||
my $id = CUL_HM_hash2Id($hash);
|
||||
|
||||
my $chn = substr($id."00",6,2);
|
||||
|
||||
if ($id ne $K_actDetID){# if not action detector
|
||||
CUL_HM_ID2PeerList($name,"",1); # update peerList out of peerIDs
|
||||
my $actCycle = AttrVal($name,"actCycle",undef);
|
||||
@ -211,7 +212,7 @@ sub CUL_HM_updateConfig($){
|
||||
$hash->{helper}{role}{vrt} = 1;
|
||||
}
|
||||
|
||||
# add default web-commands
|
||||
# -+-+-+-+-+ add default web-commands
|
||||
my $webCmd;
|
||||
$webCmd = AttrVal($name,"webCmd",undef);
|
||||
if(!defined $webCmd){
|
||||
@ -224,6 +225,8 @@ sub CUL_HM_updateConfig($){
|
||||
}elsif($st eq "switch" ){$webCmd="toggle:on:off:statusRequest";
|
||||
}elsif($st eq "smokeDetector"){$webCmd="test:alarmOn:alarmOff";
|
||||
}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){
|
||||
my $eventMap = AttrVal($name,"eventMap",undef);
|
||||
@ -234,7 +237,7 @@ sub CUL_HM_updateConfig($){
|
||||
}
|
||||
}
|
||||
$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;
|
||||
CUL_HM_autoReadConfig("updateConfig");
|
||||
@ -333,7 +336,7 @@ sub CUL_HM_Attr(@) {#################################
|
||||
}
|
||||
push(@hashL,$eHash);
|
||||
foreach my $hash (@hashL){
|
||||
my $exLvl = CUL_HM_getExpertMode($hash);
|
||||
my $exLvl = CUL_HM_getAttrInt($hash->{NAME},"expert");
|
||||
if ($exLvl eq "0"){# off
|
||||
foreach my $rdEntry (keys %{$hash->{READINGS}}){
|
||||
my $rdEntryNew;
|
||||
@ -1430,7 +1433,7 @@ sub CUL_HM_parseCommon(@){#####################################################
|
||||
}
|
||||
}
|
||||
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,
|
||||
ReadingsVal($chnName,$regLN,"")." ".$data,0);
|
||||
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 $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
|
||||
$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/ /_/g; #remove blanks
|
||||
|
||||
@ -1496,7 +1499,7 @@ sub CUL_HM_parseCommon(@){#####################################################
|
||||
my ($chn) = ($1) if($p =~ m/^..(..)/);
|
||||
if ($chn eq "00"){
|
||||
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?
|
||||
}
|
||||
}
|
||||
@ -2070,7 +2073,7 @@ sub CUL_HM_Set($@) {
|
||||
elsif($cmd eq "inhibit") { ##################################################
|
||||
return "$a[2] is not on or off" if($a[2] !~ m/^(on|off)$/);
|
||||
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)$/) { #########################################
|
||||
my ($lvl,$tval,$rval) = ($a[2],"","");
|
||||
@ -2095,12 +2098,15 @@ sub CUL_HM_Set($@) {
|
||||
elsif($cmd eq "text") { ################################################# reg
|
||||
$state = "";
|
||||
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[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]);
|
||||
}
|
||||
else{
|
||||
return "to many parameter. Try set $a[0] text $a[2] $a[3]" if($a[4]);
|
||||
}
|
||||
|
||||
$l1 = substr($l1."\x00", 0, 13);
|
||||
$s = 54;
|
||||
@ -2259,18 +2265,26 @@ sub CUL_HM_Set($@) {
|
||||
}
|
||||
}
|
||||
elsif($cmd eq "playTone") { #################################################
|
||||
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);
|
||||
my $msg;
|
||||
if ($a[2] eq 'replay'){
|
||||
$msg = ReadingsVal($chnHash->{NAME},".lastTone","");
|
||||
}
|
||||
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
|
||||
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 $flag = CUL_HM_getFlag($hash);
|
||||
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};
|
||||
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
|
||||
my ($peerReq,$chnValid)= (0,0);
|
||||
my ($listNo,$chnLst1) = split(":",$listEntry);
|
||||
if (!$chnLst1){
|
||||
$chnValid = 1; #if no entry channel is valid
|
||||
$peerReq = 1 if($listNo==3 ||$listNo==4); #default
|
||||
$chnValid = 1; #if no entry go for all channels
|
||||
$peerReq = 1 if($listNo eq 'p' || $listNo==3 ||$listNo==4); #default
|
||||
}
|
||||
else{
|
||||
my @chnLst = split('\.',$chnLst1);
|
||||
foreach my $lchn (@chnLst){
|
||||
$peerReq = 1 if ($lchn =~ m/p/);
|
||||
no warnings;#know that lchan may be followed by a 'p' causing a warning
|
||||
$chnValid = 1 if (int($lchn) == hex($chn));
|
||||
use warnings;
|
||||
no warnings;#know that lchan may be followed by a 'p' causing a warning
|
||||
$chnValid = 1 if (int($lchn) == hex($chn));
|
||||
use warnings;
|
||||
last if ($chnValid);
|
||||
}
|
||||
}
|
||||
if ($chnValid){# yes, we will go for a list
|
||||
if ($peerReq){# need to get the peers first
|
||||
$chnhash->{helper}{getCfgList} = "all"; # peers first
|
||||
$chnhash->{helper}{getCfgListNo} = $listNo;
|
||||
if($listNo ne 'p'){# not if 'only peers'!
|
||||
$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{
|
||||
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+++++++++++++++++++++++++++++
|
||||
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]$/);
|
||||
#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}="";
|
||||
delete ($chnhash->{READINGS}{$rlName}{TIME});
|
||||
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):"";
|
||||
$peerN =~ s/broadcast//;
|
||||
$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;
|
||||
#--- copy data from readings to shadow
|
||||
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_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
|
||||
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);
|
||||
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++++++++++++++++++++++++++++++
|
||||
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)};
|
||||
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 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
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);
|
||||
|
||||
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);
|
||||
$regLN =~ s/broadcast//;
|
||||
|
||||
@ -3265,7 +3281,7 @@ sub CUL_HM_updtRegDisp($$$) {
|
||||
push @regArr, keys %{$culHmRegModel{$md}} if($culHmRegModel{$md});
|
||||
push @regArr, keys %{$culHmRegChan{$md.$chn}} if($culHmRegChan{$md.$chn});
|
||||
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){
|
||||
next if ($culHmRegDefine{$regName}->{l} ne $listNo);
|
||||
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);
|
||||
|
||||
# --- handle specifics - Devices with abnormal or long register
|
||||
CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) &&
|
||||
substr($hash->{DEF},6,2) eq "02" &&
|
||||
CUL_HM_Get($hash,$name,"param","model") eq "HM-CC-TC");
|
||||
CUL_HM_repReadings($hash) if (($list == 2) &&
|
||||
CUL_HM_Get($hash,$name,"param","subType") eq "repeater");
|
||||
my $md = CUL_HM_Get($hash,$name,"param","model");
|
||||
my $st = CUL_HM_Get($hash,$name,"param","subType");
|
||||
if ($md eq "HM-CC-TC"){#handle temperature readings
|
||||
CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) &&
|
||||
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");
|
||||
}
|
||||
#############################
|
||||
@ -3417,10 +3440,34 @@ sub CUL_HM_CvTflt($) { # config time -> float
|
||||
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
|
||||
my ($hash)=@_;
|
||||
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 $reg6 = ReadingsVal($name,$regLN."06:" ,"");
|
||||
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($) {
|
||||
my ($timeout) = @_;
|
||||
my ($h,$m) = split(":",$timeout);
|
||||
no warnings;
|
||||
no warnings 'numeric';
|
||||
$h = int($h);
|
||||
$m = int($m);
|
||||
use warnings;
|
||||
use warnings 'numeric';
|
||||
return ((sprintf("%03s:%02d",$h,$m)),((int($h)*60+int($m))*60));
|
||||
}
|
||||
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 =~ s /_chn:..$//;
|
||||
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}}=
|
||||
CUL_HM_noDup(@{$modules{CUL_HM}{helper}{reqStatus}},$name);
|
||||
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");
|
||||
InternalTimer(gettimeofday()+120,"CUL_HM_reqStatus","CUL_HM_reqStatus", 0);
|
||||
}
|
||||
sub CUL_HM_getARead($){#return valid autoRegRead as integer
|
||||
my $name = shift;
|
||||
my $aRd = CUL_HM_Get($defs{$name},$name,"param","autoReadReg");
|
||||
return ($aRd eq "undefined")?0:int($aRd);
|
||||
sub CUL_HM_getAttrInt($$){#return attrValue as integer
|
||||
my ($name,$attrName) = @_;
|
||||
my $val = AttrVal($name,$attrName,"");
|
||||
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 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
@ -3973,43 +4024,54 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
|
||||
data!. It controlls actions taken upon receive of a trigger from the
|
||||
peer.<br>
|
||||
|
||||
List4: settings for channel (button) of a remote<br><br>
|
||||
List4: settings for channel (button) of a remote<br><br>
|
||||
|
||||
<PeerChannel> 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
|
||||
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
|
||||
with the build-in switches if any). xx is the number of the channel in
|
||||
decimal.<br>
|
||||
'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
|
||||
decimal.<br>
|
||||
|
||||
Note1: execution depends on the entity. If List1 is requested on a
|
||||
device rather then a channel the command will retrieve List1 for all
|
||||
channels assotiated. List3 with peerChannel = all will get all link
|
||||
for all channel if executed on a device.<br>
|
||||
Note1: execution depends on the entity. If List1 is requested on a
|
||||
device rather then a channel the command will retrieve List1 for all
|
||||
channels assotiated. List3 with peerChannel = all will get all link
|
||||
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
|
||||
devices with a lot of channels and links. It may be necessary to
|
||||
refresh the web interface manually to view the results <br>
|
||||
Note3: the information retrieval may take a while - especially for
|
||||
devices with a lot of channels and links. It may be necessary to
|
||||
refresh the web interface manually to view the results <br>
|
||||
|
||||
Note4: the direct buttons on a HM device are hidden by default.
|
||||
Nevertheless those are implemented as links as well. To get access to
|
||||
the 'internal links' it is necessary to issue 'set <name> regSet
|
||||
intKeyVisib 1' or 'set <name> setRegRaw List0 2 81'. Reset it
|
||||
by replacing '81' with '01'<br> example:<br>
|
||||
Note4: the direct buttons on a HM device are hidden by default.
|
||||
Nevertheless those are implemented as links as well. To get access to
|
||||
the 'internal links' it is necessary to issue 'set <name> regSet
|
||||
intKeyVisib 1' or 'set <name> setRegRaw List0 2 81'. Reset it
|
||||
by replacing '81' with '01'<br> example:<br>
|
||||
|
||||
<ul><code>
|
||||
set mydimmer getRegRaw List1<br>
|
||||
set mydimmer getRegRaw List3 all <br>
|
||||
</code></ul>
|
||||
</li>
|
||||
<li><B>getSerial</B><a name="CUL_HMgetSerial"></a><br>
|
||||
<ul><code>
|
||||
set mydimmer getRegRaw List1<br>
|
||||
set mydimmer getRegRaw List3 all <br>
|
||||
</code></ul>
|
||||
</li>
|
||||
<li><B>getSerial</B><a name="CUL_HMgetSerial"></a><br>
|
||||
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>
|
||||
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,
|
||||
@ -4341,17 +4403,31 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
|
||||
</li>
|
||||
<li>OutputUnit (HM-OU-CFM-PL)
|
||||
<ul>
|
||||
<li><B>led <color>[,<color>..]</B><br>
|
||||
<li><B>led <color>[,<color>..] [<repeat>..]</B><br>
|
||||
Possible colors are [redL|greenL|yellowL|redS|greenS|yellowS]. A
|
||||
sequence of colors can be given separating the color entries by ','.
|
||||
White spaces must not be used in the list. 'S' indicates short and
|
||||
'L' long ilumination. <br>
|
||||
<b>repeat</b> defines how often the sequence shall be executed. Defaults to 1.<br>
|
||||
</li>
|
||||
<li><B>playTone <MP3No>[,<MP3No>..] [,<repeat>..]</B><br>
|
||||
<li><B>playTone <MP3No>[,<MP3No>..] [<repeat>..]</B><br>
|
||||
Play a series of tones. List is to be entered separated by ','. White
|
||||
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>
|
||||
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>
|
||||
</ul><br>
|
||||
</li>
|
||||
@ -4412,18 +4488,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
|
||||
Unlocked the door so that the door can be opened.<br>
|
||||
[sec]: Sets the delay in seconds after the lock automatically locked
|
||||
again.<br>0 - 65535 seconds</li>
|
||||
<li><B>inhibit [on|off]</B><br>
|
||||
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>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
|
@ -60,10 +60,10 @@ my %culHmModel=(
|
||||
"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",},
|
||||
"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=>"",},
|
||||
"000D" => {name=>"ASH550" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",},
|
||||
"000E" => {name=>"ASH550I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'' ,chn=>"",},
|
||||
"000F" => {name=>"S550IA" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,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=>'p' ,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=>'p' ,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=>"",},
|
||||
"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
|
||||
"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",},
|
||||
"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",},
|
||||
"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",},
|
||||
"003C" => {name=>"HM-WDS20-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=>'' ,chn=>"",},
|
||||
"003E" => {name=>"HM-WDS30-T-O" ,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=>'' ,chn=>"",},
|
||||
"0040" => {name=>"HM-WDS100-C6-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'1' ,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=>'p' ,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=>'p' ,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=>"",},
|
||||
"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=>"",},
|
||||
"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=>"",},
|
||||
"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=>"",},
|
||||
"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=>"",},
|
||||
"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=>"",},
|
||||
"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)
|
||||
"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",},
|
||||
@ -140,7 +144,7 @@ my %culHmModel=(
|
||||
"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",},
|
||||
"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",},
|
||||
"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",},#
|
||||
@ -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",},
|
||||
"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",},
|
||||
"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=>"",}, #
|
||||
"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=>"",}, #
|
||||
@ -175,8 +179,8 @@ my %culHmModel=(
|
||||
"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
|
||||
"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=>"",}, #
|
||||
"0094" => {name=>"Schueco_263-157" ,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=>'p' ,chn=>"",}, #
|
||||
"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=>"",}, #
|
||||
"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}},
|
||||
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}},
|
||||
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}},
|
||||
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,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}},
|
||||
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
|
||||
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
|
||||
# SEC-WM55 8:01 (AES on?)
|
||||
# SEC-WM55 08:01 (AES on?)
|
||||
# SEC-WDS 34:0x64 ?
|
||||
# SEC-SC 8:00 ?
|
||||
# SEC-SC 08:00 ?
|
||||
# RC19 08: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=>"".
|
||||
@ -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-134"} = $culHmRegModel{"HM-LC-Dim1T-Pl-2"};
|
||||
|
||||
$culHmRegModel{"ASH550I"} = $culHmRegModel{"HM-WDS10-TH-O"};
|
||||
$culHmRegModel{"ASH550"} = $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{"HM-WDS20-TH-O"} = $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{"IS-WDS-TH-OD-S-R3"} = $culHmRegModel{"HM-WDS10-TH-O"};
|
||||
$culHmRegModel{"ASH550I"} = $culHmRegModel{"HM-WDS10-TH-O"};
|
||||
$culHmRegModel{"ASH550"} = $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{"HM-WDS20-TH-O"} = $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{"IS-WDS-TH-OD-S-R3"}= $culHmRegModel{"HM-WDS10-TH-O"};
|
||||
|
||||
my %culHmRegChan = (# if channelspecific then enter them here
|
||||
"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
|
||||
switch =>{ "on-for-timer"=>"sec", "on-till"=>"time",
|
||||
on=>"", off=>"", toggle=>"",
|
||||
press => "[long|short] [on|off] ..."},
|
||||
press => "[long|short] [on|off] ...",
|
||||
inhibit =>"[on|off]"},
|
||||
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] ...",
|
||||
up => "[<changeValue>] [ontime] [ramptime]...",
|
||||
down => "[<changeValue>] [ontime] [ramptime]...",
|
||||
},
|
||||
blindActuator =>{ on=>"", off=>"", toggle=>"", pct=>"[value] ... [time] [ramp]", stop=>"",
|
||||
inhibit => "[on|off]"},
|
||||
blindActuator =>{ on=> "", off=>" ", toggle=> "", pct=>"[value] ... [time] [ramp]", stop=>"",
|
||||
press => "[long|short] [on|off] ...",
|
||||
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]",},
|
||||
threeStateSensor =>{ peerChan => "<btnNumber> <actChn> ... single [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",},
|
||||
winMatic =>{ matic => "<btn>",
|
||||
keydef => "<btn> <txt1> <txt2>",
|
||||
create => "<txt>" },
|
||||
create => "<txt>",
|
||||
inhibit =>"[on|off]"},
|
||||
keyMatic =>{ lock =>"",
|
||||
unlock =>"[sec] ...",
|
||||
open =>"[sec] ...",
|
||||
@ -776,11 +783,15 @@ my %culHmModelSets = (# channels of this subtype-------------
|
||||
"HM-RC-19" =>{service => "<count>",
|
||||
alarm => "<count>",
|
||||
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-OU-LED16" =>{led =>"[off|red|green|orange]" ,
|
||||
ilum =>"[0-15] [0-127]" },
|
||||
"HM-OU-CFM-PL" =>{press => "[long|short] [on|off] ..."},
|
||||
"HM-Sys-sRP-Pl"=>{setRepeat => "[no1..36] <sendName> <recName> [bdcast-yes|no]"},
|
||||
"HM-PB-4DIS-WM"=>{ text => "<txt1> <txt2>...",
|
||||
#text => "<btn> [on|off] <txt1> <txt2>...", old style will not be offered anymore
|
||||
},
|
||||
"HM-OU-LED16" =>{ led =>"[off|red|green|orange]" ,
|
||||
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- - - - - - - - - - - - - - - - -
|
||||
$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
|
||||
|
||||
my %culHmChanSets = (
|
||||
"HM-CC-TC02" =>{
|
||||
peerChan => "<btnNumber> <actChn> ... single [set|unset] [actor|remote|both]",
|
||||
"day-temp" => "[on,off,6.0..30.0]",
|
||||
"night-temp" => "[on,off,6.0..30.0]",
|
||||
"party-temp" => "[on,off,6.0..30.0]",
|
||||
"desired-temp" => "[on,off,6.0..30.0]",
|
||||
tempListSat => "HH:MM temp ...",
|
||||
tempListSun => "HH:MM temp ...",
|
||||
tempListMon => "HH:MM temp ...",
|
||||
tempListTue => "HH:MM temp ...",
|
||||
tempListThu => "HH:MM temp ...",
|
||||
tempListWed => "HH:MM temp ...",
|
||||
tempListFri => "HH:MM temp ...",
|
||||
displayMode => "[temp-only|temp-hum]",
|
||||
displayTemp => "[actual|setpoint]",
|
||||
displayTempUnit => "[celsius|fahrenheit]",
|
||||
controlMode => "[manual|auto|central|party]",
|
||||
decalcDay => "day",
|
||||
sysTime => "" },
|
||||
"HM-SEC-WIN01"=>{ stop =>"",
|
||||
level =>"<level> <relockDly> <speed>..."},
|
||||
"HM-OU-CFM-PL01" =>{led => "<color>[,<color>...] [<repeat>]"},
|
||||
"HM-OU-CFM-PL02" =>{playTone => "<MP3No>[,<MP3No>...] [<repeat>]"},
|
||||
"HM-CC-TC02" =>{ peerChan => "<btnNumber> <actChn> ... single [set|unset] [actor|remote|both]",
|
||||
"day-temp" => "[on,off,6.0..30.0]",
|
||||
"night-temp" => "[on,off,6.0..30.0]",
|
||||
"party-temp" => "[on,off,6.0..30.0]",
|
||||
"desired-temp" => "[on,off,6.0..30.0]",
|
||||
tempListSat => "HH:MM temp ...",
|
||||
tempListSun => "HH:MM temp ...",
|
||||
tempListMon => "HH:MM temp ...",
|
||||
tempListTue => "HH:MM temp ...",
|
||||
tempListThu => "HH:MM temp ...",
|
||||
tempListWed => "HH:MM temp ...",
|
||||
tempListFri => "HH:MM temp ...",
|
||||
displayMode => "[temp-only|temp-hum]",
|
||||
displayTemp => "[actual|setpoint]",
|
||||
displayTempUnit => "[celsius|fahrenheit]",
|
||||
controlMode => "[manual|auto|central|party]",
|
||||
decalcDay => "day",
|
||||
sysTime => "" },
|
||||
"HM-SEC-WIN01" =>{ stop =>"",
|
||||
level =>"<level> <relockDly> <speed>..."},
|
||||
"HM-OU-CFM-PL01" =>{ led => "<color>[,<color>...] [<repeat>]"},
|
||||
"HM-OU-CFM-PL02" =>{ playTone => "<MP3No>[,<MP3No>...] [<repeat>]"}
|
||||
);
|
||||
# clones- - - - - - - - - - - - - - - - -
|
||||
$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?
|
||||
my @culHmCmdFlags = ("WAKEUP", "WAKEMEUP", "CFG", "Bit3",
|
||||
|
Loading…
x
Reference in New Issue
Block a user