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)/){
$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
@ -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 +++++++++++++++++++++++++++++++++++++

View File

@ -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);
@ -1167,7 +1167,7 @@ sub HMinfo_GetFn($@) {#########################################################
keys %{$defs{$dName}{READINGS}})){
push @peerUndef,"$dName triggers $_"
if( ($peerIDs && $peerIDs !~ m/$_/)
||("CCU-FHEM" ne AttrVal(CUL_HM_id2Name($_),"model","")));
&&("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,6 +1663,7 @@ 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})){
@ -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));

View File

@ -1391,7 +1391,6 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"};
%culHmVrtGets = (
param => "<param>",
cmdList => "",
saveConfig => "<filename> ...",
);
%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] ... [<PeerChannel>]"
,getConfig => ""
,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
raw => "data ..."
,virtual => "<noButtons>"
virtual => "<noButtons>"
,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 =>"<sec> ..."
,hmPairSerial =>"<serial>"
,defIgnUnknown =>""
,virtual =>"<noButtons>"
,assignIO =>"<IO> [set|unset]..."
}
,"HM-LC-RGBW-WM01" =>{ "on-for-timer" =>"<ontime> [<ramptime>]..."