2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 09:16:53 +00:00

CUL_HM:templatehandling, expert attribut bugfix

git-svn-id: https://svn.fhem.de/fhem/trunk@9697 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2015-10-27 12:31:35 +00:00
parent ea16a9d1cd
commit 7d3c888d83
3 changed files with 60 additions and 34 deletions

View File

@ -278,6 +278,7 @@ sub CUL_HM_updateConfig($){
} }
} }
elsif ($md =~ m/(CCU-FHEM)/){ elsif ($md =~ m/(CCU-FHEM)/){
$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
if(eval "defined(&HMLAN_writeAesKey)"){ if(eval "defined(&HMLAN_writeAesKey)"){
@ -833,10 +834,6 @@ sub CUL_HM_AttrCheck(@) {############################
return " $attrName only valid for devices" return " $attrName only valid for devices"
if (($modules{CUL_HM}{Attr}{dev}.$modules{CUL_HM}{Attr}{devPhy}) =~ m /\b$attrName\b/); if (($modules{CUL_HM}{Attr}{dev}.$modules{CUL_HM}{Attr}{devPhy}) =~ m /\b$attrName\b/);
} }
if ($defs{$name}{helper}{role}{vrt}){
return " $attrName only valid for physical devices"
if ($modules{CUL_HM}{Attr}{devPhy} =~ m /\b$attrName\b/);
}
return undef; return undef;
} }
sub CUL_HM_prtInit($){ #setup protocol variables after define sub CUL_HM_prtInit($){ #setup protocol variables after define
@ -1393,7 +1390,7 @@ sub CUL_HM_Parse($$) {#########################################################
$chnHash->{helper}{needUpdate} = 1 if($mode =~ m /central/ && $mh{mTp} eq '10'); $chnHash->{helper}{needUpdate} = 1 if($mode =~ m /central/ && $mh{mTp} eq '10');
} }
push @evtEt,[$mh{shash},1,"desired-temp:$dTemp"]; push @evtEt,[$mh{shash},1,"desired-temp:$dTemp"];
push @evtEt,[$mh{shash},1,"battery:".($err&0x80?"low":"ok")]; push @evtEt,[$mh{devH},1,"battery:".($err&0x80?"low":"ok")];
} }
elsif( $mh{mTp} eq "10" && # Config change report elsif( $mh{mTp} eq "10" && # Config change report
($mh{p} =~ m/^0402000000000501/)) { # paramchanged L5 ($mh{p} =~ m/^0402000000000501/)) { # paramchanged L5
@ -1476,8 +1473,8 @@ sub CUL_HM_Parse($$) {#########################################################
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/
||($mh{mTyp} eq "0201")){#ackInfo ||($mh{mTyp} eq "0201")){#ackInfo
my ($err ,$ctrlMode ,$setTemp ,$bTime,$pTemp,$pStart,$pEnd,$chn,$uk0,$lBat,$actTemp,$vp) = my ($err ,$ctrlMode ,$setTemp ,$bTime,$pTemp,$pStart,$pEnd,$chn,$uk0,$lBat,$actTemp,$vp) =
(hex($mI[3]),hex($mI[5]),hex($mI[1].$mI[2]),"-" ,"-" ,"-" ,"-" ); (hex($mI[3]),hex($mI[5]),hex($mI[1].$mI[2]),"-" ,"-" ,"-" ,"-" );
@ -1645,10 +1642,10 @@ sub CUL_HM_Parse($$) {#########################################################
push @evtEt,[$mh{cHash},1,"desired-temp:$setTemp"]; push @evtEt,[$mh{cHash},1,"desired-temp:$setTemp"];
push @evtEt,[$mh{cHash},1,"controlMode:$ctlTbl{$ctrlMode}"]; push @evtEt,[$mh{cHash},1,"controlMode:$ctlTbl{$ctrlMode}"];
push @evtEt,[$mh{cHash},1,"state:T: $actTemp desired: $setTemp"]; push @evtEt,[$mh{cHash},1,"state:T: $actTemp desired: $setTemp"];
push @evtEt,[$mh{cHash},1,"battery:".($lbat?"low":"ok")];
push @evtEt,[$mh{cHash},1,"commReporting:$cRep"]; push @evtEt,[$mh{cHash},1,"commReporting:$cRep"];
push @evtEt,[$mh{cHash},1,"winOpenReporting:$wRep"]; push @evtEt,[$mh{cHash},1,"winOpenReporting:$wRep"];
push @evtEt,[$mh{cHash},1,"boostTime:$bTime"]; push @evtEt,[$mh{cHash},1,"boostTime:$bTime"];
push @evtEt,[$mh{devH},1,"battery:".($lbat?"low":"ok")];
push @evtEt,[$mh{devH},1,"desired-temp:$setTemp"]; push @evtEt,[$mh{devH},1,"desired-temp:$setTemp"];
} }
elsif($mh{mTp} eq "70"){ elsif($mh{mTp} eq "70"){
@ -1702,14 +1699,14 @@ sub CUL_HM_Parse($$) {#########################################################
push @evtEt,[$mh{shash},1,"level:$lvl"] if($mh{md} eq "HM-Sen-Wa-Od"); push @evtEt,[$mh{shash},1,"level:$lvl"] if($mh{md} eq "HM-Sen-Wa-Od");
push @evtEt,[$mh{shash},1,"state:$lvl"]; push @evtEt,[$mh{shash},1,"state:$lvl"];
push @evtEt,[$mh{shash},1,"battery:".($err&0x80?"low":"ok")] if (defined $err); push @evtEt,[$mh{devH},1,"battery:".($err&0x80?"low":"ok")] if (defined $err);
} }
} }
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{shash},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);
push @evtEt,[$mh{shash},1,"rawValue:$v"]; push @evtEt,[$mh{shash},1,"rawValue:$v"];
my $nextSeq = ReadingsVal($mh{devN},"Sequence",""); my $nextSeq = ReadingsVal($mh{devN},"Sequence","");
@ -2305,7 +2302,7 @@ sub CUL_HM_Parse($$) {#########################################################
else{ else{
push @evtEt,[$mh{shash},1,"cover:". (($err&0x0E)?"open" :"closed")]; push @evtEt,[$mh{shash},1,"cover:". (($err&0x0E)?"open" :"closed")];
} }
push @evtEt,[$mh{shash},1,"battery:". (($err&0x80)?"low" :"ok" )]; push @evtEt,[$mh{devH},1,"battery:". (($err&0x80)?"low" :"ok" )];
} }
elsif($mh{mTp} eq "41") {#01 is channel elsif($mh{mTp} eq "41") {#01 is channel
my($chn,$cnt,$bright) = (hex($mI[0]),hex($mI[1]),hex($mI[2])); my($chn,$cnt,$bright) = (hex($mI[0]),hex($mI[1]),hex($mI[2]));
@ -2460,7 +2457,7 @@ sub CUL_HM_Parse($$) {#########################################################
$state = " (uncertain)"; $state = " (uncertain)";
} }
push @evtEt,[$mh{shash},1,"unknown:40"] if($err&0x40); push @evtEt,[$mh{shash},1,"unknown:40"] if($err&0x40);
push @evtEt,[$mh{shash},1,"battery:" .(($err&0x80) ? "low":"ok")]; push @evtEt,[$mh{devH},1,"battery:" .(($err&0x80) ? "low":"ok")];
push @evtEt,[$mh{shash},1,"uncertain:" .(($err&0x30) ? "yes":"no")]; push @evtEt,[$mh{shash},1,"uncertain:" .(($err&0x30) ? "yes":"no")];
push @evtEt,[$mh{shash},1,"direction:" .$dir{($err>>4)&3}]; push @evtEt,[$mh{shash},1,"direction:" .$dir{($err>>4)&3}];
push @evtEt,[$mh{shash},1,"error:" . ($error)]; push @evtEt,[$mh{shash},1,"error:" . ($error)];
@ -2906,6 +2903,7 @@ sub CUL_HM_parseCommon(@){#####################################################
delete $chnhash->{helper}{getCfgList}; delete $chnhash->{helper}{getCfgList};
delete $chnhash->{helper}{getCfgListNo}; delete $chnhash->{helper}{getCfgListNo};
CUL_HM_rmOldRegs($chnName); CUL_HM_rmOldRegs($chnName);
$chnhash->{READINGS}{".peerListRDate"}{VAL} = $chnhash->{READINGS}{".peerListRDate"}{TIME} = TimeNow();
} }
else{ else{
CUL_HM_respPendToutProlong($mhp->{devH});#wasn't last - reschedule timer CUL_HM_respPendToutProlong($mhp->{devH});#wasn't last - reschedule timer
@ -3704,11 +3702,11 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
if ($sectIn eq "all") { if ($sectIn eq "all") {
@sectL = ("rssi","msgEvents","readings","attack");#readings is last - it schedules a reread possible @sectL = ("rssi","msgEvents","readings","attack");#readings is last - it schedules a reread possible
} }
elsif($sectIn =~ m/(rssi|trigger|msgEvents|readings|register|unknownDev|attack)/){ elsif($sectIn =~ m/(rssi|trigger|msgEvents|readings|oldRegs|register|unknownDev|attack)/){
@sectL = ($sectIn); @sectL = ($sectIn);
} }
else{ else{
return "unknown section. User readings, msgEvents or rssi"; return "unknown section:$sectIn. User rssi|trigger|msgEvents|readings|oldRegs|register|unknownDev|attack";
} }
foreach my $sect (@sectL){ foreach my $sect (@sectL){
if ($sect eq "readings"){ if ($sect eq "readings"){
@ -3738,6 +3736,11 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
CUL_HM_complConfig($h->{NAME}); CUL_HM_complConfig($h->{NAME});
} }
} }
elsif($sect eq "oldRegs"){
my @cN = ($name);
push @cN,$hash->{$_} foreach(grep /^channel/,keys %{$hash});
CUL_HM_refreshRegs($_) foreach (@cN);
}
elsif($sect eq "msgEvents"){ elsif($sect eq "msgEvents"){
CUL_HM_respPendRm($hash); CUL_HM_respPendRm($hash);
@ -6937,6 +6940,25 @@ sub CUL_HM_rmOldRegs($){ # remove register i outdated
delete $hash->{READINGS}{$_} foreach (grep /^R-$peer-/,keys %{$hash->{READINGS}}) delete $hash->{READINGS}{$_} foreach (grep /^R-$peer-/,keys %{$hash->{READINGS}})
} }
} }
sub CUL_HM_refreshRegs($){ # renew all register readings from Regl_
my $name = shift;
foreach(grep /\.?R-/,keys %{$defs{$name}{READINGS}}){
delete $defs{$name}{READINGS}{$_};
}
my $peers = ReadingsVal($name,"peerList","");
my $dH = CUL_HM_getDeviceHash($defs{$name});
foreach(grep /\.?RegL_/,keys %{$defs{$name}{READINGS}}){
my ($l,$p) = ($1,$2) if($_ =~ m/RegL_(..):(.*)/);
my $ps = $p;
$ps =~ s/_chn:.*//;
if (!$p || $peers =~ m /$ps/){
CUL_HM_updtRegDisp($defs{$name},$l,CUL_HM_name2Id($p,$dH));
}
else{
delete $defs{$name}{READINGS}{$_};# peer for This List not found
}
}
}
############################# #############################
#+++++++++++++++++ parameter cacculations +++++++++++++++++++++++++++++++++++++ #+++++++++++++++++ parameter cacculations +++++++++++++++++++++++++++++++++++++

View File

@ -978,7 +978,7 @@ sub HMinfo_GetFn($@) {#########################################################
my @IOlist; my @IOlist;
my @plSum; push @plSum,0 for (0..9);#prefill my @plSum; push @plSum,0 for (0..9);#prefill
my $maxNlen = 3; my $maxNlen = 3;
foreach my $dName (HMinfo_getEntities($opt."d",$filter)){ foreach my $dName (HMinfo_getEntities($opt."dv",$filter)){
my $id = $defs{$dName}{DEF}; my $id = $defs{$dName}{DEF};
my $nl = length($dName); my $nl = length($dName);
$maxNlen = $nl if($nl > $maxNlen); $maxNlen = $nl if($nl > $maxNlen);
@ -1166,8 +1166,8 @@ sub HMinfo_GetFn($@) {#########################################################
grep /^trigDst_/, grep /^trigDst_/,
keys %{$defs{$dName}{READINGS}})){ keys %{$defs{$dName}{READINGS}})){
push @peerUndef,"$dName triggers $_" push @peerUndef,"$dName triggers $_"
if( ($peerIDs && $peerIDs !~ m/$_/) if( ($peerIDs && $peerIDs !~ m/$_/)
||("CCU-FHEM" ne AttrVal(CUL_HM_id2Name($_),"model",""))); &&("CCU-FHEM" ne AttrVal(CUL_HM_id2Name($_),"model","")));
} }
#--- check regular references #--- check regular references
@ -1359,7 +1359,7 @@ sub HMinfo_SetFn($@) {#########################################################
} }
if ($type ne "msgStat"){ if ($type ne "msgStat"){
return "unknown parameter - use Protocol, readings, msgStat, register, rssi or all" return "unknown parameter - use Protocol, readings, msgStat, register, rssi or all"
if ($type !~ m/^(Protocol|readings|register|rssi|all|trigger)$/); if ($type !~ m/^(Protocol|readings|register|oldRegs|rssi|all|trigger)$/);
$opt .= "d" if ($type =~ m/(Protocol|rssi)/);# readings apply to all, others device only $opt .= "d" if ($type =~ m/(Protocol|rssi)/);# readings apply to all, others device only
my @entities; my @entities;
$type = "msgEvents" if ($type eq "Protocol");# translate parameter $type = "msgEvents" if ($type eq "Protocol");# translate parameter
@ -1663,9 +1663,10 @@ sub HMinfo_loadConfig($@) {####################################################
next if ( $line !~ m/set .* (peerBulk|regBulk) .*/ next if ( $line !~ m/set .* (peerBulk|regBulk) .*/
&& $line !~ m/(setreading|template.e.) .*/); && $line !~ m/(setreading|template.e.) .*/);
my ($command,$timeStamp) = split("#",$line,2); my ($command,$timeStamp) = split("#",$line,2);
$timeStamp = "1900-01-01 00:00:01" if (!$timeStamp || $timeStamp !~ m /^20..-..-.. /);
my ($cmd1,$eN,$cmd,$param) = split(" ",$command,4); my ($cmd1,$eN,$cmd,$param) = split(" ",$command,4);
next if ($eN !~ m/$filter/); next if ($eN !~ m/$filter/);
if ($cmd1 !~ m /^template(Def|Set)$/ && (!$eN || !$defs{$eN})){ if ($cmd1 !~ m /^template(Def|Set)$/ && (!$eN || !$defs{$eN})){
push @entryNF,$eN; push @entryNF,$eN;
next; next;
} }
@ -1675,7 +1676,7 @@ sub HMinfo_loadConfig($@) {####################################################
$changes{$eN}{$cmd}{t}=$timeStamp ; $changes{$eN}{$cmd}{t}=$timeStamp ;
} }
$defs{$eN}{READINGS}{$cmd}{VAL} = $param; $defs{$eN}{READINGS}{$cmd}{VAL} = $param;
$defs{$eN}{READINGS}{$cmd}{TIME} = "from archive"; $defs{$eN}{READINGS}{$cmd}{TIME} = "from archivexx";
} }
elsif($cmd1 eq "templateDef"){ elsif($cmd1 eq "templateDef"){
if ($eN eq "templateStart"){#if new block we remove all old templates if ($eN eq "templateStart"){#if new block we remove all old templates
@ -1701,9 +1702,11 @@ sub HMinfo_loadConfig($@) {####################################################
push @elincmpl,"$eN peerList"; push @elincmpl,"$eN peerList";
next; next;
} }
if (!AttrVal($eN,"peerIDs","")){ if ( $timeStamp
&& $timeStamp gt ReadingsTimestamp($eN,".peerListRDate","1900-01-01 00:00:01")){
CUL_HM_ID2PeerList($eN,$_,1) foreach (grep /[0-9A-F]{8}/,split(",",$param)); CUL_HM_ID2PeerList($eN,$_,1) foreach (grep /[0-9A-F]{8}/,split(",",$param));
push @el,"$eN peerIDs"; push @el,"$eN peerIDs";
$defs{$eN}{READINGS}{".peerListRDate"}{VAL} = $defs{$eN}{READINGS}{".peerListRDate"}{TIME} = $timeStamp;
} }
} }
elsif($cmd eq "regBulk"){ elsif($cmd eq "regBulk"){
@ -1721,12 +1724,16 @@ sub HMinfo_loadConfig($@) {####################################################
push @elincmpl,"$eN reg list:$reg"; push @elincmpl,"$eN reg list:$reg";
next; next;
} }
my $ts = ReadingsTimestamp($eN,$reg,"1900-01-01 00:00:01");
$ts = "1900-01-01 00:00:00" if ($ts !~ m /^20..-..-.. /);
if ( !$defs{$eN}{READINGS}{$reg} if ( !$defs{$eN}{READINGS}{$reg}
|| $defs{$eN}{READINGS}{$reg}{VAL} !~ m/00:00/ || $defs{$eN}{READINGS}{$reg}{VAL} !~ m/00:00/
|| ( $timeStamp || ( ( $timeStamp gt $ts
&& $timeStamp gt ReadingsTimestamp($eN,$reg,"1900-01-01 00:00:01") ||( $changes{$eN}
)){ && $changes{$eN}{$reg}
&& $timeStamp gt $changes{$eN}{$reg}{t})
))){
$data =~ s/ //g;
$changes{$eN}{$reg}{d}=$data; $changes{$eN}{$reg}{d}=$data;
$changes{$eN}{$reg}{t}=$timeStamp; $changes{$eN}{$reg}{t}=$timeStamp;
} }
@ -1909,7 +1916,7 @@ sub HMinfo_bpAbort($) {#bp timeout ############################################
sub HMinfo_templateDef(@){##################################################### sub HMinfo_templateDef(@){#####################################################
my ($name,$param,$desc,@regs) = @_; my ($name,$param,$desc,@regs) = @_;
return "insufficient parameter" if(!defined $param); return "insufficient parameter, no param" if(!defined $param);
$HMConfig::culHmTpl{tmplDefChange} = 1;# signal we have a change! $HMConfig::culHmTpl{tmplDefChange} = 1;# signal we have a change!
if ($param eq "del"){ if ($param eq "del"){
delete $HMConfig::culHmTpl{$name}; delete $HMConfig::culHmTpl{$name};
@ -1951,7 +1958,7 @@ sub HMinfo_templateDef(@){#####################################################
splice @regs,0,$cnt; splice @regs,0,$cnt;
} }
return "insufficient parameter" if(@regs < 1); return "insufficient parameter, regs missing" if(@regs < 1);
my $paramNo; my $paramNo;
if($param ne "0"){ if($param ne "0"){
@ -2059,7 +2066,8 @@ sub HMinfo_templateUsg(@){#####################################################
elsif($tFilter ne $t){ elsif($tFilter ne $t){
next;} next;}
} }
else{ push @ul,sprintf("%-20s|%-15s|%s|%s",$dName,$p,$t,$defs{$dName}{helper}{tmpl}{$tid});} else{
push @ul,sprintf("%-20s|%-15s|%s|%s",$dName,$p,$t,$defs{$dName}{helper}{tmpl}{$tid});}
} }
} }
return join("\n",sort(@ul)); return join("\n",sort(@ul));

View File

@ -1391,7 +1391,6 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"};
%culHmVrtGets = ( %culHmVrtGets = (
param => "<param>", param => "<param>",
cmdList => "", cmdList => "",
saveConfig => "<filename> ...",
); );
%culHmSubTypeGets = ( %culHmSubTypeGets = (
none4Type =>{ "test"=>"" }, none4Type =>{ "test"=>"" },
@ -1409,13 +1408,11 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"};
,getRegRaw => "[List0|List1|List2|List3|List4|List5|List6] ... [<PeerChannel>]" ,getRegRaw => "[List0|List1|List2|List3|List4|List5|List6] ... [<PeerChannel>]"
,getConfig => "" ,getConfig => ""
,regSet => "[prep|exec] <regName> <value> ... [<peerChannel>]" ,regSet => "[prep|exec] <regName> <value> ... [<peerChannel>]"
,clear => "[readings|trigger|register|rssi|msgEvents|attack|all]" ,clear => "[readings|trigger|register|oldRegs|rssi|msgEvents|attack|all]"
); );
%culHmGlobalSetsVrtDev = (# virtuals and devices without subtype %culHmGlobalSetsVrtDev = (# virtuals and devices without subtype
raw => "data ..." virtual => "<noButtons>"
,virtual => "<noButtons>"
,clear => "[readings|rssi|msgEvents|unknownDev]" ,clear => "[readings|rssi|msgEvents|unknownDev]"
,deviceRename => "newName"
); );
%culHmGlobalSetsDevice = (# all devices but virtuals %culHmGlobalSetsDevice = (# all devices but virtuals
raw => "data ..." raw => "data ..."
@ -1656,7 +1653,6 @@ $culHmModelSets{"ROTO_ZEL-STG-RM-DWT-10"}= $culHmModelSets{"HM-PB-4DIS-WM"};
,hmPairForSec =>"<sec> ..." ,hmPairForSec =>"<sec> ..."
,hmPairSerial =>"<serial>" ,hmPairSerial =>"<serial>"
,defIgnUnknown =>"" ,defIgnUnknown =>""
,virtual =>"<noButtons>"
,assignIO =>"<IO> [set|unset]..." ,assignIO =>"<IO> [set|unset]..."
} }
,"HM-LC-RGBW-WM01" =>{ "on-for-timer" =>"<ontime> [<ramptime>]..." ,"HM-LC-RGBW-WM01" =>{ "on-for-timer" =>"<ontime> [<ramptime>]..."