From ad87cf9b5f61e364908365b43f8127bc784b760f Mon Sep 17 00:00:00 2001 From: martinp876 <> Date: Sat, 4 Jul 2015 08:45:34 +0000 Subject: [PATCH] 00_HMLAN: loadlevel handling git-svn-id: https://svn.fhem.de/fhem/trunk@8885 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_HMLAN.pm | 97 ++++++++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 28 deletions(-) diff --git a/fhem/FHEM/00_HMLAN.pm b/fhem/FHEM/00_HMLAN.pm index f2403c749..8b35c2432 100755 --- a/fhem/FHEM/00_HMLAN.pm +++ b/fhem/FHEM/00_HMLAN.pm @@ -77,6 +77,7 @@ sub HMLAN_Initialize($) { "respTime " . "hmProtocolEvents:0_off,1_dump,2_dumpFull,3_dumpTrigger ". "hmMsgLowLimit ". + "loadLevel ". "hmLanQlen:1_min,2_low,3_normal,4_high,5_critical ". "wdTimer:5,10,15,20,25 ". "logIDs ". @@ -116,8 +117,8 @@ sub HMLAN_Define($$) {######################################################### my @arr = (); @{$hash->{helper}{q}{apIDs}} = \@arr; - $hash->{helper}{q}{scnt} = 0; - $hash->{helper}{q}{loadNo} = 0; + $hash->{helper}{q}{scnt} = 0; + $hash->{helper}{q}{loadNo} = 0; $hash->{helper}{q}{loadLast} = 0; $hash->{msgLoadHistory} = (60/$HMmlSlice)."min steps: " .join("/",("-") x $HMmlSlice); @@ -128,12 +129,13 @@ sub HMLAN_Define($$) {######################################################### my @al = (); @{$hash->{helper}{log}{ids}} = \@al; - $hash->{assignedIDsCnt} = 0;#define hash + $hash->{assignedIDsCnt} = 0;#define hash $hash->{helper}{assIdRep} = 0; $hash->{helper}{assIdCnt} = 0; HMLAN_condUpdate($hash,253);#set disconnected readingsSingleUpdate($hash,"state","disconnected",1); $hash->{owner} = ""; + HMLAN_Attr("delete",$name,"loadLevel"); my $ret = DevIo_OpenDev($hash, 0, "HMLAN_DoInit"); return $ret; @@ -220,10 +222,22 @@ sub HMLAN_Attr(@) {############################################################ } elsif($aName eq "hmMsgLowLimit"){ if ($cmd eq "set"){ - return "hmMsgLowLimit:please add integer between 10 and 120" + return "hmMsgLowLimit:please add integer between 10 and 100" if ( $aVal !~ m/^(\d+)$/ ||$aVal<10 - ||$aVal >120 ); + ||$aVal >100 ); + delete $defs{$name}{helper}{loadLvl}{h}{$aVal}; + my %lvlHr = reverse %{$defs{$name}{helper}{loadLvl}{h}}; + $lvlHr{batchLevel} = $aVal; + my %lvlH = reverse %lvlHr; + $defs{$name}{helper}{loadLvl}{h} = \%lvlH; + my @a = sort { $b <=> $a } keys %lvlH; + $defs{$name}{helper}{loadLvl}{a} = \@a; + $attr{$name}{loadLevel} = join(",",map{"$_:$lvlH{$_}"}sort keys%lvlH); + $defs{$name}{helper}{loadLvl}{bl} = $aVal; + } + if ($init_done){ + return "better use loadLevel batchLevel"; } } elsif($aName eq "hmId"){ @@ -274,6 +288,40 @@ sub HMLAN_Attr(@) {############################################################ return "logging set to $attr{$name}{$aName}" if ($aVal && $attr{$name}{$aName} ne $aVal); } + elsif($aName eq "loadLevel"){ + my %lvlH; + my $batchLevel = 40;#defailt batch level + if ($cmd eq "set"){ + foreach my $lvl(sort split(",",$aVal)){ + next if(!$lvl); + my @lvlSp = split(":",$lvl); + return "$lvl not parsed. Only one Level per Entry:".scalar @lvlSp if (scalar @lvlSp != 2); + return "$lvlSp[0] must be between 0 and 100" if ( $lvlSp[0] !~ m/^(\d+)$/ + ||$lvlSp[0]<0 + ||$lvlSp[0] >100 ); + $lvlH{$lvlSp[0]+0} = $lvlSp[1]; + } + my %lvlHr = reverse %lvlH; + $lvlH{0} = "low" if (!defined $lvlH{0}); + if (!defined $lvlHr{batchLevel}){ + $lvlH{$batchLevel} = "batchLevel"; + } + else{ + $batchLevel = $lvlHr{batchLevel}; + } + } + else{#delete + $lvlH{0} = "low"; + $lvlH{$batchLevel} = "batchLevel"; + $lvlH{90} = "high"; + $lvlH{99} = "suspended"; + } + $defs{$name}{helper}{loadLvl}{h} = \%lvlH; + my @a = sort { $b <=> $a } keys %lvlH; + $defs{$name}{helper}{loadLvl}{a} = \@a; + $defs{$name}{helper}{loadLvl}{bl} = $batchLevel; + $attr{$name}{loadLevel} = join(",",map{"$_:$lvlH{$_}"}sort keys%lvlH) if ($cmd ne "set"); + } elsif($aName eq "dummy"){ if ($cmd eq "set" && $aVal != 0){ RemoveInternalTimer( "keepAliveCk:".$name); @@ -319,6 +367,9 @@ sub HMLAN_UpdtMsgLoad($$) {#################################################### } } $hash->{msgLoadCurrent} = $val; + + my ($r) = grep { $_ <= $val } @{$hash->{helper}{loadLvl}{a}}; + readingsSingleUpdate($hash,"loadLvl",$hash->{helper}{loadLvl}{h}{$r},1); return; } @@ -1110,15 +1161,11 @@ sub HMLAN_getVerbLvl ($$$$){#get verboseLevel for message sys will log system related messages like keep-alive
in order to enable all messages set "all,sys"
-
  • hmMsgLowLimit
    - max messages level of HMLAN allowed for low-level message queue - to be executed. Above this level processing will be postponed.
    - HMLAN will allow a max of messages per hour, it will block sending otherwise. - After about 90% messages the low-priority queue (currently only CUL_HM autoReadReg) - will be delayed until the condition is cleared.
    - hmMsgLowLimit allowes to reduce this level further.
    - Note that HMLAN transmitt-level calculation is based on some estimations and - has some tolerance.
    +
  • loadLevel
    + loadlevel will be mapped to reading vaues.
    + 0:low,30:mid,40:batchLevel,90:high,99:suspended
    + the batchLevel value will be set to 40 if not entered. This is the level at which + background message generation e.g. for autoReadReg will be stopped
  • hmId
  • hmKey
  • @@ -1165,7 +1212,7 @@ sub HMLAN_getVerbLvl ($$$$){#get verboseLevel for message
  • msgLoadCurrent
    Current transmit load of HMLAN. When capacity reaches 100% HMLAN stops sending and waits for reduction. See also: - hmMsgLowLimit
  • + loadLevel
  • msgLoadHistory
    Historical transmition load of HMLAN.
  • msgParseDly
    @@ -1252,18 +1299,12 @@ sub HMLAN_getVerbLvl ($$$$){#get verboseLevel for message sys zeichnet alle systemrelevanten Meldungen wie keep-alive auf.
    all,sys damit wird die Aufzeichnung aller Meldungen eingeschaltet
  • -
  • hmMsgLowLimit
    - maximale Anzahl der Meldungen, die HMLAN für weniger wichtige Meldungen zur - Ausführung zulässt. Bei darüber hinaus gehenden Meldungen wird die Verarbeitung aufgeschoben.
    - HMLAM erlaubt eine maximale Anzahl von Meldungen pro Stunde. Wird diese überschritten, - wird die Aussendung der Meldungen blockiert. Nach ungefähr 90% der maximalen Anzahl - wird die Liste der weniger wichtigen Meldungen (momentan nur CUL_HM autoReadReg) - solange verzögert abgearbeitet, bis die Rahmenbedingungen eine weitere Verarbeitung - wieder zulassen.
    - hmMsgLowLimit ermöglicht eine weitere Reduzierung dieses Grenzwertes.
    - Hinweis: Der HMLAN berechnet die maximale Anzahl der auszusendenden Meldungen - auf Basis einiger Annahmen und ist deshalb mit einer Toleranz behaftet.
    -

  • +
  • loadLevel
    + loadlevel mapped den Auslastungslevel auf die Namen in ein Reading.
    + 0:low,30:mid,40:batchLevel,90:high,99:suspended
    + Der batchLevel Wert wird auf 40 gesetzt., sollte er fehlen. + Das ist der Levelbei dem die Hintergrundnachrichten z.B. durch autoReadReg gestoppt werden
    +

  • hmId

  • hmKey

  • hmKey2

  • @@ -1316,7 +1357,7 @@ sub HMLAN_getVerbLvl ($$$$){#get verboseLevel for message
  • msgLoadCurrent
    Aktuelle Funklast des HMLAN. Da HMLAN nur eine begrenzte Kapzität je Stunde hat Telegramme abzusetzen stellt es bei 100% das Senden ein. Siehe auch - hmMsgLowLimit
  • + loadLevel
  • msgLoadHistory
    Funklast vergangener Zeitabschnitte.
  • msgParseDly