2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-20 01:06:04 +00:00

TC controlmode manu, change of reading handling in parse

git-svn-id: https://svn.fhem.de/fhem/trunk@5016 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2014-02-22 08:25:23 +00:00
parent a4af044d2c
commit dd5909b064
2 changed files with 158 additions and 151 deletions

View File

@ -117,6 +117,7 @@ my $respRemoved; # used to control trigger of stack processing
my $IOpoll = 0.2;# poll speed to scan IO device out of order my $IOpoll = 0.2;# poll speed to scan IO device out of order
my $maxPendCmds = 10; #number of parallel requests my $maxPendCmds = 10; #number of parallel requests
my @evtEt = (); #readings for entities. Format hash:trigger:reading:value
# need to take care that ACK is first # need to take care that ACK is first
#+++++++++++++++++ startup, init, definition+++++++++++++++++++++++++++++++++++ #+++++++++++++++++ startup, init, definition+++++++++++++++++++++++++++++++++++
@ -698,9 +699,9 @@ sub CUL_HM_Parse($$) {#########################################################
my $ioName = $iohash->{NAME}; my $ioName = $iohash->{NAME};
CUL_HM_statCnt($ioName,"r"); CUL_HM_statCnt($ioName,"r");
my $dname = ($dst eq "000000") ? "broadcast" : my $dname = ($dst eq "000000") ? "broadcast" :
($dhash ? $dhash->{NAME} : ($dhash ? $dhash->{NAME} :
($dst eq $id ? $ioName : ($dst eq $id ? $ioName :
$dst)); $dst));
if(!$shash && $mTp eq "00") { # generate device if(!$shash && $mTp eq "00") { # generate device
my $md = substr($p, 2, 4); my $md = substr($p, 2, 4);
$md = $culHmModel->{$md}{name} ? $md = $culHmModel->{$md}{name} ?
@ -718,6 +719,7 @@ sub CUL_HM_Parse($$) {#########################################################
} }
my @entities = ("global"); #additional entities with events to be notifies my @entities = ("global"); #additional entities with events to be notifies
my @event; #readings for main entity reading:value
#################### attack alarm detection##################### #################### attack alarm detection#####################
if ( $dhash if ( $dhash
&& !CUL_HM_getAttrInt($dname,"ignore") && !CUL_HM_getAttrInt($dname,"ignore")
@ -726,7 +728,7 @@ sub CUL_HM_Parse($$) {#########################################################
if($ioId ne $src){ if($ioId ne $src){
CUL_HM_eventP($dhash,"ErrIoId_$src"); CUL_HM_eventP($dhash,"ErrIoId_$src");
my ($evntCnt,undef) = split(' last_at:',$dhash->{"prot"."ErrIoId_$src"},2); my ($evntCnt,undef) = split(' last_at:',$dhash->{"prot"."ErrIoId_$src"},2);
push @entities,CUL_HM_UpdtReadSingle($dhash,"sabotageAttackId","ErrIoId_$src cnt:$evntCnt",1); push @evtEt,[$dhash,1,"sabotageAttackId:ErrIoId_$src cnt:$evntCnt"];
} }
if( defined $dhash->{helper}{cSnd} && if( defined $dhash->{helper}{cSnd} &&
@ -734,30 +736,30 @@ sub CUL_HM_Parse($$) {#########################################################
Log3 $dname,5,"CUL_HM $dname attack:$dhash->{helper}{cSnd}:".substr($msg,7)."."; Log3 $dname,5,"CUL_HM $dname attack:$dhash->{helper}{cSnd}:".substr($msg,7).".";
CUL_HM_eventP($dhash,"ErrIoAttack"); CUL_HM_eventP($dhash,"ErrIoAttack");
my ($evntCnt,undef) = split(' last_at:',$dhash->{"prot"."ErrIoAttack"},2); my ($evntCnt,undef) = split(' last_at:',$dhash->{"prot"."ErrIoAttack"},2);
push @entities,CUL_HM_UpdtReadSingle($dhash,"sabotageAttack","ErrIoAttack cnt:$evntCnt",1); push @evtEt,[$dhash,1,"sabotageAttack:ErrIoAttack cnt:$evntCnt"];
} }
} }
########### ###########
# return "" if($src eq $id);# mirrored messages - covered by !$shash # return "" if($src eq $id);# mirrored messages - covered by !$shash
return @entities if(!$shash); # Unknown source return (CUL_HM_pushEvnts(),@entities) if(!$shash); # Unknown source
$respRemoved = 0; #set to 'no response in this message' at start $respRemoved = 0; #set to 'no response in this message' at start
my @event; #events to be posted for main entity
my $name = $shash->{NAME}; my $name = $shash->{NAME};
my $ioId = CUL_HM_Id($devH->{IODev}); my $ioId = CUL_HM_Id($devH->{IODev});
$ioId = $id if(!$ioId); $ioId = $id if(!$ioId);
return (@entities,$name) if (CUL_HM_getAttrInt($name,"ignore")); return (CUL_HM_pushEvnts(),$name,@entities) if (CUL_HM_getAttrInt($name,"ignore"));
if ($msgStat){ if ($msgStat){
if ($msgStat =~ m/AESKey/){ if ($msgStat =~ m/AESKey/){
push @entities,CUL_HM_UpdtReadSingle($shash,"aesKeyNbr",substr($msgStat,7),1); push @evtEt,[$shash,1,"aesKeyNbr:".substr($msgStat,7)];
$msgStat = ""; # already processed $msgStat = ""; # already processed
} }
elsif($msgStat =~ m/AESCom/){# AES communication to central elsif($msgStat =~ m/AESCom/){# AES communication to central
push @entities,CUL_HM_UpdtReadSingle($shash,"aesCommToDev",substr($msgStat,7),1); push @evtEt,[$shash,1,"aesCommToDev:".substr($msgStat,7)];
return;
} }
} }
CUL_HM_eventP($shash,"Evt_$msgStat")if ($msgStat);#log io-events CUL_HM_eventP($shash,"Evt_$msgStat")if ($msgStat);#log io-events
@ -770,6 +772,7 @@ sub CUL_HM_Parse($$) {#########################################################
"at_".((hex($mFlg)&0x40)?"rpt_":"").$ioName,# repeater? "at_".((hex($mFlg)&0x40)?"rpt_":"").$ioName,# repeater?
$myRSSI); $myRSSI);
# +++++ check for duplicate or repeat ++++
my $msgX = "No:$mNo - t:$mTp s:$src d:$dst ".($p?$p:""); my $msgX = "No:$mNo - t:$mTp s:$src d:$dst ".($p?$p:"");
if($mTp ne "00" && if($mTp ne "00" &&
$devH->{lastMsg} && $devH->{lastMsg} eq $msgX) { #duplicate -lost 'ack'? $devH->{lastMsg} && $devH->{lastMsg} eq $msgX) { #duplicate -lost 'ack'?
@ -789,7 +792,7 @@ sub CUL_HM_Parse($$) {#########################################################
else{ else{
Log3 $name,4,"CUL_HM $name dupe: dont process"; Log3 $name,4,"CUL_HM $name dupe: dont process";
} }
return (@entities,$name); #return something to please dispatcher return (CUL_HM_pushEvnts(),$name,@entities); #return something to please dispatcher
} }
$shash->{lastMsg} = $msgX; $shash->{lastMsg} = $msgX;
delete $shash->{helper}{rpt};# new message, rm recent ack delete $shash->{helper}{rpt};# new message, rm recent ack
@ -803,7 +806,7 @@ sub CUL_HM_Parse($$) {#########################################################
push @event, "" if($parse eq "parsed"); # msg is parsed but may push @event, "" if($parse eq "parsed"); # msg is parsed but may
# be processed further # be processed further
foreach my $r (split";",$parse){ foreach my $r (split";",$parse){
if ($r =~ s/entities://){#common generated trigger for some entities if ($r =~ s/entities:// ){#common generated trigger for some entities
push @entities,split(",",$r); push @entities,split(",",$r);
} }
else{ else{
@ -861,10 +864,11 @@ sub CUL_HM_Parse($$) {#########################################################
my ( $t, $h) = (hex($1), hex($2));# temp is 15 bit signed my ( $t, $h) = (hex($1), hex($2));# temp is 15 bit signed
$t = sprintf("%2.1f",($t & 0x3fff)/10*(($t & 0x4000)?-1:1)); $t = sprintf("%2.1f",($t & 0x3fff)/10*(($t & 0x4000)?-1:1));
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn}; my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
push @entities,CUL_HM_UpdtReadBulk($chnHash,1,"state:T: $t H: $h", if ($chnHash){
"measured-temp:$t", push @evtEt,[$chnHash,1,"state:T: $t H: $h"];
"humidity:$h") push @evtEt,[$chnHash,1,"measured-temp:$t"];
if ($chnHash); push @evtEt,[$chnHash,1,"humidity:$h"];
}
push @event, "state:T: $t H: $h"; push @event, "state:T: $t H: $h";
push @event, "measured-temp:$t"; push @event, "measured-temp:$t";
push @event, "humidity:$h"; push @event, "humidity:$h";
@ -876,7 +880,7 @@ sub CUL_HM_Parse($$) {#########################################################
$vp = int($vp/2.56+0.5); # valve position in % $vp = int($vp/2.56+0.5); # valve position in %
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn}; my $chnHash = $modules{CUL_HM}{defptr}{$src.$chn};
if($chnHash){ if($chnHash){
push @entities,CUL_HM_UpdtReadSingle($chnHash,"state","$vp %",1); push @evtEt,[$chnHash,1,"state:$vp %"];
if ($chnHash->{helper}{needUpdate}){ if ($chnHash->{helper}{needUpdate}){
if ($chnHash->{helper}{needUpdate} == 1){ if ($chnHash->{helper}{needUpdate} == 1){
$chnHash->{helper}{needUpdate}++; $chnHash->{helper}{needUpdate}++;
@ -890,10 +894,10 @@ sub CUL_HM_Parse($$) {#########################################################
push @event, "actuator:$vp %"; push @event, "actuator:$vp %";
# Set the valve state too, without an extra trigger # Set the valve state too, without an extra trigger
push @entities,CUL_HM_UpdtReadBulk($dhash,1, if($dhash){
"state:set_$vp %", push @evtEt,[$dhash,1,"state:set_$vp %" ];
"ValveDesired:$vp %") push @evtEt,[$dhash,1,"ValveDesired:$vp %"];
if($dhash); }
} }
elsif(($mTp eq '02' &&$sType eq '01')|| # ackStatus elsif(($mTp eq '02' &&$sType eq '01')|| # ackStatus
($mTp eq '10' &&$sType eq '06')){ # infoStatus ($mTp eq '10' &&$sType eq '06')){ # infoStatus
@ -906,8 +910,8 @@ sub CUL_HM_Parse($$) {#########################################################
if($chnHash){ if($chnHash){
my $chnName = $chnHash->{NAME}; my $chnName = $chnHash->{NAME};
my $mode = ReadingsVal($chnName,"R-controlMode",""); my $mode = ReadingsVal($chnName,"R-controlMode","");
push @entities,CUL_HM_UpdtReadSingle($chnHash,"desired-temp",$dTemp,1); push @evtEt,[$chnHash,1,"desired-temp:$dTemp"];
CUL_HM_UpdtReadSingle($chnHash,"desired-temp-manu",$dTemp,1) if($mode =~ m /manual/ && $mTp eq '10'); push @evtEt,[$chnHash,1,"desired-temp-manu:$dTemp"] if($mode =~ m /manual/ && $mTp eq '10');
# readingsSingleUpdate($chnHash,"desired-temp-cent",$dTemp,1) if($mode =~ m /central/ && $mTp eq '02'); # readingsSingleUpdate($chnHash,"desired-temp-cent",$dTemp,1) if($mode =~ m /central/ && $mTp eq '02');
# removed - shall not be changed automatically - change is only temporary # removed - shall not be changed automatically - change is only temporary
# CUL_HM_Set($chnHash,$chnName,"desired-temp",$dTemp) if($mode =~ m /central/ && $mTp eq '10'); # CUL_HM_Set($chnHash,$chnName,"desired-temp",$dTemp) if($mode =~ m /central/ && $mTp eq '10');
@ -929,7 +933,7 @@ sub CUL_HM_Parse($$) {#########################################################
$dTemp = ReadingsVal($chnName,"desired-temp-cent",$dTemp)if ($mode =~ m /central/); $dTemp = ReadingsVal($chnName,"desired-temp-cent",$dTemp)if ($mode =~ m /central/);
$chnHash->{helper}{oldMode} = $mode; $chnHash->{helper}{oldMode} = $mode;
} }
push @entities,CUL_HM_UpdtReadSingle($chnHash,"desired-temp",$dTemp,1); push @evtEt,[$chnHash,1,"desired-temp:$dTemp"];
} }
push @event, "desired-temp:" .$dTemp; push @event, "desired-temp:" .$dTemp;
} }
@ -938,9 +942,8 @@ sub CUL_HM_Parse($$) {#########################################################
my ( $of, $vep) = (hex($1), hex($2)); my ( $of, $vep) = (hex($1), hex($2));
push @event, "ValveErrorPosition_for_$dname: $vep %"; push @event, "ValveErrorPosition_for_$dname: $vep %";
push @event, "ValveOffset_for_$dname: $of %"; push @event, "ValveOffset_for_$dname: $of %";
push @entities, push @evtEt,[$dhash,1,"ValveErrorPosition:set_$vep %"];
CUL_HM_UpdtReadBulk($dhash,1,'ValveErrorPosition:set_'.$vep.' %', push @evtEt,[$dhash,1,"ValveOffset:set_$of %"];
'ValveOffset:set_'.$of.' %');
} }
elsif($p =~ m/^010[56]/){ # 'prepare to set' or 'end set' elsif($p =~ m/^010[56]/){ # 'prepare to set' or 'end set'
push @event,""; # push @event,""; #
@ -1027,13 +1030,11 @@ sub CUL_HM_Parse($$) {#########################################################
#push @event, "unknown0:$uk0"; #push @event, "unknown0:$uk0";
#push @event, "unknown1:".$2 if ($p =~ m/^0A(.10)(.*)/); #push @event, "unknown1:".$2 if ($p =~ m/^0A(.10)(.*)/);
push @event, "state:T: $actTemp desired: $setTemp valve: $vp %"; push @event, "state:T: $actTemp desired: $setTemp valve: $vp %";
push @entities,CUL_HM_UpdtReadBulk($dHash,1 push @evtEt,[$dHash,1,"battery:".($err&0x80?"low":"ok")];
,"battery:".($err&0x80?"low":"ok") push @evtEt,[$dHash,1,"batteryLevel:$bat V"];
,"batteryLevel:$bat V" push @evtEt,[$dHash,1,"measured-temp:$actTemp"];
,"measured-temp:$actTemp" # values to please HCS push @evtEt,[$dHash,1,"desired-temp:$setTemp"];
,"desired-temp:$setTemp" push @evtEt,[$dHash,1,"actuator:$vp %"];
,"actuator:$vp %"
);
} }
elsif($mTp eq "59" && $p =~ m/^(..)/) {#inform team about new value elsif($mTp eq "59" && $p =~ m/^(..)/) {#inform team about new value
my $setTemp = int(hex($1)/4)/2; my $setTemp = int(hex($1)/4)/2;
@ -1042,12 +1043,11 @@ sub CUL_HM_Parse($$) {#########################################################
push @event, "mode:$ctlTbl{$ctrlMode}"; push @event, "mode:$ctlTbl{$ctrlMode}";
my $tHash = $modules{CUL_HM}{defptr}{$dst."04"}; my $tHash = $modules{CUL_HM}{defptr}{$dst."04"};
push @entities,CUL_HM_UpdtReadBulk($tHash,1 if ($tHash){
,"desired-temp:$setTemp" push @evtEt,[$tHash,1,"desired-temp:$setTemp"];
,"mode:$ctlTbl{$ctrlMode}" push @evtEt,[$tHash,1,"mode:$ctlTbl{$ctrlMode}"];
)
if ($tHash);
} }
}
elsif($mTp eq "3F" && $ioId eq $dst) { # Timestamp request elsif($mTp eq "3F" && $ioId eq $dst) { # Timestamp request
my $s2000 = sprintf("%02X", CUL_HM_secSince2000()); my $s2000 = sprintf("%02X", CUL_HM_secSince2000());
push @ack,$shash,"++803F$ioId${src}0204$s2000"; push @ack,$shash,"++803F$ioId${src}0204$s2000";
@ -1077,12 +1077,10 @@ sub CUL_HM_Parse($$) {#########################################################
push @event, "desired-temp:$setTemp"; push @event, "desired-temp:$setTemp";
push @event, "mode:$ctlTbl{$ctrlMode}"; push @event, "mode:$ctlTbl{$ctrlMode}";
push @event, "state:T: $actTemp desired: $setTemp"; push @event, "state:T: $actTemp desired: $setTemp";
push @entities,CUL_HM_UpdtReadBulk($dHash,1 push @evtEt,[$dHash,1,"battery:".($lbat?"low":"ok")];
,"battery:".($lbat?"low":"ok") push @evtEt,[$dHash,1,"batteryLevel:$bat V"];
,"batteryLevel:$bat V" push @evtEt,[$dHash,1,"measured-temp:$actTemp"];
,"measured-temp:$actTemp" # values to please HCS push @evtEt,[$dHash,1,"desired-temp:$setTemp"];
,"desired-temp:$setTemp"
);
} }
elsif($mTp eq "70"){ elsif($mTp eq "70"){
my $chn = "01"; my $chn = "01";
@ -1167,19 +1165,19 @@ sub CUL_HM_Parse($$) {#########################################################
my $chn; my $chn;
if ($md =~ m/^(WS550|WS888|HM-WDC7000)/){$chn = "10"} if ($md =~ m/^(WS550|WS888|HM-WDC7000)/){$chn = "10"}
elsif ($md eq "HM-WDS30-OT2-SM") {$chn = "05"} elsif ($md eq "HM-WDS30-OT2-SM") {$chn = "05"}
else {$chn = "01"} else {$chn = "01"}
my ($d1,$h,$ap) = map{hex($_)} unpack 'A4A2A4',$p; my ($d1,$h,$ap) = map{hex($_)} unpack 'A4A2A4',$p;
my $t = $d1 & 0x7fff; my $t = $d1 & 0x7fff;
$t -= 0x8000 if($t &0x4000); $t -= 0x8000 if($t &0x4000);
$t = sprintf("%0.1f", $t/10); $t = sprintf("%0.1f", $t/10);
my $statemsg = "state:T: $t"; my $statemsg = "state:T: $t";
push @event, "temperature:$t";#temp is always there push @event, "temperature:$t";#temp is always there
push @event, "battery:".($d1 & 0x8000?"low":"ok"); push @event, "battery:".($d1 & 0x8000?"low":"ok");
if($modules{CUL_HM}{defptr}{$src.$chn}){ if($modules{CUL_HM}{defptr}{$src.$chn}){
push @entities,CUL_HM_UpdtReadBulk($modules{CUL_HM}{defptr}{$src.$chn} my $ch = $modules{CUL_HM}{defptr}{$src.$chn};
,1,$statemsg push @evtEt,[$ch,1,$statemsg];
,"temperature:$t") push @evtEt,[$ch,1,"temperature:$t"];
} }
if ($h) {$statemsg .= " H: $h" ; push @event, "humidity:$h"; } if ($h) {$statemsg .= " H: $h" ; push @event, "humidity:$h"; }
if ($ap){$statemsg .= " AP: $ap"; push @event, "airpress:$ap";} if ($ap){$statemsg .= " AP: $ap"; push @event, "airpress:$ap";}
push @event, $statemsg; push @event, $statemsg;
@ -1195,9 +1193,8 @@ sub CUL_HM_Parse($$) {#########################################################
my $chId = sprintf("%02X",hex($a) & 0x3f); my $chId = sprintf("%02X",hex($a) & 0x3f);
my $chnHash = $modules{CUL_HM}{defptr}{$src.$chId}; my $chnHash = $modules{CUL_HM}{defptr}{$src.$chId};
if ($chnHash){ if ($chnHash){
push @entities,CUL_HM_UpdtReadBulk($chnHash,1 push @evtEt,[$chnHash,1,"state:T: $d"];
,"state:T: $d" push @evtEt,[$chnHash,1,"temperature:$d"];
,"temperature:$d");
} }
else{ else{
push @event, "Chan_$chId:T: $d"; push @event, "Chan_$chId:T: $d";
@ -1235,12 +1232,11 @@ sub CUL_HM_Parse($$) {#########################################################
$shash->{helper}{lastRain} = $tn; $shash->{helper}{lastRain} = $tn;
} }
elsif ($val eq "dry" && $shash->{helper}{lastRain}){ elsif ($val eq "dry" && $shash->{helper}{lastRain}){
CUL_HM_UpdtReadSingle($shash,'lastRain',$shash->{helper}{lastRain},0); push @evtEt,[$shash,0,"lastRain:$shash->{helper}{lastRain}"];
delete $shash->{helper}{lastRain}; delete $shash->{helper}{lastRain};
} }
CUL_HM_UpdtReadSingle($shash,'.level',#store level invisible push @evtEt,[$shash,0,'.level:'.($val eq "off"?"0 %":"100 %")];
($val eq "off"?"0 %":"100 %"),0);
if ($mNo eq "00" && $chn eq "02" && $val eq "on"){ if ($mNo eq "00" && $chn eq "02" && $val eq "on"){
$hHash->{helper}{pOn} = 1; $hHash->{helper}{pOn} = 1;
@ -1273,7 +1269,7 @@ sub CUL_HM_Parse($$) {#########################################################
delete $shash->{helper}{pOn}; delete $shash->{helper}{pOn};
} }
if ($pon){# we have power ON, perform action if ($pon){# we have power ON, perform action
push @entities,CUL_HM_UpdtReadSingle($devHash,'powerOn',"-",1); push @evtEt,[$devHash,1,'powerOn:-',];
CUL_HM_Set($hHash,$hHash->{NAME},"off") CUL_HM_Set($hHash,$hHash->{NAME},"off")
if ($hHash && $hHash->{helper}{param}{offAtPon}); if ($hHash && $hHash->{helper}{param}{offAtPon});
} }
@ -1303,8 +1299,8 @@ sub CUL_HM_Parse($$) {#########################################################
my $vl = ReadingsVal($vh->{NAME},"level","???"); my $vl = ReadingsVal($vh->{NAME},"level","???");
my $vs = ($vl eq "100 %"?"on":($vl eq "0 %"?"off":"$vl")); my $vs = ($vl eq "100 %"?"on":($vl eq "0 %"?"off":"$vl"));
$vs = (($pl." %") ne $vl)?"chn:$vs phys:$pl %":$vs; $vs = (($pl." %") ne $vl)?"chn:$vs phys:$pl %":$vs;
push @entities,CUL_HM_UpdtReadBulk($vh ,1,"state:$vs", push @evtEt,[$vh,1,"state:$vs"];
"phyLevel:$pl %"); push @evtEt,[$vh,1,"phyLevel:$pl %"];
} }
push @event,"phyLevel:$pl %"; #phys level push @event,"phyLevel:$pl %"; #phys level
$physLvl = $pl." %"; $physLvl = $pl." %";
@ -1372,11 +1368,10 @@ sub CUL_HM_Parse($$) {#########################################################
push @event,"powerOn" if($chn eq "03"); push @event,"powerOn" if($chn eq "03");
} }
elsif ($md eq "HM-SEC-SFA-SM"){ # && $chn eq "00") elsif ($md eq "HM-SEC-SFA-SM"){ # && $chn eq "00")
push @entities, my $h = CUL_HM_getDeviceHash($shash);
CUL_HM_UpdtReadBulk(CUL_HM_getDeviceHash($shash),1, push @evtEt,[$h,1,"powerError:" .(($err&0x02) ? "on":"off")];
"powerError:" .(($err&0x02) ? "on":"off"), push @evtEt,[$h,1,"sabotageError:".(($err&0x04) ? "on":"off")];
"sabotageError:".(($err&0x04) ? "on":"off"), push @evtEt,[$h,1,"battery:".(($err&0x08)?"critical":($err&0x80?"low":"ok"))];
"battery:".(($err&0x08)?"critical":($err&0x80?"low":"ok")));
} }
elsif ($md eq "HM-LC-SW1-BA-PCB"){ elsif ($md eq "HM-LC-SW1-BA-PCB"){
push @event,"battery:" . (($err&0x80) ? "low" : "ok" ); push @event,"battery:" . (($err&0x80) ? "low" : "ok" );
@ -1384,8 +1379,8 @@ sub CUL_HM_Parse($$) {#########################################################
} }
} }
elsif($st =~ m /^(remote|pushButton|swi)$/) { ############################### elsif($st =~ m /^(remote|pushButton|swi)$/) { ###############################
if($mTp =~ m/^4./ && $p =~ m/^(..)(..)/) { if($mTp =~ m/^4./) {
my ($chn, $bno) = (hex($1), hex($2));# button number/event count my ($chn, $bno) = map{hex($_)} ($mI[0],$mI[1]);# button/event count
my $buttonID = $chn&0x3f;# only 6 bit are valid my $buttonID = $chn&0x3f;# only 6 bit are valid
my $btnName; my $btnName;
my $state = ""; my $state = "";
@ -1421,9 +1416,8 @@ sub CUL_HM_Parse($$) {#########################################################
$trigType = "Short"; $trigType = "Short";
} }
$shash->{helper}{addVal} = $chn; #store to handle changesFread $shash->{helper}{addVal} = $chn; #store to handle changesFread
push @entities,CUL_HM_UpdtReadBulk($chnHash,1, push @evtEt,[$chnHash,1,"state:".$state.$target];
,"state:".$state.$target push @evtEt,[$chnHash,1,"trigger:".$trigType."_".$bno];
,"trigger:".$trigType."_".$bno);
push @event,"battery:". (($chn&0x80)?"low":"ok"); push @event,"battery:". (($chn&0x80)?"low":"ok");
push @event,"state:$btnName $state$target"; push @event,"state:$btnName $state$target";
} }
@ -1465,14 +1459,14 @@ sub CUL_HM_Parse($$) {#########################################################
push @event, "frequency:".$F; push @event, "frequency:".$F;
push @event, "boot:" .(($eCnt&0x800000)?"on":"off"); push @event, "boot:" .(($eCnt&0x800000)?"on":"off");
push @entities,CUL_HM_UpdtReadSingle($defs{$devHash->{channel_02}},'state',$eCnt,1) if ($devHash->{channel_02}); push @evtEt,[$defs{$devHash->{channel_02}},1,"state:$eCnt"] if ($devHash->{channel_02});
push @entities,CUL_HM_UpdtReadSingle($defs{$devHash->{channel_03}},'state',$P ,1) if ($devHash->{channel_03}); push @evtEt,[$defs{$devHash->{channel_03}},1,"state:$P" ] if ($devHash->{channel_03});
push @entities,CUL_HM_UpdtReadSingle($defs{$devHash->{channel_04}},'state',$I ,1) if ($devHash->{channel_04}); push @evtEt,[$defs{$devHash->{channel_04}},1,"state:$I" ] if ($devHash->{channel_04});
push @entities,CUL_HM_UpdtReadSingle($defs{$devHash->{channel_05}},'state',$U ,1) if ($devHash->{channel_05}); push @evtEt,[$defs{$devHash->{channel_05}},1,"state:$U" ] if ($devHash->{channel_05});
push @entities,CUL_HM_UpdtReadSingle($defs{$devHash->{channel_06}},'state',$F ,1) if ($devHash->{channel_06}); push @evtEt,[$defs{$devHash->{channel_06}},1,"state:$F" ] if ($devHash->{channel_06});
if($eCnt == 0 && $mTp eq "5E" && hex($mNo) < 3 ){ if($eCnt == 0 && $mTp eq "5E" && hex($mNo) < 3 ){
push @entities,CUL_HM_UpdtReadSingle($devHash,'powerOn',"-",1); push @evtEt,[$devHash,1,"powerOn:-"];
push @event, "energyOffset:".ReadingsVal($shash->{NAME},"energy",0)+ push @event, "energyOffset:".ReadingsVal($shash->{NAME},"energy",0)+
ReadingsVal($shash->{NAME},"energyOffset",0); ReadingsVal($shash->{NAME},"energyOffset",0);
} }
@ -1536,19 +1530,19 @@ sub CUL_HM_Parse($$) {#########################################################
my $cH = $modules{CUL_HM}{defptr}{$src.sprintf("%02X",$cCnt+1)}; my $cH = $modules{CUL_HM}{defptr}{$src.sprintf("%02X",$cCnt+1)};
next if (!$cH); next if (!$cH);
if (ReadingsVal($cH->{NAME},"state","") ne $leds[$cCnt]) { if (ReadingsVal($cH->{NAME},"state","") ne $leds[$cCnt]) {
push @entities,CUL_HM_UpdtReadBulk($cH,1,"color:".$leds[$cCnt], push @evtEt,[$cH,1,"color:$leds[$cCnt]"];
"state:".$leds[$cCnt]); push @evtEt,[$cH,1,"state:$leds[$cCnt]"];
} }
} }
push @entities,CUL_HM_UpdtReadBulk($shash,1,"color:".$lStat, push @evtEt,[$shash,1,"color:$lStat"];
"state:".$lStat); push @evtEt,[$shash,1,"state:$lStat"];
} }
else{# branch can be removed if message is always that long else{# branch can be removed if message is always that long
my $bitLoc = ($msgChn-1)*2;#calculate bit location my $bitLoc = ($msgChn-1)*2;#calculate bit location
my $mask = 3<<$bitLoc; my $mask = 3<<$bitLoc;
my $value = sprintf("%08X",(hex($devState) &~$mask)|($msgState<<$bitLoc)); my $value = sprintf("%08X",(hex($devState) &~$mask)|($msgState<<$bitLoc));
push @entities,CUL_HM_UpdtReadBulk($shash,1,"color:".$value, push @evtEt,[$shash,1,,"color:$value"];
"state:".$value); push @evtEt,[$shash,1, "state:$value"];
if ($chnHash){ if ($chnHash){
$shash = $chnHash; $shash = $chnHash;
my %colorTable=("00"=>"off","01"=>"red","02"=>"green","03"=>"orange"); my %colorTable=("00"=>"off","01"=>"red","02"=>"green","03"=>"orange");
@ -1781,13 +1775,12 @@ sub CUL_HM_Parse($$) {#########################################################
$dChHash->{helper}{trgLgRpt}=0; $dChHash->{helper}{trgLgRpt}=0;
push @ack,$dhash,$mNo."8002".$dst.$src.$stAck; push @ack,$dhash,$mNo."8002".$dst.$src.$stAck;
} }
push @entities, push @evtEt,[$dChHash,1,"state:$stT"];
CUL_HM_UpdtReadBulk($dChHash,1,"state:".$stT, push @evtEt,[$dChHash,1,"virtActState:$stT"];
"virtActState:".$stT, push @evtEt,[$dChHash,1,"virtActTrigger:".CUL_HM_id2Name($recId)];
"virtActTrigger:".CUL_HM_id2Name($recId), push @evtEt,[$dChHash,1,"virtActTrigType:$longPress"];
"virtActTrigType:".$longPress, push @evtEt,[$dChHash,1,"virtActTrigRpt:$trgLgRpt"];
"virtActTrigRpt:".$trgLgRpt, push @evtEt,[$dChHash,1,"virtActTrigNo:$trigNo"];
"virtActTrigNo:".$trigNo);
} }
} }
} }
@ -1796,8 +1789,8 @@ sub CUL_HM_Parse($$) {#########################################################
$vp = int($vp/2.56+0.5); # valve position in % $vp = int($vp/2.56+0.5); # valve position in %
my $chnHash = $modules{CUL_HM}{defptr}{$dst."01"}; my $chnHash = $modules{CUL_HM}{defptr}{$dst."01"};
$chnHash = $dhash if (!$chnHash); $chnHash = $dhash if (!$chnHash);
push @entities, CUL_HM_UpdtReadBulk($chnHash,1,"ValvePosition:$vp %", push @evtEt,[$chnHash,1,"ValvePosition:$vp %"];
"ValveAdjCmd:".$d1); push @evtEt,[$chnHash,1,"ValveAdjCmd:".$d1];
push @ack,$chnHash,$mNo."8002".$dst.$src.'0101'. push @ack,$chnHash,$mNo."8002".$dst.$src.'0101'.
sprintf("%02X",$vp*2)."0000"; sprintf("%02X",$vp*2)."0000";
} }
@ -1845,10 +1838,13 @@ sub CUL_HM_Parse($$) {#########################################################
push @event, "noReceiver:src:$src ".$mFlg.$mTp." $p" if(!@event && !@entities); push @event, "noReceiver:src:$src ".$mFlg.$mTp." $p" if(!@event && !@entities);
CUL_HM_UpdtReadBulk($shash,1,@event); #events to the channel CUL_HM_UpdtReadBulk($shash,1,@event); #events to the channel
push @entities,CUL_HM_pushEvnts();
@entities = CUL_HM_noDup(@entities,$shash->{NAME}); @entities = CUL_HM_noDup(@entities,$shash->{NAME});
$defs{$_}{".noDispatchVars"} = 1 foreach (grep !/$name/,@entities); $defs{$_}{".noDispatchVars"} = 1 foreach (grep !/$name/,@entities);
return @entities; return @entities;
} }
sub CUL_HM_parseCommon(@){##################################################### sub CUL_HM_parseCommon(@){#####################################################
# parsing commands that are device independent # parsing commands that are device independent
my ($ioHash,$mNo,$mFlg,$mTp,$src,$dst,$p,$st,$md) = @_; my ($ioHash,$mNo,$mFlg,$mTp,$src,$dst,$p,$st,$md) = @_;
@ -1880,7 +1876,7 @@ sub CUL_HM_parseCommon(@){#####################################################
elsif($rxt & 0x10){ # lazy config elsif($rxt & 0x10){ # lazy config
if($mFlgH & 0x02 #wakeup device if($mFlgH & 0x02 #wakeup device
&& $defs{$shash->{IODev}{NAME}}{TYPE} eq "HMLAN"){ && $defs{$shash->{IODev}{NAME}}{TYPE} eq "HMLAN"){
$shash->{helper}{io}{newCh} = 1; $shash->{helper}{io}{newCh} = 1 if ($shash->{helper}{prt}{sProc} == 2);
CUL_HM_appFromQ($shash->{NAME},"cf");# stack cmds if waiting CUL_HM_appFromQ($shash->{NAME},"cf");# stack cmds if waiting
$shash->{helper}{prt}{sleeping} = 0; $shash->{helper}{prt}{sleeping} = 0;
CUL_HM_ProcessCmdStack($shash); CUL_HM_ProcessCmdStack($shash);
@ -1940,7 +1936,7 @@ sub CUL_HM_parseCommon(@){#####################################################
$reply = "ACKStatus"; $reply = "ACKStatus";
my $chnHash = CUL_HM_id2Hash($src.substr($p,2,2)); my $chnHash = CUL_HM_id2Hash($src.substr($p,2,2));
CUL_HM_UpdtReadSingle($chnHash,"recentStateType","ack",0); push @evtEt,[$chnHash,0,"recentStateType:ack"];
if ($shash->{helper}{tmdOn}){ if ($shash->{helper}{tmdOn}){
if (not hex(substr($p,6,2))&0x40){# not timedOn, we have to repeat if (not hex(substr($p,6,2))&0x40){# not timedOn, we have to repeat
@ -1980,7 +1976,7 @@ sub CUL_HM_parseCommon(@){#####################################################
my $chn = sprintf("%02X",hex(substr($p,2,2))&0x3f); my $chn = sprintf("%02X",hex(substr($p,2,2))&0x3f);
my $chnhash = $modules{CUL_HM}{defptr}{$chn?$src.$chn:$src}; my $chnhash = $modules{CUL_HM}{defptr}{$chn?$src.$chn:$src};
$chnhash = $shash if(!$chnhash); $chnhash = $shash if(!$chnhash);
CUL_HM_UpdtReadSingle($chnhash,"CommandAccepted",$success,0); push @evtEt,[$chnhash,0,"CommandAccepted:$success"];
CUL_HM_ProcessCmdStack($shash) if(CUL_HM_IOid($shash) eq $dst); CUL_HM_ProcessCmdStack($shash) if(CUL_HM_IOid($shash) eq $dst);
delete $shash->{helper}{prt}{wuReSent} delete $shash->{helper}{prt}{wuReSent}
if (!$shash->{helper}{prt}{mmcS}); if (!$shash->{helper}{prt}{mmcS});
@ -2037,7 +2033,7 @@ sub CUL_HM_parseCommon(@){#####################################################
my $subType = substr($p,0,2); my $subType = substr($p,0,2);
if ($subType eq "00"){ #SerialRead==================================== if ($subType eq "00"){ #SerialRead====================================
my $sn = pack("H*",substr($p,2,20)); my $sn = pack("H*",substr($p,2,20));
CUL_HM_UpdtReadSingle($shash,"D-serialNr",$sn,0); push @evtEt,[$shash,0,"D-serialNr:$sn"];
$attr{$shash->{NAME}}{serialNr} = $sn; $attr{$shash->{NAME}}{serialNr} = $sn;
CUL_HM_respPendRm($shash) if ($pendType eq "SerialRead"); CUL_HM_respPendRm($shash) if ($pendType eq "SerialRead");
$ret = "done"; $ret = "done";
@ -2123,17 +2119,14 @@ sub CUL_HM_parseCommon(@){#####################################################
if ( defined $lastAddr if ( defined $lastAddr
&& ( $lastAddr > $shash->{helper}{prt}{rspWait}{nAddr} && ( $lastAddr > $shash->{helper}{prt}{rspWait}{nAddr}
|| $lastAddr == 0)){ || $lastAddr == 0)){
CUL_HM_UpdtReadSingle($chnHash,$regLN,ReadingsVal($chnName,$regLN,"")." $data",0);
CUL_HM_UpdtReadSingle($chnHash,$regLN,
ReadingsVal($chnName,$regLN,"")." ".$data,0);
$shash->{helper}{prt}{rspWait}{nAddr} = $lastAddr; $shash->{helper}{prt}{rspWait}{nAddr} = $lastAddr;
} }
if ($data =~ m/00:00$/){ # this was the last message in the block if ($data =~ m/00:00$/){ # this was the last message in the block
if($list eq "00"){ if($list eq "00"){
my $name = CUL_HM_id2Name($src); my $name = CUL_HM_id2Name($src);
CUL_HM_UpdtReadSingle($shash,"PairedTo", push @evtEt,[$shash,0,"PairedTo:".CUL_HM_getRegFromStore($name,"pairCentral",0,"")];
CUL_HM_getRegFromStore($name,"pairCentral",0,""),0);
} }
CUL_HM_respPendRm($shash); CUL_HM_respPendRm($shash);
delete $chnHash->{helper}{shadowReg}{$regLNp}; #rm shadow delete $chnHash->{helper}{shadowReg}{$regLNp}; #rm shadow
@ -2189,7 +2182,7 @@ sub CUL_HM_parseCommon(@){#####################################################
@{$modules{CUL_HM}{helper}{qReqStat}} = grep { $_ ne $shash->{NAME} } @{$modules{CUL_HM}{helper}{qReqStat}} = grep { $_ ne $shash->{NAME} }
@{$modules{CUL_HM}{helper}{qReqStat}}; @{$modules{CUL_HM}{helper}{qReqStat}};
my $chnHash = CUL_HM_id2Hash($src.substr($p,2,2)); my $chnHash = CUL_HM_id2Hash($src.substr($p,2,2));
CUL_HM_UpdtReadSingle($chnHash,"recentStateType","info",0); push @evtEt,[$chnHash,0,"recentStateType:info"];
if ($pendType eq "StatusReq"){#it is the answer to our request if ($pendType eq "StatusReq"){#it is the answer to our request
my $chnSrc = $src.$shash->{helper}{prt}{rspWait}{forChn}; my $chnSrc = $src.$shash->{helper}{prt}{rspWait}{forChn};
@ -2236,9 +2229,8 @@ sub CUL_HM_parseCommon(@){#####################################################
my $pName = CUL_HM_id2Name($peer); my $pName = CUL_HM_id2Name($peer);
$pName = CUL_HM_id2Name(substr($peer,0,6)) if (!$defs{$pName}); $pName = CUL_HM_id2Name(substr($peer,0,6)) if (!$defs{$pName});
next if (!$defs{$pName});#||substr($peer,0,6) ne $dst next if (!$defs{$pName});#||substr($peer,0,6) ne $dst
push @entities,CUL_HM_UpdtReadBulk($defs{$pName},1 push @evtEt,[$defs{$pName},1,"trig_$cName:$level"];
,"trig_$cName:$level" push @evtEt,[$defs{$pName},1,"trigLast:$cName ".(($level ne "-")?":$level":"")];
,"trigLast:$cName ".(($level ne "-")?":$level":""));
} }
return (@entities return (@entities
?"entities:".join(",",@entities) ?"entities:".join(",",@entities)
@ -2299,12 +2291,10 @@ sub CUL_HM_parseSDteam(@){#handle SD team events
if ($mTp eq "40"){ #test if ($mTp eq "40"){ #test
my $trgCnt = hex(substr($p,2,2)); my $trgCnt = hex(substr($p,2,2));
push @entities,CUL_HM_UpdtReadSingle($sHash, push @evtEt,[$sHash,1,"teamCall:from $dName:$trgCnt"];
'teamCall',"from $dName:$trgCnt",1);
foreach (split ",",$attr{$sName}{peerIDs}){ foreach (split ",",$attr{$sName}{peerIDs}){
my $tHash = CUL_HM_id2Hash($_); my $tHash = CUL_HM_id2Hash($_);
push @entities,CUL_HM_UpdtReadSingle($tHash, push @evtEt,[$tHash,1,"teamCall:from $dName:$trgCnt"];
'teamCall',"from $dName:$trgCnt",1);
} }
} }
elsif ($mTp eq "41"){ #Alarm detected elsif ($mTp eq "41"){ #Alarm detected
@ -2323,21 +2313,16 @@ sub CUL_HM_parseSDteam(@){#handle SD team events
if ($sVal > 1){ if ($sVal > 1){
$sProsa = "smoke-Alarm_".$No; $sProsa = "smoke-Alarm_".$No;
$smokeSrc = $dName; $smokeSrc = $dName;
CUL_HM_UpdtReadSingle($sHash,"recentAlarm",$smokeSrc,1) push @evtEt,[$sHash,1,"recentAlarm:$smokeSrc"] if($sVal == 200);
if($sVal == 200);
} }
push @entities,CUL_HM_UpdtReadBulk($sHash,1 # entry for teamLead push @evtEt,[$sHash,1,"state:$sProsa"];
,"state:$sProsa" push @evtEt,[$sHash,1,'level:'.$sVal];
,'level:'.$sVal push @evtEt,[$sHash,1,"eventNo:".$No];
,"eventNo:".$No push @evtEt,[$sHash,1,"smoke_detect:".$smokeSrc];
,"smoke_detect:".$smokeSrc
);
foreach (split ",",$attr{$sName}{peerIDs}){ foreach (split ",",$attr{$sName}{peerIDs}){
my $tHash = CUL_HM_id2Hash($_); my $tHash = CUL_HM_id2Hash($_);
push @entities,CUL_HM_UpdtReadBulk($tHash,1 push @evtEt,[$tHash,1,"state:$sProsa"];
,"state:$sProsa" push @evtEt,[$tHash,1,"smoke_detect:$smokeSrc"];
,"smoke_detect:".$smokeSrc
);
} }
} }
return @entities; return @entities;
@ -2363,6 +2348,23 @@ sub CUL_HM_updtSDTeam(@){#in: TeamName, optional caller name and its new state
} }
return CUL_HM_UpdtReadSingle($defs{$name},"state",$dStat,1); return CUL_HM_UpdtReadSingle($defs{$name},"state",$dStat,1);
} }
sub CUL_HM_pushEvnts(){########################################################
my @ent = ();
@evtEt = sort {($a->[0] cmp $b->[0])|| ($a->[1] cmp $b->[1])} @evtEt;
my ($h,$x) = ("","");
my @evts = ();
foreach my $e(@evtEt){
if ($h ne ${$e}[0] || $x ne ${$e}[1]){
push @ent,CUL_HM_UpdtReadBulk($h,$x,@evts);
@evts = ();
($h,$x) = (${$e}[0],${$e}[1])
}
push @evts,${$e}[2];
}
@evtEt = ();
push @ent,CUL_HM_UpdtReadBulk($h,$x,@evts);
return @ent;
}
sub CUL_HM_Get($@) {#+++++++++++++++++ get command+++++++++++++++++++++++++++++ sub CUL_HM_Get($@) {#+++++++++++++++++ get command+++++++++++++++++++++++++++++
my ($hash, @a) = @_; my ($hash, @a) = @_;
@ -3016,12 +3018,10 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
sprintf("%02X%02s%02X",$lvl*2,$rLocDly,$speed*2)); sprintf("%02X%02s%02X",$lvl*2,$rLocDly,$speed*2));
} }
elsif($cmd =~ m/^(on|off|toggle)$/) { ####################################### elsif($cmd =~ m/^(on|off|toggle)$/) { #######################################
$hash->{helper}{dlvl} = ($cmd eq 'on') $hash->{helper}{dlvl} = ( $cmd eq 'off'||
? 'C8' ($cmd eq 'toggle' &&CUL_HM_getChnLvl($name) != 0))
:(($cmd eq 'off') ? '00'
? '00' : 'C8';
:(CUL_HM_getChnLvl($name) != 0 ?"00"
:"C8"));
$hash->{helper}{dlvlCmd} = "++$flag"."11$id$dst" $hash->{helper}{dlvlCmd} = "++$flag"."11$id$dst"
."02$chn$hash->{helper}{dlvl}".'0000'; ."02$chn$hash->{helper}{dlvl}".'0000';
CUL_HM_PushCmdStack($hash,$hash->{helper}{dlvlCmd}); CUL_HM_PushCmdStack($hash,$hash->{helper}{dlvlCmd});
@ -3091,7 +3091,12 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
$rval = CUL_HM_encodeTime16((@a > 4)?$a[4]:2.5);# rampTime 0.0..85825945.6, 0=immediate $rval = CUL_HM_encodeTime16((@a > 4)?$a[4]:2.5);# rampTime 0.0..85825945.6, 0=immediate
} }
# store desiredLevel in and its Cmd in case we have to repeat # store desiredLevel in and its Cmd in case we have to repeat
$hash->{helper}{dlvl} = sprintf("%02X",$lvl*2); if ($tval && $tval ne "FFFF"){
delete $hash->{helper}{dlvl};#stop desiredLevel supervision
}
else{
$hash->{helper}{dlvl} = sprintf("%02X",$lvl*2);
}
$hash->{helper}{dlvlCmd} = "++$flag"."11$id$dst" $hash->{helper}{dlvlCmd} = "++$flag"."11$id$dst"
."02$chn$hash->{helper}{dlvl}$rval$tval"; ."02$chn$hash->{helper}{dlvl}$rval$tval";
CUL_HM_PushCmdStack($hash,$hash->{helper}{dlvlCmd}); CUL_HM_PushCmdStack($hash,$hash->{helper}{dlvlCmd});
@ -3290,9 +3295,11 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
return "no additional params for $mode" if ($a[3]); return "no additional params for $mode" if ($a[3]);
} }
if($mode eq "manu"){ if($mode eq "manu"){
my $t = $a[2] ne "manu"?$a[2]:ReadingsVal($name,"desired-temp",18);
Log 1,"General t:$t a:$a[2]";
return "temperatur for manu 4.5 to 30.5 C" return "temperatur for manu 4.5 to 30.5 C"
if (!$a[2] || $a[2] < 4.5 || $a[2] > 30.5); if ($t < 4.5 || $t > 30.5);
$temp = $a[2]*2; $temp = $t*2;
} }
elsif($mode eq "party"){ elsif($mode eq "party"){
return "use party <temp> <from-time> <from-date> <to-time> <to-date>\n" return "use party <temp> <from-time> <from-date> <to-time> <to-date>\n"
@ -3808,7 +3815,7 @@ sub CUL_HM_valvePosUpdt(@) {#update valve position periodically to please valve
Log3 $name,3,"CUL_HM $name virtualTC timer off by:".int($tn - $nextF); Log3 $name,3,"CUL_HM $name virtualTC timer off by:".int($tn - $nextF);
$nextF = $tn; $nextF = $tn;
} }
while ($nextF < $tn) {# calculate next time from last successful while ($nextF < $tn+0.05) {# calculate next time from last successful
$msgCnt = ($msgCnt +1) %256; $msgCnt = ($msgCnt +1) %256;
$idl = $hashVd->{idl}+$msgCnt; $idl = $hashVd->{idl}+$msgCnt;
$lo = int(($idl*0x4e6d +12345)/0x10000);#&0xff; $lo = int(($idl*0x4e6d +12345)/0x10000);#&0xff;

View File

@ -132,11 +132,11 @@ my $K_actDetID = '000000'; # id of actionDetector
"0039" => {name=>"HM-CC-TC" ,st=>'thermostat' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p:2p,5:2.3p,6:2',chn=>"Weather:1:1,Climate:2:2,WindowRec:3:3",}, "0039" => {name=>"HM-CC-TC" ,st=>'thermostat' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p:2p,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=>'p,5' ,chn=>"",}, "003A" => {name=>"HM-CC-VD" ,st=>'thermostat' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'p,5' ,chn=>"",},
"003B" => {name=>"HM-RC-4-B" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",}, "003B" => {name=>"HM-RC-4-B" ,st=>'remote' ,cyc=>'' ,rxt=>'c' ,lst=>'1,4' ,chn=>"Btn:1:4",},
"003C" => {name=>"HM-WDS20-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p' ,chn=>"",}, "003C" => {name=>"HM-WDS20-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:f' ,lst=>'p' ,chn=>"",}, #:w todo should be wakeup, does not react
"003D" => {name=>"HM-WDS10-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p' ,chn=>"",}, "003D" => {name=>"HM-WDS10-TH-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:f' ,lst=>'p' ,chn=>"",}, #:w todo should be wakeup, does not react
"003E" => {name=>"HM-WDS30-T-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=>"",}, #:w remark: this device behaves on wakeup
"003F" => {name=>"HM-WDS40-TH-I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w:f' ,lst=>'p' ,chn=>"",}, "003F" => {name=>"HM-WDS40-TH-I" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:f' ,lst=>'p' ,chn=>"",}, #:w todo should be wakeup, does not react
"0040" => {name=>"HM-WDS100-C6-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c:w' ,lst=>'p,1' ,chn=>"",}, "0040" => {name=>"HM-WDS100-C6-O" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'c' ,lst=>'p,1' ,chn=>"",}, #:w todo should be wakeup, does not react
"0041" => {name=>"HM-WDC7000" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'' ,lst=>'1,4' ,chn=>"",}, "0041" => {name=>"HM-WDC7000" ,st=>'THSensor' ,cyc=>'00:10' ,rxt=>'' ,lst=>'1,4' ,chn=>"",},
"0042" => {name=>"HM-SEC-SD" ,st=>'smokeDetector' ,cyc=>'99:00' ,rxt=>'b' ,lst=>'p' ,chn=>"",}, "0042" => {name=>"HM-SEC-SD" ,st=>'smokeDetector' ,cyc=>'99:00' ,rxt=>'b' ,lst=>'p' ,chn=>"",},
"0043" => {name=>"HM-SEC-TIS" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",}, "0043" => {name=>"HM-SEC-TIS" ,st=>'threeStateSensor' ,cyc=>'28:00' ,rxt=>'c:w' ,lst=>'1,4' ,chn=>"",},
@ -333,10 +333,10 @@ my $K_actDetID = '000000'; # id of actionDetector
DimElsActionType=>{a=> 38.0,s=>0.4,l=>3,min=>0 ,max=>8 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"" ,lit=>{off=>0,jmpToTarget=>1,toggleToCnt=>2,toggleToCntInv=>3,upDim=>4,downDim=>5,toggelDim=>6,toggelDimToCnt=>7,toggelDimToCntInv=>8}}, DimElsActionType=>{a=> 38.0,s=>0.4,l=>3,min=>0 ,max=>8 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"" ,lit=>{off=>0,jmpToTarget=>1,toggleToCnt=>2,toggleToCntInv=>3,upDim=>4,downDim=>5,toggelDim=>6,toggelDimToCnt=>7,toggelDimToCntInv=>8}},
#output Unit #output Unit
ActTypeMp3 =>{a=> 36 ,s=>1 ,l=>3,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"Tone or MP3 to be played"}, ActTypeMp3 =>{a=> 36 ,s=>1 ,l=>3,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"Tone or MP3 to be played"},
ActTypeLed =>{a=> 36 ,s=>1 ,l=>3,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"LED color" ,lit=>{no=>0x00,red_short=>0x11,red_long=>0x12,green_short=>0x21,green_long=>0x22,orange_short=>0x31,orange_long=>0x32}}, ActTypeLed =>{a=> 36 ,s=>1 ,l=>3,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"LED color" ,lit=>{no=>0x00,red_short=>0x11,red_long=>0x12,green_short=>0x21,green_long=>0x22,orange_short=>0x31,orange_long=>0x32}},
ActTypeOuCf =>{a=> 36 ,s=>1 ,l=>3,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"type sound or LED" ,lit=>{no=>0,short=>1,long=>2}}, ActTypeOuCf =>{a=> 36 ,s=>1 ,l=>3,min=>0 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"type sound or LED" ,lit=>{no=>0,short=>1,long=>2}},
ActNum =>{a=> 37 ,s=>1 ,l=>3,min=>1 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"Number of repetitions"}, ActNum =>{a=> 37 ,s=>1 ,l=>3,min=>1 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>0,t=>"Number of repetitions"},
Intense =>{a=> 43 ,s=>1 ,l=>3,min=>10 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Volume",lit=>{vol_100=>255,vol_90=>250,vol_80=>246,vol_70=>240,vol_60=>234,vol_50=>227,vol_40=>218,vol_30=>207,vol_20=>190,vol_10=>162,vol_00=>10}}, Intense =>{a=> 43 ,s=>1 ,l=>3,min=>10 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Volume" ,lit=>{vol_100=>255,vol_90=>250,vol_80=>246,vol_70=>240,vol_60=>234,vol_50=>227,vol_40=>218,vol_30=>207,vol_20=>190,vol_10=>162,vol_00=>10}},
# statemachines # statemachines
BlJtOn =>{a=> 11.0,s=>0.4,l=>3,min=>0 ,max=>9 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from on" ,lit=>{no=>0,dlyOn=>1,refOn=>2,on=>3,dlyOff=>4,refOff=>5,off=>6,rampOn=>8,rampOff=>9}}, BlJtOn =>{a=> 11.0,s=>0.4,l=>3,min=>0 ,max=>9 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Jump from on" ,lit=>{no=>0,dlyOn=>1,refOn=>2,on=>3,dlyOff=>4,refOff=>5,off=>6,rampOn=>8,rampOff=>9}},
BlJtOff =>{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,dlyOn=>1,refOn=>2,on=>3,dlyOff=>4,refOff=>5,off=>6,rampOn=>8,rampOff=>9}}, BlJtOff =>{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,dlyOn=>1,refOn=>2,on=>3,dlyOff=>4,refOff=>5,off=>6,rampOn=>8,rampOff=>9}},
@ -408,7 +408,7 @@ my $K_actDetID = '000000'; # id of actionDetector
backAtCharge =>{a=> 13.5,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight at Charge" ,lit=>{off=>0,on=>1}}, backAtCharge =>{a=> 13.5,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"Backlight at Charge" ,lit=>{off=>0,on=>1}},
stbyTime =>{a=> 14.0,s=>1.0,l=>0,min=>1 ,max=>99 ,c=>'' ,f=>'' ,u=>'s' ,d=>1,t=>"Standby Time"}, stbyTime =>{a=> 14.0,s=>1.0,l=>0,min=>1 ,max=>99 ,c=>'' ,f=>'' ,u=>'s' ,d=>1,t=>"Standby Time"},
backOnTime =>{a=> 14.0,s=>1.0,l=>0,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'s' ,d=>1,t=>"Backlight On Time"}, backOnTime =>{a=> 14.0,s=>1.0,l=>0,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'s' ,d=>1,t=>"Backlight On Time"},
btnLock =>{a=> 15.0,s=>1.0,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Button Lock" ,lit=>{unlock=>0,lock=>1}}, btnLock =>{a=> 15.0,s=>1.0,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Button Lock" ,lit=>{off=>0,on=>200}},
# keymatic/winmatic secific register # keymatic/winmatic secific register
keypressSignal =>{a=> 3.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Keypress beep" ,lit=>{off=>0,on=>1}}, keypressSignal =>{a=> 3.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Keypress beep" ,lit=>{off=>0,on=>1}},
@ -432,8 +432,8 @@ my $K_actDetID = '000000'; # id of actionDetector
#repeater #repeater
compMode =>{a=> 23.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"compatibility moden" ,lit=>{off=>0,on=>1}}, compMode =>{a=> 23.0,s=>0.1,l=>0,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"compatibility moden" ,lit=>{off=>0,on=>1}},
localResDis =>{a=> 24.0,s=>1.0,l=>0,min=>1 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"local reset disable" ,lit=>{off=>0,on=>1}}, localResDis =>{a=> 24.0,s=>1.0,l=>0,min=>1 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"local reset disable" ,lit=>{off=>0,on=>1}},
globalBtnLock =>{a=> 25.0,s=>1.0,l=>0,min=>1 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"global button lock" ,lit=>{unlock=>0,lock=>200}}, globalBtnLock =>{a=> 25.0,s=>1.0,l=>0,min=>1 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"global button lock" ,lit=>{off=>0,on=>200}},
modusBtnLock =>{a=> 26.0,s=>1.0,l=>0,min=>1 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"mode button lock" ,lit=>{unlock=>0,lock=>200}}, modusBtnLock =>{a=> 26.0,s=>1.0,l=>0,min=>1 ,max=>255 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"mode button lock" ,lit=>{off=>0,on=>200}},
paramSel =>{a=> 27.0,s=>1.0,l=>0,min=>0 ,max=>4 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"data transfered to peer" ,lit=>{off=>0,T1=>1,T2=>2,T1_T2=>3,T2_T1=>4}}, paramSel =>{a=> 27.0,s=>1.0,l=>0,min=>0 ,max=>4 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"data transfered to peer" ,lit=>{off=>0,T1=>1,T2=>2,T1_T2=>3,T2_T1=>4}},
RS485IdleTime =>{a=> 29.0,s=>1.0,l=>0,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'s' ,d=>0,t=>"Idle Time"}, RS485IdleTime =>{a=> 29.0,s=>1.0,l=>0,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'s' ,d=>0,t=>"Idle Time"},
#un-identified List0 #un-identified List0
@ -481,7 +481,7 @@ my $K_actDetID = '000000'; # id of actionDetector
statusInfoMinDly=>{a=> 87.0,s=>0.5,l=>1,min=>0.5,max=>15.5 ,c=>'' ,f=>2 ,u=>"s" ,d=>0,t=>"status message min delay"}, statusInfoMinDly=>{a=> 87.0,s=>0.5,l=>1,min=>0.5,max=>15.5 ,c=>'' ,f=>2 ,u=>"s" ,d=>0,t=>"status message min delay"},
statusInfoRandom=>{a=> 87.5,s=>0.3,l=>1,min=>0 ,max=>7 ,c=>'' ,f=>'' ,u=>"s" ,d=>0,t=>"status message random delay"}, statusInfoRandom=>{a=> 87.5,s=>0.3,l=>1,min=>0 ,max=>7 ,c=>'' ,f=>'' ,u=>"s" ,d=>0,t=>"status message random delay"},
characteristic =>{a=> 88.0,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>"" ,d=>1,t=>"" ,lit=>{linear=>0,square=>1}}, characteristic =>{a=> 88.0,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>"" ,d=>1,t=>"" ,lit=>{linear=>0,square=>1}},
logicCombination=>{a=> 89.0,s=>0.5,l=>1,min=>0 ,max=>16 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{inactive=>0,or=>1,and=>2,xor=>3,nor=>4,nand=>5,orinv=>6,andinv=>7,plus=>8,minus=>9,mul=>10,plusinv=>11,minusinv=>12,mulinv=>13,invPlus=>14,invMinus=>15,invMul=>16}}, logicCombination=>{a=> 89.0,s=>0.5,l=>1,min=>0 ,max=>16 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"" ,lit=>{inactive=>0,or=>1,and=>2,xor=>3,nor=>4,nand=>5,orinv=>6,andinv=>7,plus=>8,minus=>9,mul=>10,plusinv=>11,minusinv=>12,mulinv=>13,invPlus=>14,invMinus=>15,invMul=>16}},
#SCD #SCD
msgScdPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,lvlNormal=>1}}, msgScdPosA =>{a=> 32.6,s=>0.2,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position A",lit=>{noMsg=>0,lvlNormal=>1}},
msgScdPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}}, msgScdPosB =>{a=> 32.4,s=>0.2,l=>1,min=>0 ,max=>3 ,c=>'lit' ,f=>'' ,u=>'' ,d=>0,t=>"Message for position B",lit=>{noMsg=>0,lvlNormal=>1,lvlAddStrong=>2,lvlAdd=>3}},
@ -529,8 +529,8 @@ my $K_actDetID = '000000'; # id of actionDetector
txThrVlt =>{a=>129.0,s=>2 ,l=>1,min=>0.1 ,max=>230 ,c=>'' ,f=>10 ,u=>'V' ,d=>1,t=>"threshold voltage"}, txThrVlt =>{a=>129.0,s=>2 ,l=>1,min=>0.1 ,max=>230 ,c=>'' ,f=>10 ,u=>'V' ,d=>1,t=>"threshold voltage"},
txThrFrq =>{a=>131.0,s=>1 ,l=>1,min=>0.01 ,max=>2.55 ,c=>'' ,f=>100 ,u=>'Hz' ,d=>1,t=>"threshold frequency"}, txThrFrq =>{a=>131.0,s=>1 ,l=>1,min=>0.01 ,max=>2.55 ,c=>'' ,f=>100 ,u=>'Hz' ,d=>1,t=>"threshold frequency"},
cndTxFalling =>{a=>132.0,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"trigger if falling" ,lit=>{off=>0,on=>1}}, cndTxFalling =>{a=>132.0,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"trigger if falling" ,lit=>{off=>0,on=>1}},
cndTxRising =>{a=>132.1,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"trigger if rising" ,lit=>{off=>0,on=>1}}, cndTxRising =>{a=>132.1,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"trigger if rising" ,lit=>{off=>0,on=>1}},
cndTxCycBelow =>{a=>132.2,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"cyclic trigger if level is below cndTxCycBelow",lit=>{off=>0,on=>1}}, cndTxCycBelow =>{a=>132.2,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"cyclic trigger if level is below cndTxCycBelow",lit=>{off=>0,on=>1}},
cndTxCycAbove =>{a=>132.3,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"cyclic trigger if level is above cndTxDecAbove",lit=>{off=>0,on=>1}}, cndTxCycAbove =>{a=>132.3,s=>0.1,l=>1,min=>0 ,max=>1 ,c=>'lit' ,f=>'' ,u=>'' ,d=>1,t=>"cyclic trigger if level is above cndTxDecAbove",lit=>{off=>0,on=>1}},
cndTxDecAbove =>{a=>133 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"level for cndTxCycAbove"}, cndTxDecAbove =>{a=>133 ,s=>1 ,l=>1,min=>0 ,max=>255 ,c=>'' ,f=>'' ,u=>'' ,d=>1,t=>"level for cndTxCycAbove"},
@ -1246,7 +1246,7 @@ $culHmModelSets{"ROTO_ZEL-STG-RM-FWT"} = $culHmModelSets{"HM-CC-TC"};
,off =>"" ,off =>""
,toggle =>""}, ,toggle =>""},
"HM-CC-RT-DN00" =>{ sysTime =>""}, "HM-CC-RT-DN00" =>{ sysTime =>""},
"HM-CC-RT-DN04" =>{ controlMode =>"[auto|boost|day|night]" "HM-CC-RT-DN04" =>{ controlMode =>"[auto|manu|boost|day|night]"
,controlManu =>"[on|off|5.0..30.0]" ,controlManu =>"[on|off|5.0..30.0]"
,controlParty =>"<temp> <startDate> <startTime> <enddate> <endTime>" ,controlParty =>"<temp> <startDate> <startTime> <enddate> <endTime>"
,tempListSat =>"[prep|exec] HH:MM temp ..." ,tempListSat =>"[prep|exec] HH:MM temp ..."
@ -1259,7 +1259,7 @@ $culHmModelSets{"ROTO_ZEL-STG-RM-FWT"} = $culHmModelSets{"HM-CC-TC"};
,"desired-temp" =>"[on|off|5.0..30.0]" ,"desired-temp" =>"[on|off|5.0..30.0]"
,sysTime =>"" ,sysTime =>""
}, },
"HM-TC-IT-WM-W-EU02"=>{ controlMode =>"[auto|boost|day|night]" "HM-TC-IT-WM-W-EU02"=>{ controlMode =>"[auto|manu|boost|day|night]"
,controlManu =>"[on|off|5.0..30.0]" ,controlManu =>"[on|off|5.0..30.0]"
,controlParty =>"<temp> <startDate> <startTime> <enddate> <endTime>" ,controlParty =>"<temp> <startDate> <startTime> <enddate> <endTime>"
,tempListSat =>"[prep|exec] [p1|p2|p3] HH:MM temp ..." ,tempListSat =>"[prep|exec] [p1|p2|p3] HH:MM temp ..."