From 8b8de633082c70f7e12ed78fe124f0e8f132cf1f Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Sun, 25 Oct 2015 13:28:26 +0000 Subject: [PATCH] CUL_HM:update RGB sensor git-svn-id: https://svn.fhem.de/fhem/trunk@9664 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_CUL_HM.pm | 34 +++++++++++++-------- fhem/FHEM/98_HMinfo.pm | 69 ++++++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 31 deletions(-) diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index 2bd8a2e48..bc07b4696 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -597,18 +597,22 @@ sub CUL_HM_Attr(@) {################################# else{ ($nTag,$grp) = (".","R-")} foreach my $rdEntry (grep /^$grp/ ,keys %{$tHash->{READINGS}}){ my $reg = $rdEntry; - $reg =~ s/.*-//; + my $p = ""; + $p = "-".$1 if($rdEntry =~m /R-(.*)-(lg|sh)/); + $reg =~ s/\.?R-.*?-//; next if(!$culHmRegDefine->{$reg} || $culHmRegDefine->{$reg}{d} eq '0'); - $tHash->{READINGS}{$nTag."R-".$reg} = $tHash->{READINGS}{$rdEntry}; + $tHash->{READINGS}{$nTag."R-$p".$reg} = $tHash->{READINGS}{$rdEntry}; delete $tHash->{READINGS}{$rdEntry}; } if ($tHash->{helper}{expert}{det}){($nTag,$grp) = ("",".R-")} else{ ($nTag,$grp) = (".","R-")} foreach my $rdEntry (grep /^$grp/ ,keys %{$tHash->{READINGS}}){ my $reg = $rdEntry; - $reg =~ s/.*-//; + my $p = ""; + $p = "-".$1 if($rdEntry =~m /R-(.*)-(lg|sh)/); + $reg =~ s/\.?R-.*?-//; next if(!$culHmRegDefine->{$reg} || $culHmRegDefine->{$reg}{d} eq '1'); - $tHash->{READINGS}{$nTag."R-".$reg} = $tHash->{READINGS}{$rdEntry}; + $tHash->{READINGS}{$nTag."R$p-".$reg} = $tHash->{READINGS}{$rdEntry}; delete $tHash->{READINGS}{$rdEntry}; } if ($tHash->{helper}{expert}{raw}){($nTag,$grp) = ("",".RegL_")} @@ -3485,13 +3489,16 @@ sub CUL_HM_Get($@) {#+++++++++++++++++ get command+++++++++++++++++++++++++++++ $timestamps .= "\n# " .InternalVal($eName,"peerList","") ." :peerList"; - print aSave "\nset ".$eName." peerBulk ".$pIds; - } + print aSave "\nset $eName peerBulk $pIds#" + .ReadingsTimestamp($eName,"peerList","1900-01-01 00:00:01"); + } my $ehash = $defs{$eName}; foreach my $read (sort grep(/^[\.]?RegL_/,keys %{$ehash->{READINGS}})){ - print aSave "\nset ".$eName." regBulk ".$read." " - .ReadingsVal($eName,$read,""); - $timestamps .= "\n# ".ReadingsTimestamp($eName,$read,"")." :".$read; + my $ts = ReadingsTimestamp($eName,$read,"1900-01-01 00:00:01"); + print aSave "\nset $eName regBulk $read" + ." ".ReadingsVal($eName,$read,"") + ." #$ts"; + $timestamps .= "\n# $ts :$read"; } print aSave $timestamps; } @@ -3891,6 +3898,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ if ($a[3] && $a[3] !~ m/^(set|unset)/); my $set = ($a[3] && $a[3] eq "unset")?"02":"01"; foreach my $peer (grep(!/^self/,split(',',$pL))){ + last if($peer =~ m/^#/); my $pID = CUL_HM_peerChId($peer,$dst); return "unknown peer".$peer if (length($pID) != 8);# peer only to channel my $pCh1 = substr($pID,6,2); @@ -3951,6 +3959,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++ shift @adIn;shift @adIn;shift @adIn; my $adList; foreach my $ad (sort @adIn){ + last if($ad =~ m/^#/); ($addr,$data) = split(":",$ad); $adList .= sprintf("%02X%02X",hex($addr),hex($data)) if ($addr ne "00"); return "wrong addr or data:".$ad if (hex($addr)>255 || hex($data)>255); @@ -6861,8 +6870,9 @@ sub CUL_HM_updtRegDisp($$$) { my $name = $hash->{NAME}; my $devId = substr(CUL_HM_name2Id($name),0,6); my $ioId = CUL_HM_IoId(CUL_HM_id2Hash($devId)); - my $pReg = ($peerId && $peerId ne '00000000' )? - CUL_HM_peerChName($peerId,$devId)."-":""; + my $pReg = ($peerId && $peerId ne '00000000' ) + ? CUL_HM_peerChName($peerId,$devId)."-" + : ""; $pReg=~s/:/-/; $pReg="R-".$pReg; my $devName =CUL_HM_getDeviceHash($hash)->{NAME};# devName as protocol entity @@ -8097,7 +8107,7 @@ sub CUL_HM_reglUsed($) {# provide data for HMinfo if ($hash->{helper}{role}{dev}){ push @lsNo,"0:"; } - elsif ($hash->{helper}{role}{chn}){ + if ($hash->{helper}{role}{chn}){ foreach my $ls (split ",",$culHmModel->{$mId}{lst}){ my ($l,$c) = split":",$ls; if ($l ne "p"){# ignore peer-only entries diff --git a/fhem/FHEM/98_HMinfo.pm b/fhem/FHEM/98_HMinfo.pm index 1430d856f..8151e53e6 100644 --- a/fhem/FHEM/98_HMinfo.pm +++ b/fhem/FHEM/98_HMinfo.pm @@ -1586,8 +1586,7 @@ sub HMinfo_verifyConfig($@) {################################################## next if($param !~ m/RegL_0[0-9]:/); $param =~ s/\.RegL/RegL/; my ($reg,$data) = split(" ",$param,2); - my $exp = CUL_HM_getAttrInt($eN,"expert"); - my $eReg = ReadingsVal($eN,(($exp != 2)?".":"").$reg,""); + my $eReg = ReadingsVal($eN,($defs{$eN}{helper}{expert}{raw}?"":".").$reg,""); my ($ensp,$dnsp) = ($eReg,$data); $ensp =~ s/ //g; $dnsp =~ s/ //g; @@ -1662,14 +1661,18 @@ sub HMinfo_loadConfig($@) {#################################################### $line =~ s/\r//g; next if ( $line !~ m/set .* (peerBulk|regBulk) .*/ && $line !~ m/(setreading|template.e.) .*/); - my ($cmd1,$eN,$cmd,$param) = split(" ",$line,4); + my ($command,$timeStamp) = split("#",$line,2); + my ($cmd1,$eN,$cmd,$param) = split(" ",$command,4); next if ($eN !~ m/$filter/); if ($cmd1 !~ m /^template(Def|Set)$/ && (!$eN || !$defs{$eN})){ push @entryNF,$eN; next; } if ($cmd1 eq "setreading"){ - $changes{$eN}{$cmd}=$param if (!$defs{$eN}{READINGS}{$cmd}); + if (!$defs{$eN}{READINGS}{$cmd}){ + $changes{$eN}{$cmd}{d}=$param ; + $changes{$eN}{$cmd}{t}=$timeStamp ; + } $defs{$eN}{READINGS}{$cmd}{VAL} = $param; $defs{$eN}{READINGS}{$cmd}{TIME} = "from archive"; } @@ -1704,31 +1707,35 @@ sub HMinfo_loadConfig($@) {#################################################### } elsif($cmd eq "regBulk"){ next if($param !~ m/RegL_0[0-9]:/); - my $exp = CUL_HM_getAttrInt($eN,"expert"); $param =~ s/\.RegL/RegL/; - $param =~ s/RegL/\.RegL/ if ($exp != 2); + $param = ".".$param if (!$defs{$eN}{helper}{expert}{raw}); my ($reg,$data) = split(" ",$param,2); my @rla = CUL_HM_reglUsed($eN); next if (!$rla[0]); my $rl = join",",@rla; my $r2 = $reg; $r2 =~ s/^\.//; - next if ($rl !~ m/$r2/); - if ($data !~ m/00:00/){ push @elincmpl,"$eN reg list:$reg"; next; } - $changes{$eN}{$reg}=$data if (!$defs{$eN}{READINGS}{$reg} || - $defs{$eN}{READINGS}{$reg}{VAL} !~ m/00:00/); + + 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") + )){ + $changes{$eN}{$reg}{d}=$data; + $changes{$eN}{$reg}{t}=$timeStamp; + } } } close(rFile); foreach my $eN (keys %changes){ foreach my $reg (keys %{$changes{$eN}}){ - $defs{$eN}{READINGS}{$reg}{VAL} = $changes{$eN}{$reg}; - $defs{$eN}{READINGS}{$reg}{TIME} = "from archive"; + $defs{$eN}{READINGS}{$reg}{VAL} = $changes{$eN}{$reg}{d}; + $defs{$eN}{READINGS}{$reg}{TIME} = $changes{$eN}{$reg}{t}; my ($list,$pN) = ($1,$2) if ($reg =~ m/RegL_(..):(.*)/); next if (!$list); my $pId = CUL_HM_peerChId($pN,substr($defs{$eN}{DEF},0,6)); @@ -1765,8 +1772,9 @@ sub HMinfo_purgeConfig($) {#################################################### my $line = $_; $line =~ s/\r//g; next if ( $line !~ m/set (.*) (peerBulk|regBulk) (.*)/ - && $line !~ m/(setreading) .*/);#&& $line !~ m/(setreading|templateDef) .*/); - my ($cmd,$eN,$typ,$p1,$p2) = split(" ",$line,5); + && $line !~ m/(setreading) .*/); + my ($command,$timeStamp) = split("#",$line,2); + my ($cmd,$eN,$typ,$p1,$p2) = split(" ",$command,5); if ($cmd eq "set" && $typ eq "regBulk"){ $p1 =~ s/\.RegL_/RegL_/; $typ .= " $p1"; @@ -1775,7 +1783,7 @@ sub HMinfo_purgeConfig($) {#################################################### elsif ($cmd eq "set" && $typ eq "peerBulk"){ delete $purgeH{$eN}{$cmd}{regBulk};# regBulk needs to be rewritten } - $purgeH{$eN}{$cmd}{$typ} = $p1; + $purgeH{$eN}{$cmd}{$typ} = $p1.($timeStamp?"#$timeStamp":""); } close(aSave); open(aSave, ">$fName") || return("Can't open $fName: $!"); @@ -1906,6 +1914,30 @@ sub HMinfo_templateDef(@){##################################################### delete $HMConfig::culHmTpl{$name}; return; } + return "$name already defined, delete it first" if($HMConfig::culHmTpl{$name}); + if ($param eq "fromMaster"){#set hm templateDef fromMaster <(peer:long|0)> + my ($master,$pl) = ($desc,@regs); + return "master $master not defined" if(!$defs{$master}); + @regs = (); + if ($pl eq "0"){ + foreach my $rdN (grep !/^\.?R-.*-(sh|lg)/,grep /^\.?R-/,keys %{$defs{$master}{READINGS}}){ + my $rdP = $rdN; + $rdP =~ s/^\.?R-//; + push @regs,"$rdP:$defs{$master}{READINGS}{$rdN}{VAL}"; + } + } + else{ + my ($peer,$shlg) = split(":",$pl,2); + $shlg = ($shlg eq "short"?"sh":($shlg eq "long"?"lg":"")); + foreach my $rdN (grep /^\.?R-$peer-$shlg/,keys %{$defs{$master}{READINGS}}){ + my $rdP = $rdN; + $rdP =~ s/^\.?R-$peer-$shlg//; + push @regs,"$rdP:$defs{$master}{READINGS}{$rdN}{VAL}"; + } + } + $param = "0"; + $desc = "from Master $name > $pl"; + } # get description if marked wir "" if ($desc =~ m/^"/){ my $cnt = 0; @@ -1918,7 +1950,6 @@ sub HMinfo_templateDef(@){##################################################### splice @regs,0,$cnt; } - return "$name already defined, delete it first" if($HMConfig::culHmTpl{$name}); return "insufficient parameter" if(@regs < 1); my $paramNo; @@ -2018,16 +2049,16 @@ sub HMinfo_templateUsg(@){##################################################### my ($p,$t) = split(">",$tid); if($tFilter){ if($tFilter eq "sortTemplate"){ - push @ul,sprintf("%20s|%-15s|%s|%s",$t,$dName,$p,$defs{$dName}{helper}{tmpl}{$tid}); + push @ul,sprintf("%-20s|%-15s|%s|%s",$t,$dName,$p,$defs{$dName}{helper}{tmpl}{$tid}); } if($tFilter eq "sortPeer"){ my ($pn,$ls) = split(":",$p); - push @ul,sprintf("%20s|%-15s|%5s:%-20s|%s",$pn,$t,$ls,$dName,$defs{$dName}{helper}{tmpl}{$tid}); + push @ul,sprintf("%-20s|%-15s|%5s:%-20s|%s",$pn,$t,$ls,$dName,$defs{$dName}{helper}{tmpl}{$tid}); } 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));