From 5ade05a2fa6bf3d95e06e4b799278635697e36ef Mon Sep 17 00:00:00 2001 From: narsskrarc <> Date: Thu, 25 Sep 2014 08:32:08 +0000 Subject: [PATCH] 34_NUT: readingFnAttributes added; creation of units deleted; changed asReadings to use comma instead space git-svn-id: https://svn.fhem.de/fhem/trunk@6616 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/34_NUT.pm | 112 ++++++++++++-------------------------------- 2 files changed, 32 insertions(+), 82 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 6c66499ed..f0f5dccac 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 34_NUT: readingFnAttributes added; creation of units deleted; + changed attr asReadings to use comma instead of space - bugfix: SYSMON: crash on FritzBox - bugfix: 34_NUT: fixed possible buffer overflow, rewrote reception of data - bugfix: SYSMON: idletime on multicore, warnings diff --git a/fhem/FHEM/34_NUT.pm b/fhem/FHEM/34_NUT.pm index 62f433232..6200941e7 100644 --- a/fhem/FHEM/34_NUT.pm +++ b/fhem/FHEM/34_NUT.pm @@ -3,6 +3,8 @@ # # Abfrage einer UPS über die Network UPS Tools (www.networkupstools.org) # +# V 0.3.0 [25.09.2014] +# # DEFINE bla NUT [[:]] # Readings: @@ -16,7 +18,7 @@ # disable:0,1 Polling abklemmen # pollState Häufigkeit, mit der der Status der USV abgefragt wird (Default 5 sec) # pollVal Häufigkeit, mit der die anderen Readings abgefragt werden (Default 60 sec, Vielfaches von pollState) -# asReadings Werte des USV, die als Readings zur Verfügung stehen sollen +# asReadings Mit Kommata getrennte Liste der Werte der USV, die als Readings zur Verfügung stehen sollen # # @@ -26,7 +28,6 @@ # A - Sollte man als Reading einfach die Bezeichnung der USV nehmen (also z.B. input.voltage) oder # Aliase nehmen (z.B. voltage) bzw. modifizierte Bezeichnungen (z.B. inputVoltage)? # B - attr pollInterval: Wertebereich prüfen (min. 5, max. ?) -# B - readingFnAttributes implementieren # C - Zusätzliche berechnete Werte - vielleicht auch per attr? # C - per GET könnte man alle Werte der USV verfügbar machen # D - SET implementieren, um diverse Dinge mit der USV anstellen zu können (Test, Ausschalten, ...) @@ -53,35 +54,10 @@ sub NUT_DevInit($); sub NUT_Read($); sub NUT_ListVar($); sub NUT_Auswertung($); -sub NUT_DbLog_split($); sub NUT_createVariables($); sub NUT_makeReadings($); -sub NUT_addUnit($$); -# Definitionen für die Berechnung der Einheit aus dem Namen -my @nutunits = ( - ['percent' => '%'], - ['temperature' => '°C'], - ['humidity' => '%'], - ['voltage' => 'V'], - ['transfer' => 'V'], - ['realpower' => 'W'], - ['power' => 'VA'], - ['current' => 'A'], - ['frequency' => 'Hz'], - ['load' => '%'], - ['charge' => '%'], - ['capacity' => '%'], - ['delay' => 'sec'], - ['timer' => 'sec'], - ['interval' => 'sec'], - ['runtime' => 'sec'] -); - -# Stichwörter, die zeigen, dass _keine_ Einheit vorhanden ist -my @nutunitsexclude = ('alarm', 'extended', 'transfer.reason', 'factor'); - sub NUT_Initialize($) { @@ -93,11 +69,9 @@ sub NUT_Initialize($) { $hash->{UndefFn} = "NUT_Undef"; $hash->{ReadyFn} = "NUT_Ready"; $hash->{ReadFn} = "NUT_Read"; - $hash->{DbLog_splitFn} = "NUT_DbLog_split"; - - $hash->{AttrList} = "disable:0,1 pollState pollVal asReadings model serNo"; -# $readingFnAttributes; + $hash->{AttrList} = "disable:0,1 pollState pollVal asReadings model serNo ". + $readingFnAttributes; } @@ -135,7 +109,7 @@ sub NUT_Define($$) { $attr{$name}{pollState} = 10; $attr{$name}{pollVal} = 60; $attr{$name}{disable} = 0; - $attr{$name}{asReadings} = 'battery.charge battery.runtime input.voltage ups.load ups.power ups.realpower'; + $attr{$name}{asReadings} = 'battery.charge,battery.runtime,input.voltage,ups.load,ups.power,ups.realpower'; $hash->{pollValState} = 0; $hash->{lastStatus} = ""; @@ -253,8 +227,6 @@ sub NUT_Auswertung($) { $hash->{buffer} = ''; } - my %var = (); - foreach my $line (@lines) { if (length($line) > 0) { Log3 $name, 5, "NUT RX: $line"; @@ -271,14 +243,11 @@ sub NUT_Auswertung($) { # Variable erkannt if ($words[1] eq $hash->{UpsName}) { my $var = $words[2]; - $hash->{helper}{$var} = NUT_addUnit($var, $arg); + $hash->{helper}{$var} = $arg; # Sonderfälle if ($var eq 'ups.status') { # Status wird sofort übernommen - # Der Status wird ja oft abgefragt, um nichts zu verpassen. Damit das nicht jedes Mal - # Notifies gibt, wird dieser nur getriggert, wenn sich am Status etwas ändert. - # FIXME und was ist mit event-on-*-reading? - readingsSingleUpdate($hash, 'state', $hash->{helper}{'ups.status'}, $hash->{helper}{'ups.status'} ne $hash->{lastStatus}); + readingsSingleUpdate($hash, 'state', $hash->{helper}{'ups.status'}, 1); $hash->{lastStatus} = $hash->{helper}{'ups.status'}; } elsif ($var eq 'ups.model' and not defined $attr{$name}{model}) { $attr{$name}{model} = $hash->{helper}{$var}; @@ -290,7 +259,16 @@ sub NUT_Auswertung($) { } } elsif ($words[0] eq 'BEGIN') { - # Anfang einer Liste - n/u + # Anfang einer Liste + if ($words[2] eq 'VAR') { + # Hier werden die alten Daten gelöscht. + # Das ist notwendig, da sonst nicht entschieden werden kann, welche Daten die USV liefert + # und welche berechnet werden müssen. + # FIXME Problem: Wenn in der Zeit, bis END LIST VAR durch ist, per GET Werte abgefragt werden sollen, + # dann fehlen die möglicherweise. GET ist aber noch nicht implementiert. + # Mögliche Lösung: Neue Werte in z.B. {helper}{NEW} einlesen und bei END LIST VAR umschieben. + delete $hash->{helper}; + } } elsif ($words[0] eq 'END') { # Ende einer Liste @@ -328,26 +306,6 @@ sub NUT_Auswertung($) { -sub NUT_addUnit($$) { - my ($var, $arg) = @_; - - # Einheiten an die Werte anfügen - # Das soll ja eigentlich nicht passieren, aber da die interfaces nur sehr unvollständig passen, geht das nicht anders. - # Geht das effizienter? - my $excl = join('|', @nutunitsexclude); - unless ($var =~ m/($excl)/) { - foreach my $unit (@nutunits) { - if ($var =~ m/$unit->[0]/) { - $arg .= ' ' . $unit->[1]; - last; - } - } - } - - return $arg; -} - - sub NUT_createVariables($) { my ($hash) = @_; my $name = $hash->{NAME}; @@ -374,11 +332,10 @@ sub NUT_makeReadings($) { my $name = $hash->{NAME}; # Die USV-Variablen en bloc in Readings überführen - # FIXME und was ist mit event-on-*-reading? # FIXME Woher kommt die Fehlermeldung 'Notify loop for...' im Log? readingsBeginUpdate($hash); - foreach (split (' ', $attr{$name}{asReadings})) { + foreach (split (',', $attr{$name}{asReadings})) { readingsBulkUpdate($hash, $_, $hash->{helper}{$_}) if defined $hash->{helper}{$_}; } readingsEndUpdate($hash, 1); @@ -386,21 +343,6 @@ sub NUT_makeReadings($) { } - -sub NUT_DbLog_split($) { - my ($event) = @_; - my ($reading, $value) = split(": ", $event); - my $unit = ""; - - if ($value =~ m/([\d\.]+) (.*)/) { - $value = $1; - $unit = $2; - } - - return ($reading, $value, $unit); -} - - 1; =pod @@ -447,14 +389,17 @@ sub NUT_DbLog_split($) { Attributes
  • disable

  • +
  • readingFnAttributes

  • pollState
    Polling interval in seconds for the state of the ups. Default: 10

  • pollVal
    Polling interval in seconds of the other Readings. This should be a multiple of pollState. Default: 60

  • -
  • asReadings
    - Values of the UPS which are used as Readings
    +
  • asReadings
    + Values of the UPS which are used as Readings (ups.status is read anyway)
    Example:
    - attr theUPS asReadings battery.charge battery.runtime input.voltage ups.load ups.power ups.realpower

  • + attr theUPS asReadings battery.charge,battery.runtime,input.voltage,ups.load,ups.power,ups.realpower
    +
  • withUnits
    + When set to 1, unit are attached to the readings.

  • model
    This is automatically filled with the model name of the UPS.

  • serNo
    @@ -507,14 +452,17 @@ sub NUT_DbLog_split($) { Attributes
    • disable

    • +
    • readingFnAttributes

    • pollState
      Polling-Intervall in Sekunden für den Status der USV. Default: 10

    • pollVal
      Polling-Intervall für die anderen Werte. Dieser Wert wird auf ein Vielfaches von pollState gerundet. Default: 60

    • asReadings
      - Mit Leerzeichen getrennte Liste der USV-Werte, die als Readings verwendet werden sollen.
      + Mit Kommata getrennte Liste der USV-Werte, die als Readings verwendet werden sollen (ups.status wird auf jeden Fall gelesen).
      Beispiel:
      - attr dieUSV asReadings battery.charge battery.runtime input.voltage ups.load ups.power ups.realpower

    • + attr dieUSV asReadings battery.charge,battery.runtime,input.voltage,ups.load,ups.power,ups.realpower
      +
    • withUnits
      + Mit dem Setzen auf 1 werden die passenden Einheiten an die Readings angefügt.

    • model
      Wird automatisch mit der Modellbezeichnung der USV gefüllt.

    • serNo