2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-04 14:13:18 +00:00

CUL_HM:update RGB sensor

git-svn-id: https://svn.fhem.de/fhem/trunk@9664 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2015-10-25 13:28:26 +00:00
parent f936668d8a
commit 8b8de63308
2 changed files with 72 additions and 31 deletions

View File

@ -597,18 +597,22 @@ sub CUL_HM_Attr(@) {#################################
else{ ($nTag,$grp) = (".","R-")} else{ ($nTag,$grp) = (".","R-")}
foreach my $rdEntry (grep /^$grp/ ,keys %{$tHash->{READINGS}}){ foreach my $rdEntry (grep /^$grp/ ,keys %{$tHash->{READINGS}}){
my $reg = $rdEntry; 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'); 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}; delete $tHash->{READINGS}{$rdEntry};
} }
if ($tHash->{helper}{expert}{det}){($nTag,$grp) = ("",".R-")} if ($tHash->{helper}{expert}{det}){($nTag,$grp) = ("",".R-")}
else{ ($nTag,$grp) = (".","R-")} else{ ($nTag,$grp) = (".","R-")}
foreach my $rdEntry (grep /^$grp/ ,keys %{$tHash->{READINGS}}){ foreach my $rdEntry (grep /^$grp/ ,keys %{$tHash->{READINGS}}){
my $reg = $rdEntry; 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'); 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}; delete $tHash->{READINGS}{$rdEntry};
} }
if ($tHash->{helper}{expert}{raw}){($nTag,$grp) = ("",".RegL_")} if ($tHash->{helper}{expert}{raw}){($nTag,$grp) = ("",".RegL_")}
@ -3485,13 +3489,16 @@ sub CUL_HM_Get($@) {#+++++++++++++++++ get command+++++++++++++++++++++++++++++
$timestamps .= "\n# " $timestamps .= "\n# "
.InternalVal($eName,"peerList","") .InternalVal($eName,"peerList","")
." :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}; my $ehash = $defs{$eName};
foreach my $read (sort grep(/^[\.]?RegL_/,keys %{$ehash->{READINGS}})){ foreach my $read (sort grep(/^[\.]?RegL_/,keys %{$ehash->{READINGS}})){
print aSave "\nset ".$eName." regBulk ".$read." " my $ts = ReadingsTimestamp($eName,$read,"1900-01-01 00:00:01");
.ReadingsVal($eName,$read,""); print aSave "\nset $eName regBulk $read"
$timestamps .= "\n# ".ReadingsTimestamp($eName,$read,"")." :".$read; ." ".ReadingsVal($eName,$read,"")
." #$ts";
$timestamps .= "\n# $ts :$read";
} }
print aSave $timestamps; print aSave $timestamps;
} }
@ -3891,6 +3898,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
if ($a[3] && $a[3] !~ m/^(set|unset)/); if ($a[3] && $a[3] !~ m/^(set|unset)/);
my $set = ($a[3] && $a[3] eq "unset")?"02":"01"; my $set = ($a[3] && $a[3] eq "unset")?"02":"01";
foreach my $peer (grep(!/^self/,split(',',$pL))){ foreach my $peer (grep(!/^self/,split(',',$pL))){
last if($peer =~ m/^#/);
my $pID = CUL_HM_peerChId($peer,$dst); my $pID = CUL_HM_peerChId($peer,$dst);
return "unknown peer".$peer if (length($pID) != 8);# peer only to channel return "unknown peer".$peer if (length($pID) != 8);# peer only to channel
my $pCh1 = substr($pID,6,2); my $pCh1 = substr($pID,6,2);
@ -3951,6 +3959,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
shift @adIn;shift @adIn;shift @adIn; shift @adIn;shift @adIn;shift @adIn;
my $adList; my $adList;
foreach my $ad (sort @adIn){ foreach my $ad (sort @adIn){
last if($ad =~ m/^#/);
($addr,$data) = split(":",$ad); ($addr,$data) = split(":",$ad);
$adList .= sprintf("%02X%02X",hex($addr),hex($data)) if ($addr ne "00"); $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); 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 $name = $hash->{NAME};
my $devId = substr(CUL_HM_name2Id($name),0,6); my $devId = substr(CUL_HM_name2Id($name),0,6);
my $ioId = CUL_HM_IoId(CUL_HM_id2Hash($devId)); my $ioId = CUL_HM_IoId(CUL_HM_id2Hash($devId));
my $pReg = ($peerId && $peerId ne '00000000' )? my $pReg = ($peerId && $peerId ne '00000000' )
CUL_HM_peerChName($peerId,$devId)."-":""; ? CUL_HM_peerChName($peerId,$devId)."-"
: "";
$pReg=~s/:/-/; $pReg=~s/:/-/;
$pReg="R-".$pReg; $pReg="R-".$pReg;
my $devName =CUL_HM_getDeviceHash($hash)->{NAME};# devName as protocol entity 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}){ if ($hash->{helper}{role}{dev}){
push @lsNo,"0:"; push @lsNo,"0:";
} }
elsif ($hash->{helper}{role}{chn}){ if ($hash->{helper}{role}{chn}){
foreach my $ls (split ",",$culHmModel->{$mId}{lst}){ foreach my $ls (split ",",$culHmModel->{$mId}{lst}){
my ($l,$c) = split":",$ls; my ($l,$c) = split":",$ls;
if ($l ne "p"){# ignore peer-only entries if ($l ne "p"){# ignore peer-only entries

View File

@ -1586,8 +1586,7 @@ sub HMinfo_verifyConfig($@) {##################################################
next if($param !~ m/RegL_0[0-9]:/); next if($param !~ m/RegL_0[0-9]:/);
$param =~ s/\.RegL/RegL/; $param =~ s/\.RegL/RegL/;
my ($reg,$data) = split(" ",$param,2); my ($reg,$data) = split(" ",$param,2);
my $exp = CUL_HM_getAttrInt($eN,"expert"); my $eReg = ReadingsVal($eN,($defs{$eN}{helper}{expert}{raw}?"":".").$reg,"");
my $eReg = ReadingsVal($eN,(($exp != 2)?".":"").$reg,"");
my ($ensp,$dnsp) = ($eReg,$data); my ($ensp,$dnsp) = ($eReg,$data);
$ensp =~ s/ //g; $ensp =~ s/ //g;
$dnsp =~ s/ //g; $dnsp =~ s/ //g;
@ -1662,14 +1661,18 @@ sub HMinfo_loadConfig($@) {####################################################
$line =~ s/\r//g; $line =~ s/\r//g;
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 ($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/); 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;
} }
if ($cmd1 eq "setreading"){ 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}{VAL} = $param;
$defs{$eN}{READINGS}{$cmd}{TIME} = "from archive"; $defs{$eN}{READINGS}{$cmd}{TIME} = "from archive";
} }
@ -1704,31 +1707,35 @@ sub HMinfo_loadConfig($@) {####################################################
} }
elsif($cmd eq "regBulk"){ elsif($cmd eq "regBulk"){
next if($param !~ m/RegL_0[0-9]:/); next if($param !~ m/RegL_0[0-9]:/);
my $exp = CUL_HM_getAttrInt($eN,"expert");
$param =~ s/\.RegL/RegL/; $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 ($reg,$data) = split(" ",$param,2);
my @rla = CUL_HM_reglUsed($eN); my @rla = CUL_HM_reglUsed($eN);
next if (!$rla[0]); next if (!$rla[0]);
my $rl = join",",@rla; my $rl = join",",@rla;
my $r2 = $reg; my $r2 = $reg;
$r2 =~ s/^\.//; $r2 =~ s/^\.//;
next if ($rl !~ m/$r2/); next if ($rl !~ m/$r2/);
if ($data !~ m/00:00/){ if ($data !~ m/00:00/){
push @elincmpl,"$eN reg list:$reg"; push @elincmpl,"$eN reg list:$reg";
next; 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); close(rFile);
foreach my $eN (keys %changes){ foreach my $eN (keys %changes){
foreach my $reg (keys %{$changes{$eN}}){ foreach my $reg (keys %{$changes{$eN}}){
$defs{$eN}{READINGS}{$reg}{VAL} = $changes{$eN}{$reg}; $defs{$eN}{READINGS}{$reg}{VAL} = $changes{$eN}{$reg}{d};
$defs{$eN}{READINGS}{$reg}{TIME} = "from archive"; $defs{$eN}{READINGS}{$reg}{TIME} = $changes{$eN}{$reg}{t};
my ($list,$pN) = ($1,$2) if ($reg =~ m/RegL_(..):(.*)/); my ($list,$pN) = ($1,$2) if ($reg =~ m/RegL_(..):(.*)/);
next if (!$list); next if (!$list);
my $pId = CUL_HM_peerChId($pN,substr($defs{$eN}{DEF},0,6)); my $pId = CUL_HM_peerChId($pN,substr($defs{$eN}{DEF},0,6));
@ -1765,8 +1772,9 @@ sub HMinfo_purgeConfig($) {####################################################
my $line = $_; my $line = $_;
$line =~ s/\r//g; $line =~ s/\r//g;
next if ( $line !~ m/set (.*) (peerBulk|regBulk) (.*)/ next if ( $line !~ m/set (.*) (peerBulk|regBulk) (.*)/
&& $line !~ m/(setreading) .*/);#&& $line !~ m/(setreading|templateDef) .*/); && $line !~ m/(setreading) .*/);
my ($cmd,$eN,$typ,$p1,$p2) = split(" ",$line,5); my ($command,$timeStamp) = split("#",$line,2);
my ($cmd,$eN,$typ,$p1,$p2) = split(" ",$command,5);
if ($cmd eq "set" && $typ eq "regBulk"){ if ($cmd eq "set" && $typ eq "regBulk"){
$p1 =~ s/\.RegL_/RegL_/; $p1 =~ s/\.RegL_/RegL_/;
$typ .= " $p1"; $typ .= " $p1";
@ -1775,7 +1783,7 @@ sub HMinfo_purgeConfig($) {####################################################
elsif ($cmd eq "set" && $typ eq "peerBulk"){ elsif ($cmd eq "set" && $typ eq "peerBulk"){
delete $purgeH{$eN}{$cmd}{regBulk};# regBulk needs to be rewritten delete $purgeH{$eN}{$cmd}{regBulk};# regBulk needs to be rewritten
} }
$purgeH{$eN}{$cmd}{$typ} = $p1; $purgeH{$eN}{$cmd}{$typ} = $p1.($timeStamp?"#$timeStamp":"");
} }
close(aSave); close(aSave);
open(aSave, ">$fName") || return("Can't open $fName: $!"); open(aSave, ">$fName") || return("Can't open $fName: $!");
@ -1906,6 +1914,30 @@ sub HMinfo_templateDef(@){#####################################################
delete $HMConfig::culHmTpl{$name}; delete $HMConfig::culHmTpl{$name};
return; return;
} }
return "$name already defined, delete it first" if($HMConfig::culHmTpl{$name});
if ($param eq "fromMaster"){#set hm templateDef <tmplName> fromMaster <master> <(peer:long|0)> <descr>
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 "" # get description if marked wir ""
if ($desc =~ m/^"/){ if ($desc =~ m/^"/){
my $cnt = 0; my $cnt = 0;
@ -1918,7 +1950,6 @@ sub HMinfo_templateDef(@){#####################################################
splice @regs,0,$cnt; splice @regs,0,$cnt;
} }
return "$name already defined, delete it first" if($HMConfig::culHmTpl{$name});
return "insufficient parameter" if(@regs < 1); return "insufficient parameter" if(@regs < 1);
my $paramNo; my $paramNo;
@ -2018,16 +2049,16 @@ sub HMinfo_templateUsg(@){#####################################################
my ($p,$t) = split(">",$tid); my ($p,$t) = split(">",$tid);
if($tFilter){ if($tFilter){
if($tFilter eq "sortTemplate"){ 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"){ if($tFilter eq "sortPeer"){
my ($pn,$ls) = split(":",$p); 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){ 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));