From 7d3c888d8378f452a0d8ea4f58da3b588dd1a3ec Mon Sep 17 00:00:00 2001
From: martinp876 <>
Date: Tue, 27 Oct 2015 12:31:35 +0000
Subject: [PATCH] CUL_HM:templatehandling, expert attribut bugfix
git-svn-id: https://svn.fhem.de/fhem/trunk@9697 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/10_CUL_HM.pm | 50 ++++++++++++++++++++++++++++++------------
fhem/FHEM/98_HMinfo.pm | 36 ++++++++++++++++++------------
fhem/FHEM/HMConfig.pm | 8 ++-----
3 files changed, 60 insertions(+), 34 deletions(-)
diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm
index ba6f0afd0..b81b9881f 100755
--- a/fhem/FHEM/10_CUL_HM.pm
+++ b/fhem/FHEM/10_CUL_HM.pm
@@ -278,6 +278,7 @@ sub CUL_HM_updateConfig($){
}
}
elsif ($md =~ m/(CCU-FHEM)/){
+ $hash->{helper}{role}{vrt} = 1;
if($hash->{helper}{role}{dev}){
CUL_HM_UpdtCentral($name); # first update, then keys
if(eval "defined(&HMLAN_writeAesKey)"){
@@ -833,10 +834,6 @@ sub CUL_HM_AttrCheck(@) {############################
return " $attrName only valid for devices"
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;
}
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');
}
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
($mh{p} =~ m/^0402000000000501/)) { # paramchanged L5
@@ -1476,8 +1473,8 @@ sub CUL_HM_Parse($$) {#########################################################
elsif($mh{md} =~ m/HM-CC-RT-DN/) { ##########################################
my %ctlTbl=( 0=>"auto", 1=>"manual", 2=>"party",3=>"boost");
- if ( ($mh{mTyp} eq "100A") #info-level/
- ||($mh{mTyp} eq "0201")){#ackInfo
+ if( ($mh{mTyp} eq "100A") #info-level/
+ ||($mh{mTyp} eq "0201")){#ackInfo
my ($err ,$ctrlMode ,$setTemp ,$bTime,$pTemp,$pStart,$pEnd,$chn,$uk0,$lBat,$actTemp,$vp) =
(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,"controlMode:$ctlTbl{$ctrlMode}"];
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,"winOpenReporting:$wRep"];
push @evtEt,[$mh{cHash},1,"boostTime:$bTime"];
+ push @evtEt,[$mh{devH},1,"battery:".($lbat?"low":"ok")];
push @evtEt,[$mh{devH},1,"desired-temp:$setTemp"];
}
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,"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") { ############################################
if ($mh{mTp} eq "53"){
if($mh{p} =~ m/(..)4(.)0200(..)(..)(..)/) {
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);
push @evtEt,[$mh{shash},1,"rawValue:$v"];
my $nextSeq = ReadingsVal($mh{devN},"Sequence","");
@@ -2305,7 +2302,7 @@ sub CUL_HM_Parse($$) {#########################################################
else{
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
my($chn,$cnt,$bright) = (hex($mI[0]),hex($mI[1]),hex($mI[2]));
@@ -2460,7 +2457,7 @@ sub CUL_HM_Parse($$) {#########################################################
$state = " (uncertain)";
}
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,"direction:" .$dir{($err>>4)&3}];
push @evtEt,[$mh{shash},1,"error:" . ($error)];
@@ -2906,6 +2903,7 @@ sub CUL_HM_parseCommon(@){#####################################################
delete $chnhash->{helper}{getCfgList};
delete $chnhash->{helper}{getCfgListNo};
CUL_HM_rmOldRegs($chnName);
+ $chnhash->{READINGS}{".peerListRDate"}{VAL} = $chnhash->{READINGS}{".peerListRDate"}{TIME} = TimeNow();
}
else{
CUL_HM_respPendToutProlong($mhp->{devH});#wasn't last - reschedule timer
@@ -3704,11 +3702,11 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
if ($sectIn eq "all") {
@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);
}
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){
if ($sect eq "readings"){
@@ -3738,6 +3736,11 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
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"){
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}})
}
}
+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 +++++++++++++++++++++++++++++++++++++
diff --git a/fhem/FHEM/98_HMinfo.pm b/fhem/FHEM/98_HMinfo.pm
index d6be4ad67..e5e288e35 100644
--- a/fhem/FHEM/98_HMinfo.pm
+++ b/fhem/FHEM/98_HMinfo.pm
@@ -978,7 +978,7 @@ sub HMinfo_GetFn($@) {#########################################################
my @IOlist;
my @plSum; push @plSum,0 for (0..9);#prefill
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 $nl = length($dName);
$maxNlen = $nl if($nl > $maxNlen);
@@ -1166,8 +1166,8 @@ sub HMinfo_GetFn($@) {#########################################################
grep /^trigDst_/,
keys %{$defs{$dName}{READINGS}})){
push @peerUndef,"$dName triggers $_"
- if( ($peerIDs && $peerIDs !~ m/$_/)
- ||("CCU-FHEM" ne AttrVal(CUL_HM_id2Name($_),"model","")));
+ if( ($peerIDs && $peerIDs !~ m/$_/)
+ &&("CCU-FHEM" ne AttrVal(CUL_HM_id2Name($_),"model","")));
}
#--- check regular references
@@ -1359,7 +1359,7 @@ sub HMinfo_SetFn($@) {#########################################################
}
if ($type ne "msgStat"){
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
my @entities;
$type = "msgEvents" if ($type eq "Protocol");# translate parameter
@@ -1663,9 +1663,10 @@ sub HMinfo_loadConfig($@) {####################################################
next if ( $line !~ m/set .* (peerBulk|regBulk) .*/
&& $line !~ m/(setreading|template.e.) .*/);
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);
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;
next;
}
@@ -1675,7 +1676,7 @@ sub HMinfo_loadConfig($@) {####################################################
$changes{$eN}{$cmd}{t}=$timeStamp ;
}
$defs{$eN}{READINGS}{$cmd}{VAL} = $param;
- $defs{$eN}{READINGS}{$cmd}{TIME} = "from archive";
+ $defs{$eN}{READINGS}{$cmd}{TIME} = "from archivexx";
}
elsif($cmd1 eq "templateDef"){
if ($eN eq "templateStart"){#if new block we remove all old templates
@@ -1701,9 +1702,11 @@ sub HMinfo_loadConfig($@) {####################################################
push @elincmpl,"$eN peerList";
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));
push @el,"$eN peerIDs";
+ $defs{$eN}{READINGS}{".peerListRDate"}{VAL} = $defs{$eN}{READINGS}{".peerListRDate"}{TIME} = $timeStamp;
}
}
elsif($cmd eq "regBulk"){
@@ -1721,12 +1724,16 @@ sub HMinfo_loadConfig($@) {####################################################
push @elincmpl,"$eN reg list:$reg";
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}
|| $defs{$eN}{READINGS}{$reg}{VAL} !~ m/00:00/
- || ( $timeStamp
- && $timeStamp gt ReadingsTimestamp($eN,$reg,"1900-01-01 00:00:01")
- )){
+ || ( ( $timeStamp gt $ts
+ ||( $changes{$eN}
+ && $changes{$eN}{$reg}
+ && $timeStamp gt $changes{$eN}{$reg}{t})
+ ))){
+ $data =~ s/ //g;
$changes{$eN}{$reg}{d}=$data;
$changes{$eN}{$reg}{t}=$timeStamp;
}
@@ -1909,7 +1916,7 @@ sub HMinfo_bpAbort($) {#bp timeout ############################################
sub HMinfo_templateDef(@){#####################################################
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!
if ($param eq "del"){
delete $HMConfig::culHmTpl{$name};
@@ -1951,7 +1958,7 @@ sub HMinfo_templateDef(@){#####################################################
splice @regs,0,$cnt;
}
- return "insufficient parameter" if(@regs < 1);
+ return "insufficient parameter, regs missing" if(@regs < 1);
my $paramNo;
if($param ne "0"){
@@ -2059,7 +2066,8 @@ sub HMinfo_templateUsg(@){#####################################################
elsif($tFilter ne $t){
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));
diff --git a/fhem/FHEM/HMConfig.pm b/fhem/FHEM/HMConfig.pm
index e118c2820..ca5aab083 100644
--- a/fhem/FHEM/HMConfig.pm
+++ b/fhem/FHEM/HMConfig.pm
@@ -1391,7 +1391,6 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"};
%culHmVrtGets = (
param => "",
cmdList => "",
- saveConfig => " ...",
);
%culHmSubTypeGets = (
none4Type =>{ "test"=>"" },
@@ -1409,13 +1408,11 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"};
,getRegRaw => "[List0|List1|List2|List3|List4|List5|List6] ... []"
,getConfig => ""
,regSet => "[prep|exec] ... []"
- ,clear => "[readings|trigger|register|rssi|msgEvents|attack|all]"
+ ,clear => "[readings|trigger|register|oldRegs|rssi|msgEvents|attack|all]"
);
%culHmGlobalSetsVrtDev = (# virtuals and devices without subtype
- raw => "data ..."
- ,virtual => ""
+ virtual => ""
,clear => "[readings|rssi|msgEvents|unknownDev]"
- ,deviceRename => "newName"
);
%culHmGlobalSetsDevice = (# all devices but virtuals
raw => "data ..."
@@ -1656,7 +1653,6 @@ $culHmModelSets{"ROTO_ZEL-STG-RM-DWT-10"}= $culHmModelSets{"HM-PB-4DIS-WM"};
,hmPairForSec =>" ..."
,hmPairSerial =>""
,defIgnUnknown =>""
- ,virtual =>""
,assignIO =>" [set|unset]..."
}
,"HM-LC-RGBW-WM01" =>{ "on-for-timer" =>" []..."