2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 03:06:37 +00:00

repair saveConfig, add HMinfe register copy

git-svn-id: https://svn.fhem.de/fhem/trunk@3452 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
martinp876 2013-07-19 09:52:46 +00:00
parent 9deccc57d7
commit 0cf755e1ae
2 changed files with 76 additions and 49 deletions

View File

@ -1779,7 +1779,7 @@ sub CUL_HM_Get($@) {
my $eName = CUL_HM_id2Name($e); my $eName = CUL_HM_id2Name($e);
push @eNames, $eName if($eName !~ m/_chn:/); push @eNames, $eName if($eName !~ m/_chn:/);
} }
foreach my $eName (@eNames){ foreach my $eName (@eNames){
print aSave "\n#--- entity:".$eName; print aSave "\n#--- entity:".$eName;
my $pIds = AttrVal($eName, "peerIDs", ""); my $pIds = AttrVal($eName, "peerIDs", "");
@ -1790,7 +1790,7 @@ sub CUL_HM_Get($@) {
print aSave "\nset ".$eName." peerBulk ".$pIds; print aSave "\nset ".$eName." peerBulk ".$pIds;
} }
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." " print aSave "\nset ".$eName." regBulk ".$read." "
.ReadingsVal($eName,$read,""); .ReadingsVal($eName,$read,"");
$timestamps .= "\n# ".ReadingsTimestamp($eName,$read,"")." :".$read; $timestamps .= "\n# ".ReadingsTimestamp($eName,$read,"")." :".$read;
@ -4808,7 +4808,7 @@ sub CUL_HM_putHash($) {# provide data for HMinfo
'3' includes '2' plus updates on writes to the device<br> '3' includes '2' plus updates on writes to the device<br>
'4' includes '3' plus tries to request status if it seems to be missing<br> '4' includes '3' plus tries to request status if it seems to be missing<br>
Execution will be delayed in order to prevent congestion at startup. Therefore the update Execution will be delayed in order to prevent congestion at startup. Therefore the update
of the readings and the display will be delayed depending on the sice of the database.<br> of the readings and the display will be delayed depending on the size of the database.<br>
Recommendations and constrains upon usage:<br> Recommendations and constrains upon usage:<br>
<ul> <ul>
use this attribute on the device or channel 01. Do not use it separate on each channel use this attribute on the device or channel 01. Do not use it separate on each channel

View File

@ -449,6 +449,8 @@ sub HMinfo_SetFn($$) {#########################################################
."\n [<nameFilter>] : only matiching names are processed - partial names are possible" ."\n [<nameFilter>] : only matiching names are processed - partial names are possible"
."\n [<modelsFilter>] : any match in the output are searched. " ."\n [<modelsFilter>] : any match in the output are searched. "
."\n" ."\n"
."\n cpRegs <src:peer> <dst:peer>"
."\n copy register for a channel or behavior of channel/peer"
."\n templateChk <entity> <templateName> <peer:[long|short]> [<param1> ...] " ."\n templateChk <entity> <templateName> <peer:[long|short]> [<param1> ...] "
."\n compare whether register match the template values" ."\n compare whether register match the template values"
."\n templateDef <entity> <templateName> <param1[:<param2>...] <description> <reg1>:<val1> [<reg2>:<val2>] ... " ."\n templateDef <entity> <templateName> <param1[:<param2>...] <description> <reg1>:<val1> [<reg2>:<val2>] ... "
@ -713,6 +715,52 @@ my %tpl = (
,CtOff =>"p1" ,CtOff =>"p1"
,CtValLo =>"p0" ,CtValLo =>"p0"
}} }}
,BlStopDnLg => {p=>"" ,t=>"Blind: stop drive on any key - for long drive down"
,reg=>{ ActionType =>"jmpToTarget"
,BlJtDlyOff =>"refOff"
,BlJtDlyOn =>"dlyOff"
,BlJtOff =>"dlyOff"
,BlJtOn =>"dlyOff"
,BlJtRampOff =>"rampOff"
,BlJtRampOn =>"on"
,BlJtRefOff =>"rampOff"
,BlJtRefOn =>"on"
,MultiExec =>"on"
}}
,BlStopDnSh => {p=>"" ,t=>"Blind: stop drive on any key - for short drive down"
,reg=>{ ActionType =>"jmpToTarget"
,BlJtDlyOff =>"refOff"
,BlJtDlyOn =>"dlyOff"
,BlJtOff =>"dlyOff"
,BlJtOn =>"dlyOff"
,BlJtRampOff =>"off"
,BlJtRampOn =>"on"
,BlJtRefOff =>"rampOff"
,BlJtRefOn =>"on"
}}
,BlStopUpLg => {p=>"" ,t=>"Blind: stop drive on any key - for long drive up"
,reg=>{ ActionType =>"jmpToTarget"
,BlJtDlyOff =>"dlyOn"
,BlJtDlyOn =>"refOn"
,BlJtOff =>"dlyOn"
,BlJtOn =>"dlyOn"
,BlJtRampOff =>"off"
,BlJtRampOn =>"rampOn"
,BlJtRefOff =>"off"
,BlJtRefOn =>"rampOn"
}}
,BlStopDnSh => {p=>"" ,t=>"Blind: stop drive on any key - for short drive up"
,reg=>{ ActionType =>"jmpToTarget"
,BlJtDlyOff =>"dlyOn"
,BlJtDlyOn =>"refOn"
,BlJtOff =>"dlyOn"
,BlJtOn =>"dlyOn"
,BlJtRampOff =>"off"
,BlJtRampOn =>"on"
,BlJtRefOff =>"off"
,BlJtRefOn =>"rampOn"
}}
); );
sub HMinfo_templateDef(@){##################################################### sub HMinfo_templateDef(@){#####################################################
@ -818,7 +866,7 @@ sub HMinfo_templateList($){####################################################
my $reply = ""; my $reply = "";
# if(!$templ || !(grep /$templ/,keys%tpl)){# list all templates # if(!$templ || !(grep /$templ/,keys%tpl)){# list all templates
if(!($templ && (grep /$templ/,keys%tpl))){# list all templates if(!($templ && (grep /$templ/,keys%tpl))){# list all templates
foreach (keys%tpl){ foreach (sort keys%tpl){
$reply .= sprintf("%-16s params:%-24s Info:%s\n" $reply .= sprintf("%-16s params:%-24s Info:%s\n"
,$_ ,$_
,$tpl{$_}{p} ,$tpl{$_}{p}
@ -828,7 +876,7 @@ sub HMinfo_templateList($){####################################################
} }
else{#details about one template else{#details about one template
$reply = sprintf("%-16s params:%-24s Info:%s\n",$templ,$tpl{$templ}{p},$tpl{$templ}{t}); $reply = sprintf("%-16s params:%-24s Info:%s\n",$templ,$tpl{$templ}{p},$tpl{$templ}{t});
foreach (keys %{$tpl{$templ}{reg}}){ foreach (sort keys %{$tpl{$templ}{reg}}){
my $val = $tpl{$templ}{reg}{$_}; my $val = $tpl{$templ}{reg}{$_};
if ($val =~m /^p(.)$/){ if ($val =~m /^p(.)$/){
my @a = split(" ",$tpl{$templ}{p}); my @a = split(" ",$tpl{$templ}{p});
@ -841,47 +889,6 @@ sub HMinfo_templateList($){####################################################
} }
sub HMinfo_cpRegs(@){######################################################### sub HMinfo_cpRegs(@){#########################################################
# copy level:
# List11 cpRegs channelSrc channelDst
# List13/4 cpRegs channelSrc:peer channelDst:peer
#
# Checks: registerlist of source must appear complete
# Peer must be present in source and destination, list must be complete
#description:
# <li><a name="#HMinfocpRegs">cpRegs &lt;src:peer&gt; &lt;dst:peer&gt; </a><br>
# allows to copy register, setting and behavior of a channel to
# another or for peers from the same or different channels
# <li>src:peer is the source entity. Peer needs to be given if a peer behabior beeds to be copied <\li>
# <li>dst:peer is the destination entity.<\li>
# Examples are
# set hm cpRegs blindR blindL # will copy all general register for this channel from the blindR to the blindL entity.
# This includes items like drive times. <br>
# set hm cpRegs blindR:Btn1 blindL:Btn2 # copy behavior of Btn1/blindR relation to Btn2/blindL<br>
# set hm cpRegs blindR:Btn1 blindR:Btn2 # copy behavior of Btn1/blindR relation to Btn2/blindR, i.e. inside the same Actor<br>
# <br>
# Restrictions:<br>
# cpRegs will not add any peers or read from the devices. It is up to the user to read register in advance<br>
# cpRegs is only allowed between identical models<br>
# peerings of devices must exist. cpRegs will terminate if peers cannot be identified<br>
# cpRegs estimates that all readings are up-to-date. It is up to the user to ensure and check data consistancy. <br>
# <br>
#
# </li>
#help
#."\n cpRegs <src:peer> <dst:peer>"
#."\n copy register for a channel or behavior of channel/peer"
#tests
#define tc CUL_HM 222222
#attr tc model HM-LC-Dim1TPBU-FM
#attr tc peerIDs 18208305,22222201
#
#set hm cpRegs LichtL:FB_01 tc
#set hm cpRegs LichtL:FB_Btn_01 tc:FB_Btn_05
#set hm cpRegs LichtL:FB_Btn_01 tc:self01
my ($srcCh,$dstCh) = @_; my ($srcCh,$dstCh) = @_;
my ($srcP,$dstP,$srcPid,$dstPid,$srcRegLn,$dstRegLn); my ($srcP,$dstP,$srcPid,$dstPid,$srcRegLn,$dstRegLn);
($srcCh,$srcP) = split(":",$srcCh,2); ($srcCh,$srcP) = split(":",$srcCh,2);
@ -926,9 +933,8 @@ sub HMinfo_cpRegs(@){#########################################################
# we habe a reglist with termination, source and destination peer is checked. Go copy # we habe a reglist with termination, source and destination peer is checked. Go copy
my $srcData = $defs{$srcCh}{READINGS}{$srcRegLn}{VAL}; my $srcData = $defs{$srcCh}{READINGS}{$srcRegLn}{VAL};
$srcData =~ s/00:00//; # remove termination $srcData =~ s/00:00//; # remove termination
Log 1,"General HMinfo_cpRegs:$srcRegLn->".join("-",split(" ",$srcData)); my ($ret,undef) = CUL_HM_Set($defs{$dstCh},$dstCh,"regBulk",$srcRegLn,split(" ",$srcData));
# my $ret = CUL_HM_Set($defs{$dstCh},$dstCh,"regBulk",$srcRegLn,split(" ",$srcData)); return $ret;
# return $ret;
} }
1; 1;
=pod =pod
@ -1041,6 +1047,27 @@ sub HMinfo_cpRegs(@){#########################################################
<li>Readings relates to set clear readings</li> <li>Readings relates to set clear readings</li>
<li>Rssi clears all rssi counters </li> <li>Rssi clears all rssi counters </li>
</li> </li>
<li><a name="#HMinfocpRegs">cpRegs &lt;src:peer&gt; &lt;dst:peer&gt; </a><br>
allows to copy register, setting and behavior of a channel to
another or for peers from the same or different channels. Copy therefore is allowed
intra/inter device and intra/inter channel.
<li>src:peer is the source entity. Peer needs to be given if a peer behabior beeds to be copied <\li>
<li>dst:peer is the destination entity.<\li>
Examples are
<code>
set hm cpRegs blindR blindL # will copy all general register (list 1)for this channel from the blindR to the blindL entity.
This includes items like drive times. It does not include peers related register (list 3/4) <br>
set hm cpRegs blindR:Btn1 blindL:Btn2 # copy behavior of Btn1/blindR relation to Btn2/blindL<br>
set hm cpRegs blindR:Btn1 blindR:Btn2 # copy behavior of Btn1/blindR relation to Btn2/blindR, i.e. inside the same Actor<br>
</code>
<br>
Restrictions:<br>
cpRegs will not add any peers or read from the devices. It is up to the user to read register in advance<br>
cpRegs is only allowed between identical models<br>
peerings of devices must exist. cpRegs will terminate if peers cannot be identified<br>
cpRegs estimates that all readings are up-to-date. It is up to the user to ensure and check data consistancy. <br>
<br>
</li>
<li><a name="#HMinfosaveConfig">saveConfig</a> <a href="HMinfoFilter">[filter]</a><br> <li><a name="#HMinfosaveConfig">saveConfig</a> <a href="HMinfoFilter">[filter]</a><br>
performs a save for all HM register setting and peers. See <a href="#CUL_HMsaveConfig">CUL_HM saveConfig</a>. performs a save for all HM register setting and peers. See <a href="#CUL_HMsaveConfig">CUL_HM saveConfig</a>.
</li> </li>