diff --git a/fhem/FHEM/00_HMLAN.pm b/fhem/FHEM/00_HMLAN.pm index dac31e9d9..ce4b21e77 100755 --- a/fhem/FHEM/00_HMLAN.pm +++ b/fhem/FHEM/00_HMLAN.pm @@ -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; diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index 4d08b54ae..382ff48c2 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -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); - # - 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); + # + 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.
- List4: settings for channel (button) of a remote

+ List4: settings for channel (button) of a remote

<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.
- 'all' can be used to get data of each paired link of the channel.
+ 'all' can be used to get data of each paired link of the channel.
- '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.
+ '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.
- 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.
+ 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.
- Note2: for 'sender' see remote
+ Note2: for 'sender' see remote
- 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
+ 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
- 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'
example:
+ 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'
example:
-
    - set mydimmer getRegRaw List1
    - set mydimmer getRegRaw List3 all
    -
- -
  • getSerial
    +
      + set mydimmer getRegRaw List1
      + set mydimmer getRegRaw List3 all
      +
    +
  • +
  • getSerial
    Read serial number from device and write it to attribute serialNr. -
  • + +
  • inhibit [on|off]
    + 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.

    + Examples: +
      + # Block operation
      + set keymatic inhibit on

      +
    +
  • +
  • pair
    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
  • OutputUnit (HM-OU-CFM-PL)
      -
    • led <color>[,<color>..]
      +
    • led <color>[,<color>..] [<repeat>..]
      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.
      repeat defines how often the sequence shall be executed. Defaults to 1.
    • -
    • playTone <MP3No>[,<MP3No>..] [,<repeat>..]
      +
    • playTone <MP3No>[,<MP3No>..] [<repeat>..]
      Play a series of tones. List is to be entered separated by ','. White spaces must not be used in the list.
      + replay can be entered to repeat the last sound played once more.
      repeat defines how often the sequence shall be played. Defaults to 1.
      + Example: +
        + # "hello" in display, symb bulb on, backlight, beep
        + set cfm_Mp3 playTone 3 # MP3 title 3 once
        + set cfm_Mp3 playTone 3 3 # MP3 title 3 3 times
        + set cfm_Mp3 playTone 3,6,8,3,4 # MP3 title list 3,6,8,3,4 once
        + set cfm_Mp3 playTone 3,6,8,3,4 255# MP3 title list 3,6,8,3,4 255 times
        + set cfm_Mp3 playTone replay # repeat last sequence
        +
        + set cfm_Led led redL 4 # led red blink 3 times long
        + set cfm_Led led redS,redS,redS,redL,redL,redL,redS,redS,redS 255 # SOS 255 times
        +
      +

  • @@ -4412,18 +4488,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo Unlocked the door so that the door can be opened.
    [sec]: Sets the delay in seconds after the lock automatically locked again.
    0 - 65535 seconds -
  • inhibit [on|off]
    - 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.

    - Examples: -
      - # Lock the lock
      - set keymatic lock

      - # open the door and relock the lock after 60 seconds
      - set keymatic unlock 60 -
    -
  • + diff --git a/fhem/FHEM/HMConfig.pm b/fhem/FHEM/HMConfig.pm index 3bc92ba7f..afd5f05d5 100644 --- a/fhem/FHEM/HMConfig.pm +++ b/fhem/FHEM/HMConfig.pm @@ -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 => "[] [ontime] [ramptime]...", down => "[] [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 => "[] [ontime] [ramptime]...", - down => "[] [ontime] [ramptime]..." - }, + down => "[] [ontime] [ramptime]...", + inhibit =>"[on|off]"}, remote =>{ peerChan => " ... [single|dual] [set|unset] [actor|remote|both]",}, threeStateSensor =>{ peerChan => " ... single [set|unset] [actor|remote|both]",}, virtual =>{ peerChan => " ... [single|dual] [set|unset] [actor|remote|both]", @@ -761,7 +767,8 @@ my %culHmSubTypeSets = (# channels of this subtype peerChan => " ... single [set|unset] actor",}, winMatic =>{ matic => "", keydef => " ", - create => "" }, + create => "", + inhibit =>"[on|off]"}, keyMatic =>{ lock =>"", unlock =>"[sec] ...", open =>"[sec] ...", @@ -776,11 +783,15 @@ my %culHmModelSets = (# channels of this subtype------------- "HM-RC-19" =>{service => "", alarm => "", display => " [comma,no] [unit] [off|1|2|3] [off|on|slow|fast] "}, - "HM-PB-4DIS-WM"=>{text => " [on|off] "}, - "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] [bdcast-yes|no]"}, + "HM-PB-4DIS-WM"=>{ text => " ...", + #text => " [on|off] ...", 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] [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 => " ... 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 =>" ..."}, - "HM-OU-CFM-PL01" =>{led => "[,...] []"}, - "HM-OU-CFM-PL02" =>{playTone => "[,...] []"}, + "HM-CC-TC02" =>{ peerChan => " ... 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 =>" ..."}, + "HM-OU-CFM-PL01" =>{ led => "[,...] []"}, + "HM-OU-CFM-PL02" =>{ playTone => "[,...] []"} ); # 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",