2
0
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:
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_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;

View File

@ -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>
&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
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 &lt;name&gt; regSet
intKeyVisib 1' or 'set &lt;name&gt; 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 &lt;name&gt; regSet
intKeyVisib 1' or 'set &lt;name&gt; 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 &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
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 &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
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>

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",},
"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",