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" =>" []..."