2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-22 20:24:36 +00:00

unpeered trigger handling

git-svn-id: https://svn.fhem.de/fhem/trunk@6394 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2014-08-12 06:28:21 +00:00
parent 2bc0670d9e
commit 75b0db586f
3 changed files with 59 additions and 33 deletions

View File

@ -3187,7 +3187,7 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
if ($sectIn eq "all") { if ($sectIn eq "all") {
@sectL = ("rssi","msgEvents","readings");#readings is last - it schedules a reread possible @sectL = ("rssi","msgEvents","readings");#readings is last - it schedules a reread possible
} }
elsif($sectIn =~ m/(rssi|msgEvents|readings|register|unknownDev)/){ elsif($sectIn =~ m/(rssi|trigger|msgEvents|readings|register|unknownDev)/){
@sectL = ($sectIn); @sectL = ($sectIn);
} }
else{ else{
@ -3206,6 +3206,10 @@ sub CUL_HM_Set($@) {#+++++++++++++++++ set command+++++++++++++++++++++++++++++
delete $hash->{READINGS}{$_} delete $hash->{READINGS}{$_}
foreach (grep /^unknown_/,keys %{$hash->{READINGS}}); foreach (grep /^unknown_/,keys %{$hash->{READINGS}});
} }
elsif($sect eq "trigger"){
delete $hash->{READINGS}{$_}
foreach (grep /^trig/,keys %{$hash->{READINGS}});
}
elsif($sect eq "register"){ elsif($sect eq "register"){
my @cH = ($hash); my @cH = ($hash);
push @cH,$defs{$hash->{$_}} foreach(grep /^channel/,keys %{$hash}); push @cH,$defs{$hash->{$_}} foreach(grep /^channel/,keys %{$hash});
@ -6694,8 +6698,11 @@ sub CUL_HM_UpdtCentral($){
next if (!$btn); next if (!$btn);
CommandDefine(undef,$name."_Btn$btn CUL_HM $ccuBId") CommandDefine(undef,$name."_Btn$btn CUL_HM $ccuBId")
if (!$modules{CUL_HM}{defptr}{$ccuBId}); if (!$modules{CUL_HM}{defptr}{$ccuBId});
foreach my $pn (grep !/^$/,map{$_ if (AttrVal($_,"peerIDs","") =~ m/$id$btnS/)}keys %defs){ foreach my $pn (grep !/^$/,
CUL_HM_ID2PeerList ($name."_Btn$btn",CUL_HM_name2Id($pn),1); map{$_ if (AttrVal($_,"peerIDs","") =~ m/$id$btnS/)}
keys %defs){
CUL_HM_ID2PeerList ($name."_Btn$btn",unpack('A8',CUL_HM_name2Id($pn)."01"),1);
} }
} }
my $io = AttrVal($name,"IODev","empty"); my $io = AttrVal($name,"IODev","empty");
@ -7098,6 +7105,7 @@ sub CUL_HM_tempListTmpl(@) { ##################################################
my %dlf = (1=>{Sat=>0,Sun=>0,Mon=>0,Tue=>0,Wed=>0,Thu=>0,Fri=>0}, my %dlf = (1=>{Sat=>0,Sun=>0,Mon=>0,Tue=>0,Wed=>0,Thu=>0,Fri=>0},
2=>{Sat=>0,Sun=>0,Mon=>0,Tue=>0,Wed=>0,Thu=>0,Fri=>0}, 2=>{Sat=>0,Sun=>0,Mon=>0,Tue=>0,Wed=>0,Thu=>0,Fri=>0},
3=>{Sat=>0,Sun=>0,Mon=>0,Tue=>0,Wed=>0,Thu=>0,Fri=>0}); 3=>{Sat=>0,Sun=>0,Mon=>0,Tue=>0,Wed=>0,Thu=>0,Fri=>0});
return "" if ($template =~ m/(none|0)/);
my $ret = ""; my $ret = "";
my @el = split",",$name; my @el = split",",$name;
my ($fName,$tmpl) = split":",$template; my ($fName,$tmpl) = split":",$template;
@ -8262,7 +8270,9 @@ sub CUL_HM_tempListTmpl(@) { ##################################################
Due to amount of readings and events it is NOT RECOMMENDED to switch it on by default. Due to amount of readings and events it is NOT RECOMMENDED to switch it on by default.
</li> </li>
<li><a name="#CUL_HMtempListTmpl">tempListTmpl</a><br> <li><a name="#CUL_HMtempListTmpl">tempListTmpl</a><br>
Sets the default template for a heating controller.<br> Sets the default template for a heating controller. If not given the detault template is taken from
file tempList.cfg using the enitity name as template name (e.g. ./tempLict.cfg:RT1_Clima <br>
To avoid template usage set this attribut to '0'.<br>
Format is &lt;file&gt;:&lt;templatename&gt;. lt Format is &lt;file&gt;:&lt;templatename&gt;. lt
</li> </li>
<li><a name="unit">unit</a><br> <li><a name="unit">unit</a><br>
@ -9457,7 +9467,9 @@ sub CUL_HM_tempListTmpl(@) { ##################################################
</code></ul> </code></ul>
</li> </li>
<li><a name="#CUL_HMtempListTmpl">tempListTmpl</a><br> <li><a name="#CUL_HMtempListTmpl">tempListTmpl</a><br>
Setzt das Default f&uuml;r Heizungskontroller.<br> Setzt das Default f&uuml;r Heizungskontroller. Ist es nicht gesetzt wird der default filename genutzt und der name
der entity als templatename. Z.B. ./tempList.cfg:RT_Clima<br>
Um das template nicht zu nutzen kann man es auf '0'setzen.<br>
Format ist &lt;file&gt;:&lt;templatename&gt;. Format ist &lt;file&gt;:&lt;templatename&gt;.
</li> </li>
<li><a name="CUL_HMmodel">model</a>, <li><a name="CUL_HMmodel">model</a>,

View File

@ -381,14 +381,17 @@ sub HMinfo_peerCheck(@) { #####################################################
next if ($peersUsed == 0); next if ($peersUsed == 0);
my $peerIDs = AttrVal($eName,"peerIDs",undef); my $peerIDs = AttrVal($eName,"peerIDs",undef);
$peerIDs =~ s/00000000,//;
my @failTrig = map {CUL_HM_name2Id(substr($_,8))} my @failTrig = map {CUL_HM_name2Id(substr($_,8))}
grep /^trigDst_/, grep /^trigDst_/,
keys %{$defs{$eName}{READINGS}}; keys %{$defs{$eName}{READINGS}};
foreach (HMinfo_noDup(@failTrig)){ foreach (HMinfo_noDup(@failTrig)){
next if (!$_);
push @peerIDsTrigUnp,"triggerUnpeered: ".$eName.":".$_ push @peerIDsTrigUnp,"triggerUnpeered: ".$eName.":".$_
if($_ && $peerIDs !~ m/$_/); if( ($peerIDs && $peerIDs !~ m/$_/)
||("CCU-FHEM" ne AttrVal(CUL_HM_id2Name(substr($_,0,6)),"model","")));
push @peerIDsTrigUnd,"triggerUndefined: ".$eName.":".$_ push @peerIDsTrigUnd,"triggerUndefined: ".$eName.":".$_
if($_ && !$modules{CUL_HM}{defptr}{$_}); if(!$modules{CUL_HM}{defptr}{$_});
} }
if (!$peerIDs){ # no peers - is this correct? if (!$peerIDs){ # no peers - is this correct?
@ -863,7 +866,8 @@ sub HMinfo_GetFn($@) {#########################################################
devspec2array("model=HM.*-TC.*:FILTER=chanNo=02:FILTER=tempListTmpl=.*")); devspec2array("model=HM.*-TC.*:FILTER=chanNo=02:FILTER=tempListTmpl=.*"));
my @tlr; my @tlr;
foreach my $e (@td){ foreach my $e (@td){
my $tr = CUL_HM_tempListTmpl($e,"verify",AttrVal($e,"tempListTmpl",AttrVal($hash->{NAME},"configDir",".")."/tempList.cfg:$e")); my $tr = CUL_HM_tempListTmpl($e,"verify",AttrVal($e,"tempListTmpl"
,AttrVal($hash->{NAME},"configDir",".")."/tempList.cfg:$e"));
push @tlr,$tr if($tr); push @tlr,$tr if($tr);
} }
$ret .= "\n\n templist mismatch \n ".join("\n ",@tlr) if (@tlr); $ret .= "\n\n templist mismatch \n ".join("\n ",@tlr) if (@tlr);
@ -885,7 +889,9 @@ sub HMinfo_GetFn($@) {#########################################################
my @fheml = (); my @fheml = ();
foreach my $dName (HMinfo_getEntities($opt,$filter)){ foreach my $dName (HMinfo_getEntities($opt,$filter)){
# search for irregular trigger # search for irregular trigger
my @failTrig = map {"$dName: $_"} grep /^trigDst_/,keys %{$defs{$dName}{READINGS}}; my @failTrig = map {"$dName: $_"}
grep /^trigDst_/,
keys %{$defs{$dName}{READINGS}};
push @peerUndef,@failTrig if (@failTrig); push @peerUndef,@failTrig if (@failTrig);
#--- check regular references #--- check regular references
my $peerIDs = AttrVal($dName,"peerIDs",undef); my $peerIDs = AttrVal($dName,"peerIDs",undef);
@ -895,10 +901,11 @@ sub HMinfo_GetFn($@) {#########################################################
foreach (split",",$peerIDs){ foreach (split",",$peerIDs){
next if ($_ eq "00000000"); next if ($_ eq "00000000");
my $pn = CUL_HM_peerChName($_,$dId); my $pn = CUL_HM_peerChName($_,$dId);
$pn =~ s/_chn:01//;
push @pl,$pn; push @pl,$pn;
push @fheml,"$_$dName" if ($pn =~ m/^fhem..$/); push @fheml,"$_$dName" if ($pn =~ m/^fhem..$/);
} }
push @peerPairs,$dName." => ".join(", ",(sort @pl)) if (@pl); push @peerPairs,$dName." => ".join(" ",(sort @pl)) if (@pl);
} }
#--- calculate peerings to Central --- #--- calculate peerings to Central ---
my %fChn; my %fChn;
@ -929,7 +936,7 @@ sub HMinfo_GetFn($@) {#########################################################
push @noReg,$dName; push @noReg,$dName;
next; next;
} }
my ($peerOld,$ptOld,$ptLine,$peerLine) = ("",""," "," "); my ($peerOld,$ptOld,$ptLine,$peerLine) = ("","",pack('A23',""),pack('A23',""));
foreach my $reg (split("\n",$regs)){ foreach my $reg (split("\n",$regs)){
my ($peer,$h1) = split ("\t",$reg); my ($peer,$h1) = split ("\t",$reg);
$peer =~s/ //g; $peer =~s/ //g;
@ -937,21 +944,23 @@ sub HMinfo_GetFn($@) {#########################################################
$RegReply .= $reg."\n"; $RegReply .= $reg."\n";
next; next;
} }
$peer =~s/3://;
next if (!$h1); next if (!$h1);
$peer =~s/3://;
my ($regN,$h2) = split (":",$h1); my ($regN,$h2) = split (":",$h1);
my ($pt,$rN) = unpack 'A2A*',$regN;
if (!defined($hash->{helper}{r}{$rN})){
$hash->{helper}{r}{$rN}{v} = "";
$hash->{helper}{r}{$rN}{u} = pack('A5',"");
}
my ($val,$unit) = split (" ",$h2); my ($val,$unit) = split (" ",$h2);
$unit = $unit?("[".$unit."]"):" "; $hash->{helper}{r}{$rN}{v} .= pack('A16',$val);
my ($pt,$rN) = ($1,$2) if ($regN =~m/(..)(.*)/); $hash->{helper}{r}{$rN}{u} = pack('A5',"[".$unit."]") if ($unit);
$rN .= $unit;
$hash->{helper}{r}{$rN} = "" if (!defined($hash->{helper}{r}{$rN}));
$hash->{helper}{r}{$rN} .= sprintf("%16s",$val);
if ($pt ne $ptOld){ if ($pt ne $ptOld){
$ptLine .= sprintf("%16s",$pt); $ptLine .= pack('A16',$pt);
$ptOld = $pt; $ptOld = $pt;
} }
if ($peer ne $peerOld){ if ($peer ne $peerOld){
$peerLine .= sprintf("%32s",$peer); $peerLine .= pack('A32',$peer);
$peerOld = $peer; $peerOld = $peer;
} }
} }
@ -959,7 +968,10 @@ sub HMinfo_GetFn($@) {#########################################################
foreach my $rN (sort keys %{$hash->{helper}{r}}){ foreach my $rN (sort keys %{$hash->{helper}{r}}){
$hash->{helper}{r}{$rN} =~ s/( o..)/$1 /g $hash->{helper}{r}{$rN} =~ s/( o..)/$1 /g
if($rN =~ m/^MultiExec /); #shift thhis reading since it does not appear for short if($rN =~ m/^MultiExec /); #shift thhis reading since it does not appear for short
$RegReply .= $rN.$hash->{helper}{r}{$rN}."\n"; $RegReply .= pack ('A18',$rN)
.$hash->{helper}{r}{$rN}{u}
.$hash->{helper}{r}{$rN}{v}
."\n";
} }
delete $hash->{helper}{r}; delete $hash->{helper}{r};
} }
@ -1138,7 +1150,6 @@ sub HMinfo_SetFn($@) {#########################################################
$opt .= "d" if ($type =~ m/(Protocol|rssi)/);# readings apply to all, others device only $opt .= "d" if ($type =~ m/(Protocol|rssi)/);# readings apply to all, others device only
my @entities; my @entities;
$type = "msgEvents" if ($type eq "Protocol");# translate parameter $type = "msgEvents" if ($type eq "Protocol");# translate parameter
Log 1,"General filter:$opt,$filter";
foreach my $dName (HMinfo_getEntities($opt,$filter)){ foreach my $dName (HMinfo_getEntities($opt,$filter)){
push @entities,$dName; push @entities,$dName;
CUL_HM_Set($defs{$dName},$dName,"clear",$type); CUL_HM_Set($defs{$dName},$dName,"clear",$type);
@ -1187,6 +1198,7 @@ sub HMinfo_SetFn($@) {#########################################################
elsif($cmd eq "loadConfig") {##action: loadConfig---------------------------- elsif($cmd eq "loadConfig") {##action: loadConfig----------------------------
my $fn = $a[0]?$a[0]:AttrVal($name,"configFilename","regSave.cfg"); my $fn = $a[0]?$a[0]:AttrVal($name,"configFilename","regSave.cfg");
$fn = AttrVal($name,"configDir",".")."\/".$fn if ($fn !~ m/\//); $fn = AttrVal($name,"configDir",".")."\/".$fn if ($fn !~ m/\//);
Log 1,"General loadConfig: $fn";
$ret = HMinfo_loadConfig($filter,$fn); $ret = HMinfo_loadConfig($filter,$fn);
} }
elsif($cmd eq "verifyConfig"){##action: verifyConfig------------------------- elsif($cmd eq "verifyConfig"){##action: verifyConfig-------------------------
@ -1362,12 +1374,12 @@ sub HMinfo_verifyConfig($@) {##################################################
if ($ensp ne $dnsp){ if ($ensp ne $dnsp){
my %r; # generate struct with changes addresses my %r; # generate struct with changes addresses
foreach my $reg(grep /..:../, split(" ",$eReg)){ foreach my $rg(grep /..:../, split(" ",$eReg)){
my ($a,$d) = split(":",$reg); my ($a,$d) = split(":",$rg);
$r{$a}{c} = $d; $r{$a}{c} = $d;
} }
foreach my $reg(grep !/00:00/,grep /..:../, split(" ",$data)){ foreach my $rg(grep !/00:00/,grep /..:../, split(" ",$data)){
my ($a,$d) = split(":",$reg); my ($a,$d) = split(":",$rg);
next if (!$a || $a eq "00"); next if (!$a || $a eq "00");
if (!defined $r{$a}){$r{$a}{f} = $d;$r{$a}{c} = "";} if (!defined $r{$a}){$r{$a}{f} = $d;$r{$a}{c} = "";}
elsif($r{$a}{c} ne $d){$r{$a}{f} = $d;} elsif($r{$a}{c} ne $d){$r{$a}{f} = $d;}
@ -1379,7 +1391,7 @@ sub HMinfo_verifyConfig($@) {##################################################
# search register valid for thie entity # search register valid for thie entity
my $dN = CUL_HM_getDeviceName($eN); my $dN = CUL_HM_getDeviceName($eN);
my $chn = CUL_HM_name2Id($eN); my $chn = CUL_HM_name2Id($eN);
my $listNo = substr($reg,6,1); my (undef,$listNo,undef,$peer) = unpack('A6A1A1A*',$reg);
$chn = (length($chn) == 8)?substr($chn,6,2):""; $chn = (length($chn) == 8)?substr($chn,6,2):"";
my $culHmRegDefine =\%HMConfig::culHmRegDefine; my $culHmRegDefine =\%HMConfig::culHmRegDefine;
my @regArr = grep{$culHmRegDefine->{$_}->{l} eq $listNo} my @regArr = grep{$culHmRegDefine->{$_}->{l} eq $listNo}
@ -1388,11 +1400,13 @@ sub HMinfo_verifyConfig($@) {##################################################
,$chn); ,$chn);
# now identify which register belongs to suspect address. # now identify which register belongs to suspect address.
foreach my $rgN (@regArr){ foreach my $rgN (@regArr){
next if ($culHmRegDefine->{$rgN}->{l} ne $listNo); next if ($culHmRegDefine->{$rgN}{l} ne $listNo);
my $a = $culHmRegDefine->{$rgN}->{a}; my $a = $culHmRegDefine->{$rgN}{a};
next if (!grep /$a/,@aCh); next if (!grep {$a == int($_)} @aCh);
$a = sprintf("%02X",$a); $a = sprintf("%02X",$a);
push @elReg,"$eN addr:$a changed from $r{$a}{f} to $r{$a}{c} - effected RegName:$rgN"; push @elReg,"$eN "
.($peer?": peer:$peer ":"")
."addr:$a changed from $r{$a}{f} to $r{$a}{c} - effected RegName:$rgN";
} }
} }

View File

@ -1301,7 +1301,7 @@ $culHmRegChan{"ROTO_ZEL-STG-RM-FWT03"}= $culHmRegChan{"HM-CC-TC03"};
,getRegRaw => "[List0|List1|List2|List3|List4|List5|List6] ... [<PeerChannel>]" ,getRegRaw => "[List0|List1|List2|List3|List4|List5|List6] ... [<PeerChannel>]"
,getConfig => "" ,getConfig => ""
,regSet => "[prep|exec] <regName> <value> ... [<peerChannel>]" ,regSet => "[prep|exec] <regName> <value> ... [<peerChannel>]"
,clear => "[readings|register|rssi|msgEvents|all]" ,clear => "[readings|trigger|register|rssi|msgEvents|all]"
,getVersion => "" ,getVersion => ""
); );
%culHmGlobalSetsVrtDev = (# virtuals and devices without subtype %culHmGlobalSetsVrtDev = (# virtuals and devices without subtype