mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
CUL_HM:update IO assignment - plus cosmetic changes
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@15366 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
6a23606f17
commit
c9fcc0fe37
@ -285,28 +285,28 @@ sub CUL_HM_updateConfig($){
|
|||||||
if ($md =~ /(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/){
|
if ($md =~ /(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/){
|
||||||
$hash->{helper}{role}{chn} = 1 if (length($id) == 6); #tc special
|
$hash->{helper}{role}{chn} = 1 if (length($id) == 6); #tc special
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/HM-CC-RT-DN/){
|
elsif ($md =~ m/^HM-CC-RT-DN/){
|
||||||
$hash->{helper}{shRegR}{"07"} = "00" if ($chn eq "04");# shadowReg List 7 read from CH 0
|
$hash->{helper}{shRegR}{"07"} = "00" if ($chn eq "04");# shadowReg List 7 read from CH 0
|
||||||
$hash->{helper}{shRegW}{"07"} = "04" if ($chn eq "00");# shadowReg List 7 write to CH 4
|
$hash->{helper}{shRegW}{"07"} = "04" if ($chn eq "00");# shadowReg List 7 write to CH 4
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/HM-TC-IT-WM-W-EU/){
|
elsif ($md =~ m/^HM-TC-IT-WM-W-EU/){
|
||||||
$hash->{helper}{shRegR}{"07"} = "00" if ($chn eq "02");# shadowReg List 7 read from CH 0
|
$hash->{helper}{shRegR}{"07"} = "00" if ($chn eq "02");# shadowReg List 7 read from CH 0
|
||||||
$hash->{helper}{shRegW}{"07"} = "02" if ($chn eq "00");# shadowReg List 7 write to CH 4
|
$hash->{helper}{shRegW}{"07"} = "02" if ($chn eq "00");# shadowReg List 7 write to CH 4
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/){
|
elsif ($md =~ m/^(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/){
|
||||||
$hash->{helper}{oldDes} = "0";
|
$hash->{helper}{oldDes} = "0";
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/(HM-Dis-WM55)/){
|
elsif ($md =~ m/^(HM-Dis-WM55)/){
|
||||||
foreach my $t ("s","l"){
|
foreach my $t ("s","l"){
|
||||||
if(!defined $hash->{helper}{dispi}{$t}{"l1"}{d}){# setup if one is missing
|
if(!defined $hash->{helper}{dispi}{$t}{"l1"}{d}){# setup if one is missing
|
||||||
$hash->{helper}{dispi}{$t}{"l$_"}{d}=1 foreach (1,2,3,4,5,6);
|
$hash->{helper}{dispi}{$t}{"l$_"}{d}=1 foreach (1,2,3,4,5,6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/(HM-Dis-EP-WM55)/){
|
elsif ($md =~ m/^(HM-Dis-EP-WM55)/){
|
||||||
CUL_HM_UpdtReadSingle($hash,"state","-",0) if(InternalVal($name,"chanNo",0)>3);
|
CUL_HM_UpdtReadSingle($hash,"state","-",0) if(InternalVal($name,"chanNo",0)>3);
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/(CCU-FHEM)/){
|
elsif ($md =~ m/^(CCU-FHEM)/){
|
||||||
$hash->{helper}{role}{vrt} = 1;
|
$hash->{helper}{role}{vrt} = 1;
|
||||||
if($hash->{helper}{role}{dev}){
|
if($hash->{helper}{role}{dev}){
|
||||||
CUL_HM_UpdtCentral($name); # first update, then keys
|
CUL_HM_UpdtCentral($name); # first update, then keys
|
||||||
@ -438,10 +438,10 @@ sub CUL_HM_updateConfig($){
|
|||||||
|
|
||||||
}
|
}
|
||||||
elsif((!$hash->{helper}{role}{chn} &&
|
elsif((!$hash->{helper}{role}{chn} &&
|
||||||
$md !~ m/(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/)
|
$md !~ m/^(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/)
|
||||||
||$st eq "repeater"
|
||$st eq "repeater"
|
||||||
||$md =~ m/(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/ ){$webCmd="getConfig:clear msgEvents";
|
||$md =~ m/^(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/ ){$webCmd="getConfig:clear msgEvents";
|
||||||
if ($md =~ m/HM-CC-RT-DN/) {$webCmd.=":burstXmit";}
|
if ($md =~ m/^HM-CC-RT-DN/) {$webCmd.=":burstXmit";}
|
||||||
}
|
}
|
||||||
elsif($st eq "blindActuator"){
|
elsif($st eq "blindActuator"){
|
||||||
if ($hash->{helper}{role}{chn}){$webCmd="statusRequest:toggleDir:on:off:up:down:stop";}
|
if ($hash->{helper}{role}{chn}){$webCmd="statusRequest:toggleDir:on:off:up:down:stop";}
|
||||||
@ -815,14 +815,21 @@ sub CUL_HM_Attr(@) {#################################
|
|||||||
elsif($attrName eq "IOgrp" ){
|
elsif($attrName eq "IOgrp" ){
|
||||||
if ($cmd eq "set"){
|
if ($cmd eq "set"){
|
||||||
return "use $attrName only for devices" if (!$hash->{helper}{role}{dev});
|
return "use $attrName only for devices" if (!$hash->{helper}{role}{dev});
|
||||||
|
|
||||||
my ($ioCCU,$prefIO) = split(":",$attrVal,2);
|
my ($ioCCU,$prefIO) = split(":",$attrVal,2);
|
||||||
$hash->{helper}{io}{vccu} = $ioCCU;
|
$hash->{helper}{io}{vccu} = $ioCCU;
|
||||||
|
delete $hash->{helper}{io}{prefIO};
|
||||||
if ($prefIO){
|
if ($prefIO){
|
||||||
my @prefIOA = split(",",$prefIO);
|
my @prefIOA;
|
||||||
$hash->{helper}{io}{prefIO} = \@prefIOA;
|
if ($init_done){@prefIOA = grep /.+/,map{$defs{$_} ? $_ : ""} split(",",$prefIO);}
|
||||||
}
|
else {@prefIOA = split(",",$prefIO);}#checkis possible after init. Assume correct if not finished
|
||||||
else{
|
|
||||||
delete $hash->{helper}{io}{prefIO};
|
$hash->{helper}{io}{prefIO} = \@prefIOA if (int(@prefIOA));
|
||||||
|
my $attrValAssamble = "$ioCCU:".join(",",@prefIOA);
|
||||||
|
if ($attrVal ne $attrValAssamble){# original setting not possible
|
||||||
|
$attr{$name}{$attrName} = $attrValAssamble;
|
||||||
|
return "value corrected $attrName:$attrValAssamble";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@ -1008,7 +1015,8 @@ sub CUL_HM_hmInitMsgUpdt($){ #update device init msg for HMLAN
|
|||||||
if (( $hash->{helper}{io}{newChn} ne $oldChn)
|
if (( $hash->{helper}{io}{newChn} ne $oldChn)
|
||||||
&& $hash->{IODev}
|
&& $hash->{IODev}
|
||||||
&& $hash->{IODev}->{TYPE}
|
&& $hash->{IODev}->{TYPE}
|
||||||
&& $hash->{IODev}->{TYPE} =~ m/^(HMLAN|HMUARTLGW)$/){
|
&& ( $hash->{IODev}->{helper}{VTS_AES} # for TSCUL VTS0.14 up
|
||||||
|
|| $hash->{IODev}->{TYPE} =~ m/^(HMLAN|HMUARTLGW)$/ )) {
|
||||||
IOWrite($hash, "", "init:$p[0]");
|
IOWrite($hash, "", "init:$p[0]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1169,6 +1177,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CUL_HM_assignIO($mh{devH}); #this way the init and remove work even on startup for TSCUL
|
||||||
if ( !defined $mh{devH}->{IODev}
|
if ( !defined $mh{devH}->{IODev}
|
||||||
|| !defined $mh{devH}->{IODev}{NAME}){
|
|| !defined $mh{devH}->{IODev}{NAME}){
|
||||||
Log3 $mh{devH},1,"CUL_HM $mh{devN} error: no IO deviced!!! correkt it";
|
Log3 $mh{devH},1,"CUL_HM $mh{devN} error: no IO deviced!!! correkt it";
|
||||||
@ -1281,7 +1290,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
$chn = $mI[0];
|
$chn = $mI[0];
|
||||||
}
|
}
|
||||||
elsif ($mh{mTp} eq "10") {
|
elsif ($mh{mTp} eq "10") {
|
||||||
if ($mh{mStp} =~ m/0[46]/) {
|
if ($mh{mStp} =~ m/^0[46]/) {
|
||||||
CUL_HM_m_setCh(\%mh,$mI[1]);
|
CUL_HM_m_setCh(\%mh,$mI[1]);
|
||||||
}
|
}
|
||||||
elsif ($mh{mStp} eq "01") {
|
elsif ($mh{mStp} eq "01") {
|
||||||
@ -1493,7 +1502,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
push @evtEt,[$mh{shash},1,"unknown:$mh{p}"];
|
push @evtEt,[$mh{shash},1,"unknown:$mh{p}"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($mh{md} =~ m/(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/) { #######################
|
elsif($mh{md} =~ m/^(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/) { ######################
|
||||||
my $chn = $mI[1];
|
my $chn = $mI[1];
|
||||||
if( $mh{mTp} eq "70") { # weather event
|
if( $mh{mTp} eq "70") { # weather event
|
||||||
$chn = '01'; # fix definition
|
$chn = '01'; # fix definition
|
||||||
@ -1589,7 +1598,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
push @evtEt,[$mh{shash},1,"time-request"];
|
push @evtEt,[$mh{shash},1,"time-request"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($mh{md} =~ m/(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/) { #######################
|
elsif($mh{md} =~ m/^(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/) { ######################
|
||||||
if($mh{mTp} eq "02" && @mI > 2) {#subtype+chn+value+err
|
if($mh{mTp} eq "02" && @mI > 2) {#subtype+chn+value+err
|
||||||
my ($chn,$vp, $err) = map{hex($_)} @mI[1..3];
|
my ($chn,$vp, $err) = map{hex($_)} @mI[1..3];
|
||||||
$chn = sprintf("%02X",$chn&0x3f);
|
$chn = sprintf("%02X",$chn&0x3f);
|
||||||
@ -1632,7 +1641,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
$mh{shash}->{helper}{oldDes} = $des;
|
$mh{shash}->{helper}{oldDes} = $des;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($mh{md} =~ m/HM-CC-RT-DN/) { ##########################################
|
elsif($mh{md} =~ m/^HM-CC-RT-DN/) { #########################################
|
||||||
my %ctlTbl=( 0=>"auto", 1=>"manual", 2=>"party",3=>"boost");
|
my %ctlTbl=( 0=>"auto", 1=>"manual", 2=>"party",3=>"boost");
|
||||||
|
|
||||||
if(($mh{mTyp} eq "100A") || #info-level/
|
if(($mh{mTyp} eq "100A") || #info-level/
|
||||||
@ -1818,7 +1827,8 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
$mh{shash} = $modules{CUL_HM}{defptr}{"$mh{src}$chn"}
|
$mh{shash} = $modules{CUL_HM}{defptr}{"$mh{src}$chn"}
|
||||||
if($modules{CUL_HM}{defptr}{"$mh{src}$chn"});
|
if($modules{CUL_HM}{defptr}{"$mh{src}$chn"});
|
||||||
my ($t,$h) = map{hex($_)} unpack 'A4A2',$mh{p};
|
my ($t,$h) = map{hex($_)} unpack 'A4A2',$mh{p};
|
||||||
$t -= 0x8000 if($t > 1638.4);
|
$t &= 0x7fff;
|
||||||
|
$t -= 0x8000 if($t & 0x4000);
|
||||||
$t = sprintf("%0.1f", $t/10);
|
$t = sprintf("%0.1f", $t/10);
|
||||||
push @evtEt,[$mh{shash},1,"temperature:$t"];
|
push @evtEt,[$mh{shash},1,"temperature:$t"];
|
||||||
push @evtEt,[$mh{shash},1,"humidity:$h"];
|
push @evtEt,[$mh{shash},1,"humidity:$h"];
|
||||||
@ -1869,7 +1879,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
}
|
}
|
||||||
elsif($mh{md} eq "KFM-Sensor") { ############################################
|
elsif($mh{md} eq "KFM-Sensor") { ############################################
|
||||||
if ($mh{mTp} eq "53"){
|
if ($mh{mTp} eq "53"){
|
||||||
if($mh{p} =~ m/(..)4(.)0200(..)(..)(..)/) {
|
if($mh{p} =~ m/^(..)4(.)0200(..)(..)(..)/) {
|
||||||
my ($chn,$seq, $k_v1, $k_v2, $k_v3) = (hex($1),hex($2),$3,hex($4),hex($5));
|
my ($chn,$seq, $k_v1, $k_v2, $k_v3) = (hex($1),hex($2),$3,hex($4),hex($5));
|
||||||
push @evtEt,[$mh{devH},1,"battery:".($chn & 0x80?"low":"ok")];
|
push @evtEt,[$mh{devH},1,"battery:".($chn & 0x80?"low":"ok")];
|
||||||
my $v = 1408 - ((($k_v3 & 0x07)<<8) + $k_v2);
|
my $v = 1408 - ((($k_v3 & 0x07)<<8) + $k_v2);
|
||||||
@ -2213,7 +2223,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
push @evtEt,[$mh{devH},1,"sabotageError:".(($err&0x04) ? "on":"off")];
|
push @evtEt,[$mh{devH},1,"sabotageError:".(($err&0x04) ? "on":"off")];
|
||||||
push @evtEt,[$mh{devH},1,"battery:".(($err&0x08)?"critical":($err&0x80?"low":"ok"))];
|
push @evtEt,[$mh{devH},1,"battery:".(($err&0x08)?"critical":($err&0x80?"low":"ok"))];
|
||||||
}
|
}
|
||||||
elsif ($mh{md} =~ m/(HM-LC-SW.-BA-PCB|HM-Dis-TD-T)/){
|
elsif ($mh{md} =~ m/^(HM-LC-SW.-BA-PCB|HM-Dis-TD-T)/){
|
||||||
push @evtEt,[$mh{devH},1,"battery:" . (($err&0x80) ? "low" : "ok" )];
|
push @evtEt,[$mh{devH},1,"battery:" . (($err&0x80) ? "low" : "ok" )];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2334,7 +2344,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($mh{st} eq "senBright") { #############################################
|
elsif($mh{st} eq "senBright") { #############################################
|
||||||
if ($mh{mTp} =~ m/5[34]/){
|
if ($mh{mTp} =~ m/^5[34]/){
|
||||||
#Channel is fixed 1
|
#Channel is fixed 1
|
||||||
my ($chn,$unkn,$dat) = unpack 'A2A2A8',$mh{p};# chn = 01
|
my ($chn,$unkn,$dat) = unpack 'A2A2A8',$mh{p};# chn = 01
|
||||||
push @evtEt,[$mh{devH},1,"battery:".(hex($chn)&0x80?"low":"ok")];
|
push @evtEt,[$mh{devH},1,"battery:".(hex($chn)&0x80?"low":"ok")];
|
||||||
@ -2498,7 +2508,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
my $eo = ReadingsVal($mh{shash}->{NAME},"energyOffset",0);
|
my $eo = ReadingsVal($mh{shash}->{NAME},"energyOffset",0);
|
||||||
if($eCnt == 0 && hex($mh{mNo}) < 3 && !$mh{shash}->{helper}{pon}){
|
if($eCnt == 0 && hex($mh{mNo}) < 3 && !$mh{shash}->{helper}{pon}){
|
||||||
if($mh{devH}->{helper}{PONtest}){
|
if($mh{devH}->{helper}{PONtest}){
|
||||||
push @evtEt,[$mh{devH},1,"powerOn:$tn",] if ($mh{md} !~ m/HM-ES-PMSw1/);
|
push @evtEt,[$mh{devH},1,"powerOn:$tn",] if ($mh{md} !~ m/^HM-ES-PMSw1/);
|
||||||
$mh{devH}->{helper}{PONtest} = 0;
|
$mh{devH}->{helper}{PONtest} = 0;
|
||||||
}
|
}
|
||||||
$eo += $el;
|
$eo += $el;
|
||||||
@ -2621,6 +2631,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
}
|
}
|
||||||
elsif($mh{mTp} eq "41") {#01 is channel
|
elsif($mh{mTp} eq "41") {#01 is channel
|
||||||
my($chn,$cnt,$bright,$nextTr) = map{hex($_)} (@mI,0);
|
my($chn,$cnt,$bright,$nextTr) = map{hex($_)} (@mI,0);
|
||||||
|
push @evtEt,[$mh{devH},1,"battery:".($chn&0x80?"low":"ok")]; # observed with HM-SEN-MDIR-SM FW V1.6
|
||||||
if ($nextTr){
|
if ($nextTr){
|
||||||
$nextTr = (15 << ($nextTr >> 4) - 4); # strange mapping of literals
|
$nextTr = (15 << ($nextTr >> 4) - 4); # strange mapping of literals
|
||||||
RemoveInternalTimer($mh{cName}.":motionCheck");
|
RemoveInternalTimer($mh{cName}.":motionCheck");
|
||||||
@ -2648,6 +2659,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
|
|
||||||
if($ioId eq $mh{dst} && $mh{mFlgH}&0x20 && $state){
|
if($ioId eq $mh{dst} && $mh{mFlgH}&0x20 && $state){
|
||||||
push @ack,$mh{shash},$mh{mNo}."8002".$ioId.$mh{src}."0101".$state."00";
|
push @ack,$mh{shash},$mh{mNo}."8002".$ioId.$mh{src}."0101".$state."00";
|
||||||
|
$mh{AckDone} = 1; # mark allready done device specific
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($mh{st} eq "smokeDetector") { #########################################
|
elsif($mh{st} eq "smokeDetector") { #########################################
|
||||||
@ -2734,6 +2746,7 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
$mh{shash} = $modules{CUL_HM}{defptr}{"$mh{src}$chn"}
|
$mh{shash} = $modules{CUL_HM}{defptr}{"$mh{src}$chn"}
|
||||||
if($modules{CUL_HM}{defptr}{"$mh{src}$chn"});
|
if($modules{CUL_HM}{defptr}{"$mh{src}$chn"});
|
||||||
push @evtEt,[$mh{devH},1,"battery:". ($err?"low" :"ok" )];
|
push @evtEt,[$mh{devH},1,"battery:". ($err?"low" :"ok" )];
|
||||||
|
push @ack,$mh{shash},$mh{mNo}."8002".$mh{dst}.$mh{src}."00"; # additional CUL ACK
|
||||||
}
|
}
|
||||||
if (defined($state)){# if state was detected post events
|
if (defined($state)){# if state was detected post events
|
||||||
my $txt;
|
my $txt;
|
||||||
@ -2885,8 +2898,9 @@ sub CUL_HM_Parse($$) {#########################################################
|
|||||||
push @ack,$mh{dstH},$mh{mNo}."8002".$mh{dst}.$mh{src}."00" if ($mh{mFlgH} & 0x20 && (!@ack) && $sendAck);
|
push @ack,$mh{dstH},$mh{mNo}."8002".$mh{dst}.$mh{src}."00" if ($mh{mFlgH} & 0x20 && (!@ack) && $sendAck);
|
||||||
}
|
}
|
||||||
elsif($ioId eq $mh{dst}){# if fhem is destination check if we need to react
|
elsif($ioId eq $mh{dst}){# if fhem is destination check if we need to react
|
||||||
if($mh{mTp} =~ m/^4./ && #Push Button event
|
if( $mh{mTp} =~ m/^4./ #Push Button event
|
||||||
($mh{mFlgH} & 0x20)){ #response required Flag
|
&& !$mh{AckDone} #noansi: allready done device specific
|
||||||
|
&& ($mh{mFlgH} & 0x20)){ #response required Flag
|
||||||
# fhem CUL shall ack a button press
|
# fhem CUL shall ack a button press
|
||||||
if ($mh{md} =~ m/^(HM-SEC-SC.*|Roto_ZEL-STG-RM-FFK)$/){# SCs - depending on FW version - do not accept ACK only. Especially if peered
|
if ($mh{md} =~ m/^(HM-SEC-SC.*|Roto_ZEL-STG-RM-FFK)$/){# SCs - depending on FW version - do not accept ACK only. Especially if peered
|
||||||
push @ack,$mh{shash},$mh{mNo}."8002".$mh{dst}.$mh{src}."0101".((hex($mI[0])&1)?"C8":"00")."00";
|
push @ack,$mh{shash},$mh{mNo}."8002".$mh{dst}.$mh{src}."0101".((hex($mI[0])&1)?"C8":"00")."00";
|
||||||
@ -2951,7 +2965,7 @@ sub CUL_HM_parseCommon(@){#####################################################
|
|||||||
# VD wakes up with 8202
|
# VD wakes up with 8202
|
||||||
# 9610
|
# 9610
|
||||||
my $rxt = CUL_HM_getRxType($mhp->{shash});
|
my $rxt = CUL_HM_getRxType($mhp->{shash});
|
||||||
$devHlpr->{PONtest} = 1 if($mhp->{mNo} =~ m/0[012]/ &&
|
$devHlpr->{PONtest} = 1 if($mhp->{mNo} =~ m/^0[012]/ &&
|
||||||
$devHlpr->{HM_CMDNR} < 250 &&
|
$devHlpr->{HM_CMDNR} < 250 &&
|
||||||
$devHlpr->{HM_CMDNR} > 5);# this is power on
|
$devHlpr->{HM_CMDNR} > 5);# this is power on
|
||||||
$devHlpr->{HM_CMDNR} = hex($mhp->{mNo});# sync msgNo prior to any sending
|
$devHlpr->{HM_CMDNR} = hex($mhp->{mNo});# sync msgNo prior to any sending
|
||||||
@ -3804,10 +3818,10 @@ sub CUL_HM_Get($@) {#+++++++++++++++++ get command+++++++++++++++++++++++++++++
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
my $addInfo = "";
|
my $addInfo = "";
|
||||||
if ($md =~ m/(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/ && $chn eq "02"){$addInfo = CUL_HM_TCtempReadings($hash)}
|
if ($md =~ m/^(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/ && $chn eq "02"){$addInfo = CUL_HM_TCtempReadings($hash)}
|
||||||
elsif ($md =~ m/HM-CC-RT-DN/ && $chn eq "04"){$addInfo = CUL_HM_TCITRTtempReadings($hash,$md,7)}
|
elsif ($md =~ m/^HM-CC-RT-DN/ && $chn eq "04"){$addInfo = CUL_HM_TCITRTtempReadings($hash,$md,7)}
|
||||||
elsif ($md =~ m/HM-TC-IT/ && $chn eq "02"){$addInfo = CUL_HM_TCITRTtempReadings($hash,$md,7,8,9)}
|
elsif ($md =~ m/^HM-TC-IT/ && $chn eq "02"){$addInfo = CUL_HM_TCITRTtempReadings($hash,$md,7,8,9)}
|
||||||
elsif ($md =~ m/(^HM-PB-4DIS-WM|HM-Dis-WM55|HM-RC-Dis-H-x-EU|ROTO_ZEL-STG-RM-DWT-10)/)
|
elsif ($md =~ m/^(^HM-PB-4DIS-WM|HM-Dis-WM55|HM-RC-Dis-H-x-EU|ROTO_ZEL-STG-RM-DWT-10)/)
|
||||||
{$addInfo = CUL_HM_4DisText($hash)}
|
{$addInfo = CUL_HM_4DisText($hash)}
|
||||||
elsif ($md eq "HM-Sys-sRP-Pl") {$addInfo = CUL_HM_repReadings($hash)}
|
elsif ($md eq "HM-Sys-sRP-Pl") {$addInfo = CUL_HM_repReadings($hash)}
|
||||||
|
|
||||||
@ -4136,8 +4150,8 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
$l2 =~ s/(.)/sprintf(" %02X:%02X",$s++,ord($1))/ge;
|
$l2 =~ s/(.)/sprintf(" %02X:%02X",$s++,ord($1))/ge;
|
||||||
@a = ($a[0],"regBulk","RegL_01.",split(" ",$l1.$l2));
|
@a = ($a[0],"regBulk","RegL_01.",split(" ",$l1.$l2));
|
||||||
}
|
}
|
||||||
elsif($cmd =~ m/(displayMode|displayTemp|displayTempUnit|controlMode)/) {
|
elsif($cmd =~ m/^(displayMode|displayTemp|displayTempUnit|controlMode)/) {
|
||||||
if ($md =~ m/(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/){#controlMode different for RT
|
if ($md =~ m/^(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/){#controlMode different for RT
|
||||||
splice @a,1,3, ("regSet",$a[1],$a[2]);
|
splice @a,1,3, ("regSet",$a[1],$a[2]);
|
||||||
push @postCmds,"++803F$id${dst}0204".sprintf("%02X",CUL_HM_secSince2000());
|
push @postCmds,"++803F$id${dst}0204".sprintf("%02X",CUL_HM_secSince2000());
|
||||||
}
|
}
|
||||||
@ -4404,7 +4418,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
my @chnIdList = CUL_HM_getAssChnIds($name);
|
my @chnIdList = CUL_HM_getAssChnIds($name);
|
||||||
foreach my $channel (@chnIdList){
|
foreach my $channel (@chnIdList){
|
||||||
my $chnNo = substr($channel,6,2);
|
my $chnNo = substr($channel,6,2);
|
||||||
if ($list =~ m/0[34]/){#getPeers to see if list3 is available
|
if ($list =~ m/^0[34]$/){#getPeers to see if list3 is available
|
||||||
CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.$chnNo.'03');
|
CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.$chnNo.'03');
|
||||||
my $chnHash = CUL_HM_id2Hash($channel);
|
my $chnHash = CUL_HM_id2Hash($channel);
|
||||||
$chnHash->{helper}{getCfgList} = $peerID.$peerChn;#list3 regs
|
$chnHash->{helper}{getCfgList} = $peerID.$peerChn;#list3 regs
|
||||||
@ -4683,7 +4697,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
$lvl = $lvlMin + $lvl*($lvlMax-$lvlMin)/100; # relativ to range
|
$lvl = $lvlMin + $lvl*($lvlMax-$lvlMin)/100; # relativ to range
|
||||||
$lvl = ($lvl > $lvlMax)?$lvlMax:(($lvl <= $lvlMin)?0:$lvl);
|
$lvl = ($lvl > $lvlMax)?$lvlMax:(($lvl <= $lvlMin)?0:$lvl);
|
||||||
}
|
}
|
||||||
if ($st =~ m/(dimmer|rgb)/){# at least blind cannot stand ramp time...
|
if ($st =~ m/^(dimmer|rgb)$/){# at least blind cannot stand ramp time...
|
||||||
if (!$a[3]){
|
if (!$a[3]){
|
||||||
$tval = "FFFF";
|
$tval = "FFFF";
|
||||||
$duration = 0;
|
$duration = 0;
|
||||||
@ -4719,7 +4733,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
$state = "set_".$lvl;
|
$state = "set_".$lvl;
|
||||||
CUL_HM_UpdtReadSingle($hash,"level",$state,1);
|
CUL_HM_UpdtReadSingle($hash,"level",$state,1);
|
||||||
}
|
}
|
||||||
elsif($cmd =~ m/(pctSlat|pctLvlSlat)/) { ####################################
|
elsif($cmd =~ m/^(pctSlat|pctLvlSlat)$/) { ##################################
|
||||||
my ($lvl,$slat,$plvl,$pslat);
|
my ($lvl,$slat,$plvl,$pslat);
|
||||||
|
|
||||||
#--- calc slat----
|
#--- calc slat----
|
||||||
@ -4883,7 +4897,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'0'.$color{$a[2]});
|
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.'0'.$color{$a[2]});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($md =~ m/HM-OU-CFM?-PL/){
|
elsif($md =~ m/^HM-OU-CFM?-PL/){
|
||||||
my %color = (redL =>18,greenL =>34,orangeL =>50,
|
my %color = (redL =>18,greenL =>34,orangeL =>50,
|
||||||
redS =>17,greenS =>33,orangeS =>49,
|
redS =>17,greenS =>33,orangeS =>49,
|
||||||
pause=>01);
|
pause=>01);
|
||||||
@ -4907,7 +4921,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
$msgBytes = substr($msgBytes."000000000000000000",0,(10+2)*2);
|
$msgBytes = substr($msgBytes."000000000000000000",0,(10+2)*2);
|
||||||
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.$msgBytes);
|
CUL_HM_PushCmdStack($hash,'++'.$flag.'11'.$id.$dst.'80'.$chn.$msgBytes);
|
||||||
}
|
}
|
||||||
elsif($md =~ m/HM-OU-CFM?-TW/){
|
elsif($md =~ m/^HM-OU-CFM?-TW/){
|
||||||
my %color = (redL =>18,greenL =>34,yellowL =>50,blueL =>66, violettL => 82, cyanL => 98, whiteL =>114,
|
my %color = (redL =>18,greenL =>34,yellowL =>50,blueL =>66, violettL => 82, cyanL => 98, whiteL =>114,
|
||||||
redS =>17,greenS =>33,yellowS =>49,blueS =>65, violettS => 81, cyanS => 97, whiteS =>113,
|
redS =>17,greenS =>33,yellowS =>49,blueS =>65, violettS => 81, cyanS => 97, whiteS =>113,
|
||||||
pause=>2);
|
pause=>2);
|
||||||
@ -5049,7 +5063,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "$a[2] not valid - choose short or long" if($a[2] !~ m/(short|long)/);
|
return "$a[2] not valid - choose short or long" if($a[2] !~ m/^(short|long)$/);
|
||||||
my $type = $a[2] eq "short"?"s":"l";
|
my $type = $a[2] eq "short"?"s":"l";
|
||||||
|
|
||||||
if(!defined $hash->{helper}{dispi}{$type}{"l1"}{d}){# setup if one is missing
|
if(!defined $hash->{helper}{dispi}{$type}{"l1"}{d}){# setup if one is missing
|
||||||
@ -5307,13 +5321,13 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($cmd eq "desired-temp") { #############################################
|
elsif($cmd eq "desired-temp") { #############################################
|
||||||
if ($md =~ m/(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/){
|
if ($md =~ m/^(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/){
|
||||||
my $temp = ($a[2] eq "off")?9:($a[2] eq "on"?61:$a[2]*2);
|
my $temp = ($a[2] eq "off")?9:($a[2] eq "on"?61:$a[2]*2);
|
||||||
return "invalid temp:$a[2]" if($temp <9 ||$temp > 61);
|
return "invalid temp:$a[2]" if($temp <9 ||$temp > 61);
|
||||||
$temp = sprintf ("%02X",$temp);
|
$temp = sprintf ("%02X",$temp);
|
||||||
CUL_HM_PushCmdStack($hash,'++'.$flag."11$id$dst"."8604$temp");
|
CUL_HM_PushCmdStack($hash,'++'.$flag."11$id$dst"."8604$temp");
|
||||||
|
|
||||||
my $idTch = ($md =~ m/HM-CC-RT-DN/ ? $dst."05" : $dst."02");
|
my $idTch = ($md =~ m/^HM-CC-RT-DN/ ? $dst."05" : $dst."02");
|
||||||
my @teamList = ( split(",",AttrVal(CUL_HM_id2Name($dst."05"),"peerIDs","")) # peers of RT team
|
my @teamList = ( split(",",AttrVal(CUL_HM_id2Name($dst."05"),"peerIDs","")) # peers of RT team
|
||||||
,split(",",AttrVal(CUL_HM_id2Name($dst."02"),"peerIDs","")) # peers RT/TC team
|
,split(",",AttrVal(CUL_HM_id2Name($dst."02"),"peerIDs","")) # peers RT/TC team
|
||||||
,CUL_HM_name2Id($name) # myself
|
,CUL_HM_name2Id($name) # myself
|
||||||
@ -5347,7 +5361,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
my $wd = $1;
|
my $wd = $1;
|
||||||
$state= "";
|
$state= "";
|
||||||
my ($list,$addr,$prgChn);
|
my ($list,$addr,$prgChn);
|
||||||
if ($md =~ m/(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/){
|
if ($md =~ m/^(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/){
|
||||||
my %day2off = ( "Sat"=>"20", "Sun"=>"46", "Mon"=>"72", "Tue"=>"98",
|
my %day2off = ( "Sat"=>"20", "Sun"=>"46", "Mon"=>"72", "Tue"=>"98",
|
||||||
"Wed"=>"124","Thu"=>"150","Fri"=>"176");
|
"Wed"=>"124","Thu"=>"150","Fri"=>"176");
|
||||||
($list,$addr,$prgChn) = (7,$day2off{$wd},0);
|
($list,$addr,$prgChn) = (7,$day2off{$wd},0);
|
||||||
@ -5365,13 +5379,13 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
$prep = $a[2];
|
$prep = $a[2];
|
||||||
splice @a,2,1;#remove prep
|
splice @a,2,1;#remove prep
|
||||||
}
|
}
|
||||||
if ($md =~ m/HM-TC-IT-WM-W-EU/ && $a[2] =~ m/^p([123])$/){
|
if ($md =~ m/^HM-TC-IT-WM-W-EU/ && $a[2] =~ m/^p([123])$/){
|
||||||
$list += $1 - 1;
|
$list += $1 - 1;
|
||||||
splice @a,2,1;#remove list
|
splice @a,2,1;#remove list
|
||||||
}
|
}
|
||||||
return "To few arguments" if(@a < 4);
|
return "To few arguments" if(@a < 4);
|
||||||
return "To many arguments, max 13 pairs" if(@a > 28 && $md =~ m/(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/);
|
return "To many arguments, max 13 pairs" if(@a > 28 && $md =~ m/^(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/);
|
||||||
return "To many arguments, max 24 pairs" if(@a > 50 && $md !~ m/(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/);
|
return "To many arguments, max 24 pairs" if(@a > 50 && $md !~ m/^(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/);
|
||||||
return "Bad format, use HH:MM TEMP ..." if(@a % 2);
|
return "Bad format, use HH:MM TEMP ..." if(@a % 2);
|
||||||
return "Last time spec must be 24:00" if($a[@a-2] ne "24:00");
|
return "Last time spec must be 24:00" if($a[@a-2] ne "24:00");
|
||||||
|
|
||||||
@ -5382,7 +5396,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
my ($h, $m) = ($1, $2);
|
my ($h, $m) = ($1, $2);
|
||||||
my ($hByte,$lByte);
|
my ($hByte,$lByte);
|
||||||
my $temp = $a[$idx+1];
|
my $temp = $a[$idx+1];
|
||||||
if ($md =~ m/(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/){
|
if ($md =~ m/^(HM-CC-RT-DN|HM-TC-IT-WM-W-EU)/){
|
||||||
$temp = (int($temp*2)<<9) + ($h*12+($m/5));
|
$temp = (int($temp*2)<<9) + ($h*12+($m/5));
|
||||||
$hByte = $temp>>8;
|
$hByte = $temp>>8;
|
||||||
$lByte = $temp & 0xff;
|
$lByte = $temp & 0xff;
|
||||||
@ -5578,7 +5592,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
CUL_HM_parseSDteam_2("41",$dst,$sId,substr($msg, 18));
|
CUL_HM_parseSDteam_2("41",$dst,$sId,substr($msg, 18));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif($cmd =~ m/alarm(.*)/) { ###############################################
|
elsif($cmd =~ m/^alarm(.*)/) { ##############################################
|
||||||
$state = "";
|
$state = "";
|
||||||
|
|
||||||
my $sId = $roleV ? $dst : $id; # ID of cmd-source must not be a physical
|
my $sId = $roleV ? $dst : $id; # ID of cmd-source must not be a physical
|
||||||
@ -5638,7 +5652,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
elsif($cmd =~ m/press(.*)/) { ###############################################
|
elsif($cmd =~ m/^press(.*)/) { ##############################################
|
||||||
# [long|short] [<peer>] [<repCount(long only)>] [<repDelay>] [<forceTiming[0|1]>] ...
|
# [long|short] [<peer>] [<repCount(long only)>] [<repDelay>] [<forceTiming[0|1]>] ...
|
||||||
my ($repCnt,$repDly,$forceTiming,$mode) = (0,0,0,0);
|
my ($repCnt,$repDly,$forceTiming,$mode) = (0,0,0,0);
|
||||||
if($cmd eq "pressL"){
|
if($cmd eq "pressL"){
|
||||||
@ -5709,7 +5723,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
# on/off: self button - on is even/off odd number. Obey channel
|
# on/off: self button - on is even/off odd number. Obey channel
|
||||||
# name of peer
|
# name of peer
|
||||||
my $pId;
|
my $pId;
|
||||||
if ($vChn =~ m/^(on|off)$/ && $st =~ m/(blindActuator|dimmer)/){
|
if ($vChn =~ m/^(on|off)$/ && $st =~ m/^(blindActuator|dimmer)$/){
|
||||||
$pId = $dst.sprintf("%02X",(($vChn eq "off")?-1:0) + $chn*2);
|
$pId = $dst.sprintf("%02X",(($vChn eq "off")?-1:0) + $chn*2);
|
||||||
}
|
}
|
||||||
elsif($vChn){
|
elsif($vChn){
|
||||||
@ -5891,7 +5905,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
my $peerDst = substr($peerId,0,6);
|
my $peerDst = substr($peerId,0,6);
|
||||||
my $pmd = AttrVal(CUL_HM_id2Name($peerDst), "model" , "");
|
my $pmd = AttrVal(CUL_HM_id2Name($peerDst), "model" , "");
|
||||||
|
|
||||||
if ($md =~ m/HM-CC-RT-DN/ && $chn eq "05" ){# rt team peers cross from 05 to 04
|
if ($md =~ m/^HM-CC-RT-DN/ && $chn eq "05" ){# rt team peers cross from 05 to 04
|
||||||
@pCh = (undef,"04","05");
|
@pCh = (undef,"04","05");
|
||||||
$chn = "04";
|
$chn = "04";
|
||||||
$single = "dual";
|
$single = "dual";
|
||||||
@ -5909,8 +5923,8 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
|
|||||||
return "$set must be set or unset" if($set !~ m/^(set|unset)$/);
|
return "$set must be set or unset" if($set !~ m/^(set|unset)$/);
|
||||||
return "$target must be [actor|remote|both]" if($target !~ m/^(actor|remote|both)$/);
|
return "$target must be [actor|remote|both]" if($target !~ m/^(actor|remote|both)$/);
|
||||||
return "use - single [set|unset] actor - for smoke detector" if( $st eq "smokeDetector" && ($single ne "single" || $target ne "actor"));
|
return "use - single [set|unset] actor - for smoke detector" if( $st eq "smokeDetector" && ($single ne "single" || $target ne "actor"));
|
||||||
return "use - single - for ".$st if(($st =~ m/(threeStateSensor|motionDetector)/) && ($single ne "single"));
|
return "use - single - for ".$st if(($st =~ m/^(threeStateSensor|motionDetector)$/) && ($single ne "single"));
|
||||||
return "TC WindowRec only peers to channel 01 single" if( $pmd =~ m/(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/ && $pCh[1] eq "03" && $chn ne "01" && $set eq "set");
|
return "TC WindowRec only peers to channel 01 single" if( $pmd =~ m/^(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/ && $pCh[1] eq "03" && $chn ne "01" && $set eq "set");
|
||||||
|
|
||||||
my $pSt = CUL_HM_Get($peerHash,$peerHash->{NAME},"param","subType");
|
my $pSt = CUL_HM_Get($peerHash,$peerHash->{NAME},"param","subType");
|
||||||
|
|
||||||
@ -6706,7 +6720,7 @@ sub CUL_HM_responseSetup($$) {#store all we need to handle the response
|
|||||||
$hash->{helper}{prt}{mmcA}=\@arr;
|
$hash->{helper}{prt}{mmcA}=\@arr;
|
||||||
$hash->{helper}{prt}{mmcS} = 1;
|
$hash->{helper}{prt}{mmcS} = 1;
|
||||||
}
|
}
|
||||||
elsif ($sTp =~ m/(07|08)/ && ($mmcS == 1||$mmcS == 2)){
|
elsif ($sTp =~ m/^(07|08)$/ && ($mmcS == 1||$mmcS == 2)){
|
||||||
push @{$hash->{helper}{prt}{mmcA}},$oCmd;
|
push @{$hash->{helper}{prt}{mmcA}},$oCmd;
|
||||||
$hash->{helper}{prt}{mmcS} = 2;
|
$hash->{helper}{prt}{mmcS} = 2;
|
||||||
}
|
}
|
||||||
@ -6850,7 +6864,7 @@ sub CUL_HM_SndCmd($$) {
|
|||||||
CUL_HM_statCnt($ioName,"s");
|
CUL_HM_statCnt($ioName,"s");
|
||||||
CUL_HM_eventP($hash,"Snd");
|
CUL_HM_eventP($hash,"Snd");
|
||||||
CUL_HM_responseSetup($hash,$cmd);
|
CUL_HM_responseSetup($hash,$cmd);
|
||||||
$cmd =~ m/As(..)(..)(..)(..)(......)(......)(.*)/;
|
$cmd =~ m/^As(..)(..)(..)(..)(......)(......)(.*)/;
|
||||||
CUL_HM_DumpProtocol("SND", $io, ($1,$2,$3,$4,$5,$6,$7));
|
CUL_HM_DumpProtocol("SND", $io, ($1,$2,$3,$4,$5,$6,$7));
|
||||||
}
|
}
|
||||||
sub CUL_HM_statCnt($$) {# set msg statistics for (r)ecive (s)end or (u)pdate
|
sub CUL_HM_statCnt($$) {# set msg statistics for (r)ecive (s)end or (u)pdate
|
||||||
@ -7151,7 +7165,7 @@ sub CUL_HM_eventP($$) {#handle protocol events
|
|||||||
my ($evntCnt,undef) = split(' last_at:',$evnt);
|
my ($evntCnt,undef) = split(' last_at:',$evnt);
|
||||||
$hash->{"prot".$evntType} = ++$evntCnt." last_at:".TimeNow();
|
$hash->{"prot".$evntType} = ++$evntCnt." last_at:".TimeNow();
|
||||||
|
|
||||||
if ($evntType =~ m/(Nack|ResndFail|IOerr|dummy)/){# unrecoverable Error
|
if ($evntType =~ m/^(Nack|ResndFail|IOerr|dummy)/){# unrecoverable Error
|
||||||
CUL_HM_UpdtReadSingle($hash,"state",$evntType,1);
|
CUL_HM_UpdtReadSingle($hash,"state",$evntType,1);
|
||||||
$hash->{helper}{prt}{bErr}++;
|
$hash->{helper}{prt}{bErr}++;
|
||||||
$hash->{protCmdDel} = 0 if(!$hash->{protCmdDel});
|
$hash->{protCmdDel} = 0 if(!$hash->{protCmdDel});
|
||||||
@ -7261,9 +7275,9 @@ sub CUL_HM_ID2PeerList ($$$) {
|
|||||||
$tMstr = AttrVal($_,"model","") eq "HM-SEC-SD-2"? 2:1;#differentiate SD and SD2
|
$tMstr = AttrVal($_,"model","") eq "HM-SEC-SD-2"? 2:1;#differentiate SD and SD2
|
||||||
}
|
}
|
||||||
|
|
||||||
$tcSim = 1 if(AttrVal($_,"model","") =~ m/(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/);
|
$tcSim = 1 if(AttrVal($_,"model","") =~ m/^(HM-CC-VD|ROTO_ZEL-STG-RM-FSA)/);
|
||||||
my $pch = (substr(CUL_HM_name2Id($_),6,2));
|
my $pch = (substr(CUL_HM_name2Id($_),6,2));
|
||||||
$thSim = 1 if(AttrVal($_,"model","") =~ m/HM-CC-RT-DN/ && $pch eq "01");
|
$thSim = 1 if(AttrVal($_,"model","") =~ m/^HM-CC-RT-DN/ && $pch eq "01");
|
||||||
}
|
}
|
||||||
if ($tMstr){
|
if ($tMstr){
|
||||||
$hash->{helper}{fkt} = "sdLead".$tMstr;
|
$hash->{helper}{fkt} = "sdLead".$tMstr;
|
||||||
@ -7293,8 +7307,8 @@ sub CUL_HM_ID2PeerList ($$$) {
|
|||||||
delete $hash->{helper}{fkt};
|
delete $hash->{helper}{fkt};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif( ($md =~ m/HM-CC-RT-DN/ && $chn=~ m/(02|05|04)/)
|
elsif( ($md =~ m/^HM-CC-RT-DN/ && $chn =~ m/^(02|05|04)$/)
|
||||||
||($md eq "HM-TC-IT-WM-W-EU" && $chn=~ m/(07)/)){
|
||($md eq "HM-TC-IT-WM-W-EU" && $chn eq "07")){
|
||||||
if ($chn eq "04"){
|
if ($chn eq "04"){
|
||||||
#if 04 is peered we are "teamed" -> set channel 05
|
#if 04 is peered we are "teamed" -> set channel 05
|
||||||
my $ch05H = $modules{CUL_HM}{defptr}{$dHash->{DEF}."05"};
|
my $ch05H = $modules{CUL_HM}{defptr}{$dHash->{DEF}."05"};
|
||||||
@ -7304,8 +7318,8 @@ sub CUL_HM_ID2PeerList ($$$) {
|
|||||||
CUL_HM_UpdtReadSingle($hash,"state","peered",0);
|
CUL_HM_UpdtReadSingle($hash,"state","peered",0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elsif( ($md =~ m/HM-CC-RT-DN/ && $chn=~ m/(03|06)/)
|
elsif( ($md =~ m/^HM-CC-RT-DN/ && $chn =~ m/^(03|06)$/)
|
||||||
||($md eq "HM-TC-IT-WM-W-EU" && $chn=~ m/(03|06)/)){
|
||($md eq "HM-TC-IT-WM-W-EU" && $chn =~ m/^(03|06)$/)){
|
||||||
if (AttrVal($hash,"state","unpeered") eq "unpeered"){
|
if (AttrVal($hash,"state","unpeered") eq "unpeered"){
|
||||||
CUL_HM_UpdtReadSingle($hash,"state","unknown",0);
|
CUL_HM_UpdtReadSingle($hash,"state","unknown",0);
|
||||||
}
|
}
|
||||||
@ -7314,8 +7328,8 @@ sub CUL_HM_ID2PeerList ($$$) {
|
|||||||
else{# no peer set - clean up: delete entries
|
else{# no peer set - clean up: delete entries
|
||||||
delete $hash->{READINGS}{peerList};
|
delete $hash->{READINGS}{peerList};
|
||||||
delete $hash->{peerList};
|
delete $hash->{peerList};
|
||||||
if (($md =~ m/HM-CC-RT-DN/ && $chn=~ m/(02|03|04|05|06)/)
|
if (($md =~ m/^HM-CC-RT-DN/ && $chn=~ m/^(02|03|04|05|06)$/)
|
||||||
||($md eq "HM-TC-IT-WM-W-EU" && $chn=~ m/(03|06|07)/)){
|
||($md eq "HM-TC-IT-WM-W-EU" && $chn=~ m/^(03|06|07)$/)){
|
||||||
if ($chn eq "04"){
|
if ($chn eq "04"){
|
||||||
my $ch05H = $modules{CUL_HM}{defptr}{$dHash->{DEF}."05"};
|
my $ch05H = $modules{CUL_HM}{defptr}{$dHash->{DEF}."05"};
|
||||||
CUL_HM_UpdtReadSingle($ch05H,"state","unpeered") if($ch05H);
|
CUL_HM_UpdtReadSingle($ch05H,"state","unpeered") if($ch05H);
|
||||||
@ -7862,14 +7876,14 @@ sub CUL_HM_updtRegDisp($$$) {
|
|||||||
CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead);
|
CUL_HM_UpdtReadBulk($hash,1,@changedRead) if (@changedRead);
|
||||||
|
|
||||||
# --- handle specifics - Devices with abnormal or long register
|
# --- handle specifics - Devices with abnormal or long register
|
||||||
if ($md =~ m/(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/){#handle temperature readings
|
if ($md =~ m/^(HM-CC-TC|ROTO_ZEL-STG-RM-FWT)/){#handle temperature readings
|
||||||
CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) &&
|
CUL_HM_TCtempReadings($hash) if (($list == 5 ||$list == 6) &&
|
||||||
substr($hash->{DEF},6,2) eq "02");
|
substr($hash->{DEF},6,2) eq "02");
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/HM-CC-RT-DN/){#handle temperature readings
|
elsif ($md =~ m/^HM-CC-RT-DN/){#handle temperature readings
|
||||||
CUL_HM_TCITRTtempReadings($hash,$md,7) if ($list == 7 && $chn eq "04");
|
CUL_HM_TCITRTtempReadings($hash,$md,7) if ($list == 7 && $chn eq "04");
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/HM-TC-IT-WM-W-EU/){#handle temperature readings
|
elsif ($md =~ m/^HM-TC-IT-WM-W-EU/){#handle temperature readings
|
||||||
CUL_HM_TCITRTtempReadings($hash,$md,$list) if ($list >= 7 && $chn eq "02");
|
CUL_HM_TCITRTtempReadings($hash,$md,$list) if ($list >= 7 && $chn eq "02");
|
||||||
}
|
}
|
||||||
elsif ($md =~ m/(^HM-PB-4DIS-WM|HM-Dis-WM55|HM-Dis-EP-WM55|HM-RC-Dis-H-x-EU|ROTO_ZEL-STG-RM-DWT-10)/){#add text
|
elsif ($md =~ m/(^HM-PB-4DIS-WM|HM-Dis-WM55|HM-Dis-EP-WM55|HM-RC-Dis-H-x-EU|ROTO_ZEL-STG-RM-DWT-10)/){#add text
|
||||||
@ -8534,12 +8548,13 @@ sub CUL_HM_ActCheck($) {# perform supervision
|
|||||||
? ($actHash->{helper}{$devId}{try} +1)
|
? ($actHash->{helper}{$devId}{try} +1)
|
||||||
: 1;
|
: 1;
|
||||||
my $cmds = CUL_HM_Set($defs{$devName},$devName,"help");
|
my $cmds = CUL_HM_Set($defs{$devName},$devName,"help");
|
||||||
if ($cmds =~ m/(statusRequest|getSerial)/){
|
if ($cmds =~ m/^(statusRequest|getSerial)/){
|
||||||
# send statusrequest if possible
|
# send statusrequest if possible
|
||||||
CUL_HM_Set($defs{$devName},$devName,
|
CUL_HM_Set($defs{$devName},$devName,
|
||||||
($cmds =~ m/statusRequest/?"statusRequest"
|
($cmds =~ m/^statusRequest/ ? "statusRequest"
|
||||||
:"getSerial" ));
|
: "getSerial" ));
|
||||||
$state = $oldState eq "unset" ? "unknown" : $oldState;
|
$state = $oldState eq "unset" ? "unknown"
|
||||||
|
: $oldState;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$actHash->{helper}{$devId}{try} = 99;
|
$actHash->{helper}{$devId}{try} = 99;
|
||||||
@ -8732,6 +8747,7 @@ sub CUL_HM_storeRssi(@){
|
|||||||
$rssiP->{min} = $val if (!$rssiP->{min} || $rssiP->{min} > $val);
|
$rssiP->{min} = $val if (!$rssiP->{min} || $rssiP->{min} > $val);
|
||||||
$rssiP->{max} = $val if (!$rssiP->{max} || $rssiP->{max} < $val);
|
$rssiP->{max} = $val if (!$rssiP->{max} || $rssiP->{max} < $val);
|
||||||
$rssiP->{cnt} ++;
|
$rssiP->{cnt} ++;
|
||||||
|
$rssiP->{cnt} = 10000 if(!$rssiP->{cnt}); # avoid division by zero on overflow!
|
||||||
if ($rssiP->{cnt} == 1){
|
if ($rssiP->{cnt} == 1){
|
||||||
$rssiP->{avg} = $val;
|
$rssiP->{avg} = $val;
|
||||||
}
|
}
|
||||||
@ -8795,7 +8811,8 @@ sub CUL_HM_UpdtCentral($){
|
|||||||
CUL_HM_ID2PeerList ($ccuChnName,unpack('A8',CUL_HM_name2Id($pn)."01"),1);
|
CUL_HM_ID2PeerList ($ccuChnName,unpack('A8',CUL_HM_name2Id($pn)."01"),1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
my @ioList = split(",",AttrVal($name,"IOList",""));# prepare array for quick access
|
|
||||||
|
my @ioList = grep /.+/,map{$defs{$_} ? $_ : ""} split(",",AttrVal($name,"IOList",""));
|
||||||
$defs{$name}{helper}{io}{ioList} = \@ioList;
|
$defs{$name}{helper}{io}{ioList} = \@ioList;
|
||||||
my $io = AttrVal($name,"IODev","empty");# assign IODev to vccu
|
my $io = AttrVal($name,"IODev","empty");# assign IODev to vccu
|
||||||
if (AttrVal($name,"IOList","") !~ m/$io/){
|
if (AttrVal($name,"IOList","") !~ m/$io/){
|
||||||
@ -8818,6 +8835,7 @@ sub CUL_HM_UpdtCentralState($){
|
|||||||
$state .= "$e:UAS," if (!grep /$e/,@IOl);
|
$state .= "$e:UAS," if (!grep /$e/,@IOl);
|
||||||
}
|
}
|
||||||
foreach my $ioN (@IOl){
|
foreach my $ioN (@IOl){
|
||||||
|
next if (!defined($defs{$ioN})); # remove undefined IO devices
|
||||||
my $cnd = ReadingsVal($ioN,"cond","");
|
my $cnd = ReadingsVal($ioN,"cond","");
|
||||||
if ($cnd){ # covering all HMLAN/USB
|
if ($cnd){ # covering all HMLAN/USB
|
||||||
$state .= "$ioN:$cnd,";
|
$state .= "$ioN:$cnd,";
|
||||||
@ -8842,44 +8860,64 @@ sub CUL_HM_assignIO($){ #check and assign IO
|
|||||||
&& defined $hash->{IODev})){#don't change while send in process
|
&& defined $hash->{IODev})){#don't change while send in process
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
my $oldIODev = $hash->{IODev} ? $hash->{IODev} : "";
|
||||||
|
my $newIODev = "";
|
||||||
|
my $haveIOList = 0;
|
||||||
my $ioCCU = $hash->{helper}{io}{vccu};
|
my $ioCCU = $hash->{helper}{io}{vccu};
|
||||||
|
|
||||||
if ( $ioCCU
|
if ( $ioCCU
|
||||||
&& defined $defs{$ioCCU} && AttrVal($ioCCU,"model","") eq "CCU-FHEM"
|
&& defined $defs{$ioCCU}
|
||||||
|
&& AttrVal($ioCCU,"model","") eq "CCU-FHEM"
|
||||||
&& ref($defs{$ioCCU}{helper}{io}{ioList}) eq 'ARRAY'){
|
&& ref($defs{$ioCCU}{helper}{io}{ioList}) eq 'ARRAY'){
|
||||||
|
$haveIOList = 1;
|
||||||
my @ioccu = @{$defs{$ioCCU}{helper}{io}{ioList}};
|
my @ioccu = @{$defs{$ioCCU}{helper}{io}{ioList}};
|
||||||
my @ios = ((sort {$hash->{helper}{mRssi}{io}{$b} <=>
|
my @ios = ((sort {$hash->{helper}{mRssi}{io}{$b} <=>
|
||||||
$hash->{helper}{mRssi}{io}{$a} }
|
$hash->{helper}{mRssi}{io}{$a} }
|
||||||
grep {defined $hash->{helper}{mRssi}{io}{$_}} @ioccu)
|
grep {defined $hash->{helper}{mRssi}{io}{$_}} @ioccu)
|
||||||
,(grep {!defined $hash->{helper}{mRssi}{io}{$_}} @ioccu));
|
,(grep {!defined $hash->{helper}{mRssi}{io}{$_}} @ioccu));
|
||||||
unshift @ios,@{$hash->{helper}{io}{prefIO}} if ($hash->{helper}{io}{prefIO});# set prefIO to first choice
|
unshift @ios,@{$hash->{helper}{io}{prefIO}} if ($hash->{helper}{io}{prefIO});# set prefIO to first choice
|
||||||
|
|
||||||
foreach my $iom (@ios){
|
foreach my $iom (@ios){
|
||||||
last if ($iom eq "none"); # if "none" is detected stop vccu auto assignment and try normal
|
last if ($iom eq "none"); # if "none" is detected stop vccu auto assignment and try normal
|
||||||
if ( !$defs{$iom}
|
next if ( !$defs{$iom}
|
||||||
|| ReadingsVal($iom,"state","") eq "disconnected"
|
|| ReadingsVal($iom,"state","") eq "disconnected"
|
||||||
|| InternalVal($iom,"XmitOpen",1) == 0){# HMLAN/HMUSB/TSCUL?
|
|| InternalVal($iom,"XmitOpen",1) == 0); # HMLAN/HMUSB/TSCUL?
|
||||||
next;
|
|
||||||
}
|
$newIODev = $defs{$iom};# suitable CCU IO found - continue to assign
|
||||||
if ( $hash->{IODev}
|
last;
|
||||||
&& $hash->{IODev} ne $defs{$iom}
|
|
||||||
&& $hash->{IODev}->{TYPE}
|
|
||||||
&& ( $hash->{IODev}->{helper}{VTS_AES} # for TSCUL VTS0.14 up
|
|
||||||
|| $hash->{IODev}->{TYPE} =~ m/^(HMLAN|HMUARTLGW)$/ ) ) {#if recent io is HMLAN and we have to remove the device from IO
|
|
||||||
IOWrite($hash, "", "remove:".CUL_HM_hash2Id($hash));
|
|
||||||
}
|
|
||||||
$hash->{IODev} = $defs{$iom};
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# not assigned thru CCU - try normal
|
|
||||||
my $dIo = AttrVal($hash->{NAME},"IODev","");
|
if (!$newIODev) {# not assigned thru CCU - try normal
|
||||||
if ($defs{$dIo}){
|
my $dIo = AttrVal($hash->{NAME},"IODev","");
|
||||||
if(!defined($hash->{IODev}->{NAME}) || ($dIo ne $hash->{IODev}->{NAME})){
|
if ( $defs{$dIo}
|
||||||
$hash->{IODev} = $defs{$dIo};
|
&&(!$oldIODev || $dIo ne $oldIODev->{NAME})) {
|
||||||
|
$newIODev = $defs{$dIo}; # assign according to Attribut
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AssignIoPort($hash); #let kernal decide
|
||||||
|
$newIODev = $hash->{IODev};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
AssignIoPort($hash);#let kernal decide
|
if ($oldIODev ne $newIODev) {# have a change - Assign the device at IO and remove from old one
|
||||||
|
my $ID = CUL_HM_hash2Id($hash);
|
||||||
|
|
||||||
|
if ( $oldIODev ne $newIODev
|
||||||
|
&& ReadingsVal($oldIODev->{NAME},"state","") ne "disconnected"
|
||||||
|
# && InternalVal($oldIODev->{NAME},"XmitOpen",1) != 0
|
||||||
|
&&( $oldIODev->{helper}{VTS_AES} #if this unselected IO is TSCUL 0.14+ we have to remove the device from IO
|
||||||
|
|| ( $oldIODev->{TYPE} && $oldIODev->{TYPE} =~ m/^(HMLAN|HMUARTLGW)$/ ))) {#if this unselected IO is HMLAN we have to remove the device from IO
|
||||||
|
IOWrite($hash, "", "remove:".$ID); # remove assignment from old IO
|
||||||
|
}
|
||||||
|
|
||||||
|
$hash->{IODev} = $newIODev; # finally assign IO
|
||||||
|
|
||||||
|
if ( $newIODev->{TYPE} && $newIODev->{TYPE} =~ m/^(HMLAN|HMUARTLGW)$/ #if selected IO IO is HMLAN we have to set the device in IO
|
||||||
|
|| ( $newIODev->{helper}{VTS_AES}
|
||||||
|
&& $hash->{helper}{io}{newChn})){
|
||||||
|
IOWrite($hash, "", "init:".$ID); # assign to new IO
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9377,7 +9415,7 @@ sub CUL_HM_tempListTmpl(@) { ##################################################
|
|||||||
$dlf{$prg}{$dayTxt} = 1;
|
$dlf{$prg}{$dayTxt} = 1;
|
||||||
my $day = $dl{$dayTxt};
|
my $day = $dl{$dayTxt};
|
||||||
$tln =~ s/tempList/${day}_tempList/ if ($tln !~ m/_[0-6]_/);
|
$tln =~ s/tempList/${day}_tempList/ if ($tln !~ m/_[0-6]_/);
|
||||||
if (AttrVal($name,"model","") =~ m/HM-TC-IT-WM-W/){
|
if (AttrVal($name,"model","") =~ m/^HM-TC-IT-WM-W/){
|
||||||
$tln =~ s/^R_/R_P1_/ if ($tln !~ m/^R_P/);# add P1 as default
|
$tln =~ s/^R_/R_P1_/ if ($tln !~ m/^R_P/);# add P1 as default
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user