From 6a714fce0ac8a61c44dced5de70bc764880fde68 Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Thu, 6 Feb 2014 14:44:16 +0000 Subject: [PATCH] improve archive batch handling git-svn-id: https://svn.fhem.de/fhem/trunk@4821 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/10_CUL_HM.pm | 12 +++--- fhem/FHEM/98_HMinfo.pm | 83 ++++++++++++++++++++++++++---------------- 2 files changed, 58 insertions(+), 37 deletions(-) diff --git a/fhem/FHEM/10_CUL_HM.pm b/fhem/FHEM/10_CUL_HM.pm index eb28e919a..5c1714af4 100755 --- a/fhem/FHEM/10_CUL_HM.pm +++ b/fhem/FHEM/10_CUL_HM.pm @@ -589,7 +589,8 @@ sub CUL_HM_Attr(@) {################################# } elsif($attrName eq "autoReadReg"){ if ($cmd eq "set"){ - CUL_HM_complConfigTest($name); + CUL_HM_complConfigTest($name) + if (!CUL_HM_getAttrInt($name,"ignore"));; } } CUL_HM_queueUpdtCfg($name) if ($updtReq); @@ -2563,7 +2564,7 @@ sub CUL_HM_Set($@) { my @cH = ($hash); push @cH,$defs{$hash->{$_}} foreach(grep /^channel/,keys %{$hash}); delete $_->{READINGS} foreach (@cH); - delete $modules{CUL_HM}{helper}{cfgCmpl}{$_->{NAME}}; + delete $modules{CUL_HM}{helper}{cfgCmpl}{$name}; CUL_HM_complConfig($_->{NAME}) foreach (@cH); } elsif($sect eq "register"){ @@ -2573,7 +2574,7 @@ sub CUL_HM_Set($@) { foreach my $h(@cH){ delete $h->{READINGS}{$_} foreach (grep /^(\.?)(R-|RegL)/,keys %{$h->{READINGS}}); - delete $modules{CUL_HM}{helper}{cfgCmpl}{$_->{NAME}}; + delete $modules{CUL_HM}{helper}{cfgCmpl}{$name}; CUL_HM_complConfig($h->{NAME}); } } @@ -3722,7 +3723,7 @@ sub CUL_HM_getConfig($){ my $id = CUL_HM_IOid($hash); my $dst = substr($hash->{DEF},0,6); my $name = $hash->{NAME}; - + CUL_HM_configUpdate($name); delete $modules{CUL_HM}{helper}{cfgCmpl}{$name}; CUL_HM_complConfigTest($name); CUL_HM_PushCmdStack($hash,'++'.$flag.'01'.$id.$dst.'00040000000000') @@ -5746,8 +5747,7 @@ sub CUL_HM_peersValid($) {# is list valid? sub CUL_HM_reglUsed($) {# provide data for HMinfo my $name = shift; my $hash = $defs{$name}; - my $devId = substr($hash->{DEF},0,6); - my $chn = substr($hash->{DEF}."01",6,2); + my ($devId,$chn) = unpack 'A6A2',$hash->{DEF}."01"; return undef if (AttrVal(CUL_HM_id2Name($devId),"subType","") eq "virtual"); my @pNames; diff --git a/fhem/FHEM/98_HMinfo.pm b/fhem/FHEM/98_HMinfo.pm index 5abc02821..97ee9f658 100644 --- a/fhem/FHEM/98_HMinfo.pm +++ b/fhem/FHEM/98_HMinfo.pm @@ -25,7 +25,7 @@ sub HMinfo_Initialize($$) {#################################################### $hash->{AttrFn} = "HMinfo_Attr"; $hash->{AttrList} = "loglevel:0,1,2,3,4,5,6 " ."sumStatus sumERROR " - ."autoUpdate autoArchieve " + ."autoUpdate autoArchive " ."hmAutoReadScan hmIoMaxDly " ."hmManualOper:0_auto,1_manual " ."configDir configFilename " @@ -116,7 +116,7 @@ sub HMinfo_autoUpdate($){#in:name, send status-request (undef,$name)=split":",$name,2; HMinfo_SetFn($defs{$name},$name,"update") if ($name); # HMinfo_archConfig($defs{$name},$name,"","") -# if (AttrVal($name,"autoArchieve",undef) && +# if (AttrVal($name,"autoArchive",undef) && # scalar(@{$modules{CUL_HM}{helper}{confUpdt}})); InternalTimer(gettimeofday()+$defs{$name}{helper}{autoUpdate}, "HMinfo_autoUpdate","sUpdt:".$name,0) @@ -144,6 +144,7 @@ sub HMinfo_regCheck(@) { ###################################################### foreach my $eName (@entities){ my $ehash = $defs{$eName}; + next if (!$ehash); my @lsNo = CUL_HM_reglUsed($eName); my @mReg = (); @@ -1041,36 +1042,49 @@ sub HMinfo_saveConfig($) {##################################################### return $id; } -sub HMinfo_archConfig($$$$) {##################################################### - # save config only if register are complete - my ($hash,$name,$opt,$fn) = @_; - my @eN; - if ($opt eq "-a"){@eN = HMinfo_getEntities("d","");} - else {@eN = @{$modules{CUL_HM}{helper}{confUpdt}}} - my @names; - push @names,CUL_HM_getAssChnNames($_) foreach(@eN); - @{$modules{CUL_HM}{helper}{confUpdt}} = (); - my @archs; - foreach(HMinfo_noDup(@names)){ - if (CUL_HM_peersValid($_) !=1 ||HMinfo_regCheck($_)){ - push @{$modules{CUL_HM}{helper}{confUpdt}},$_; - } - else{ - push @archs,$_; - } +sub HMinfo_archConfig($$$$) {################################################ + # save config only if register are complete + my ($hash,$name,$opt,$fN) = @_; + my $id = ++$hash->{nb}{cnt}; + my $bl = BlockingCall("HMinfo_archConfigExec", join(",",("$name:$id" + ,$fN + ,$opt)), + "HMinfo_archConfigPost", 30, + "HMinfo_bpAbort", "$name:$id"); + $hash->{nb}{$id}{$_} = $bl->{$_} foreach (keys %{$bl}); + @{$modules{CUL_HM}{helper}{confUpdt}} = (); + return ; +} +sub HMinfo_archConfigExec($) {################################################ + # save config only if register are complete + my ($id,$fN,$opt) = split ",",shift; + my @eN; + if ($opt eq "-a"){@eN = HMinfo_getEntities("d","");} + else {@eN = @{$modules{CUL_HM}{helper}{confUpdt}}} + my @names; + push @names,CUL_HM_getAssChnNames($_) foreach(@eN); + @{$modules{CUL_HM}{helper}{confUpdt}} = (); + my @archs; + @eN = (); + foreach(HMinfo_noDup(@names)){ + if (CUL_HM_peersValid($_) !=1 ||HMinfo_regCheck($_)){ + push @eN,$_; } - my $id = ++$hash->{nb}{cnt}; - my $bl = BlockingCall("HMinfo_saveConfig", join(",",("$name:$id" - ,$fn - ,"c" - ,"\^(".join("|",@archs).")\$") - ,"strict"), - "HMinfo_bpPost", 30, - "HMinfo_bpAbort", "$name:$id"); - $hash->{nb}{$id}{$_} = $bl->{$_} foreach (keys %{$bl}); - return (@{$modules{CUL_HM}{helper}{confUpdt}} - ?"data incomplete:".join(",",@{$modules{CUL_HM}{helper}{confUpdt}}) - :""); + else{ + push @archs,$_; + } + } + HMinfo_saveConfig(join(",",( $id + ,$fN + ,"c" + ,"\^(".join("|",@archs).")\$") + ,"strict")); + return (@eN ? join(",",@eN) : ""); +} +sub HMinfo_archConfigPost($) {################################################ + my $post = shift; + push @{$modules{CUL_HM}{helper}{confUpdt}},split(",",$post) if ($post); + return ; } sub HMinfo_bpPost($) {#bp finished############################################# @@ -1898,6 +1912,13 @@ sub HMinfo_noDup(@) {#return list with no duplicates will trigger the update every 10 min
+
  • autoArchive + if set fhem will update the configFile each time the new data is available. + The update will happen with autoUpdate. It will not + work it autoUpdate is not used.
    + see also archConfig +
    +
  • hmAutoReadScan defines the time in seconds CUL_HM tries to schedule the next autoRead from the queue. Despite this timer FHEM will take care that only one device from the queue will be