diff --git a/fhem/contrib/betateilchen/55_apcstatus.pm b/fhem/contrib/betateilchen/55_apcstatus.pm index 70cb062b8..8f345ca35 100644 --- a/fhem/contrib/betateilchen/55_apcstatus.pm +++ b/fhem/contrib/betateilchen/55_apcstatus.pm @@ -1,7 +1,7 @@ -# $Id:$ +# $Id$ #################################################################################################### # -# A FHEM Perl module to retrieve data from an APC uninterruptible power supply (UPS) via APCUPSD. +# A FHEM Perl module to retrieve data from an APC uninterruptible power supply # # This file is part of fhem. # @@ -27,11 +27,9 @@ use warnings; use POSIX; #use FHEM::Meta; -# wird für den Import der FHEM Funktionen aus der fhem.pl benötigt +# Import aus der fhem.pl use GPUtils qw(GP_Import); -## Import der FHEM Funktionen -#-- Run before package compilation BEGIN { # Import from main context @@ -61,18 +59,19 @@ BEGIN { ); } -# _Export - Export references to main context using a different naming schema +our $pkg; + sub _Export { - no strict qw/refs/; ## no critic - my $pkg = caller(0); - my $main = $pkg; - $main =~ s/^(?:.+::)?([^:]+)$/main::$1\_/g; + no strict qw/refs/; + $pkg = caller(0); + my $main = $pkg; + $main =~ s/^(?:.+::)?([^:]+)$/main::$1\_/g; foreach (@_) { *{ $main . $_ } = *{ $pkg . '::' . $_ }; } + use strict qw/refs/; } -#-- Export to main context with different name _Export( qw( Initialize @@ -80,17 +79,16 @@ _Export( ); sub Initialize($) { - my ($hash) = @_; - $hash->{DefFn} = "FHEM::apcstatus::Define"; -# $hash->{SetFn} = "FHEM::apcstatus::Set"; -# $hash->{GetFn} = "FHEM::apcstatus::Get"; -# $hash->{NotifyFn} = "FHEM::apcstatus::Notify"; - $hash->{UndefFn} = "FHEM::apcstatus::Undef"; -# $hash->{DeleteFn} = "FHEM::apcstatus::Delete"; -# $hash->{ShutDownFn} = "FHEM::apcstatus::ShutDown"; - $hash->{AttrFn} = "FHEM::apcstatus::Attr"; + $hash->{DefFn} = "$pkg::Define"; +# $hash->{SetFn} = "$pkg::Set"; +# $hash->{GetFn} = "$pkg::Get"; +# $hash->{NotifyFn} = "$pkg::Notify"; + $hash->{UndefFn} = "$pkg::Undef"; +# $hash->{DeleteFn} = "$pkg::Delete"; +# $hash->{ShutDownFn} = "$pkg::ShutDown"; + $hash->{AttrFn} = "$pkg::Attr"; $hash->{AttrList} = "disable:1,0 " . "disabledForIntervals " @@ -102,278 +100,44 @@ sub Initialize($) { # my $hash = $modules{AptToDate}{defptr}{$d}; # $hash->{VERSION} = $VERSION; # } - -Debug ${__PACKAGE__.'::Test'}; # return FHEM::Meta::InitMod( __FILE__, $hash ); } -sub Define() {} -sub Undef() {} -sub Attr() {} +sub Define($$) { +Debug "test: $pkg"; +} +sub Undef($$) {} +sub Attr(@) {} 1; -=for comment -package main; - -use strict; -use warnings; - -my $apcaccess = "/sbin/apcaccess"; - - -sub APCUPSD_Initialize($) { - my ($hash) = @_; - - #$hash->{internals}{interfaces}= "temperature:battery"; - - $hash->{DefFn} = "APCUPSD_Define"; - $hash->{UndefFn} = "APCUPSD_Undef"; - - $hash->{AttrList} = "disable:0,1 asReadings ".$readingFnAttributes; -} - - -sub APCUPSD_Define($$) { - my ($hash, $def) = @_; - my @a = split("[ \t][ \t]*", $def); - - return "Usage: define APCUPSD [interval [[:]]]" if ( @a < 2 or @a > 4 ); - - if ( ! -e $apcaccess ) { - return "ERROR: $apcaccess does not exist. Please install APCUPSD."; - } - if ( ! -x $apcaccess ) { - return "ERROR: $apcaccess is not executable."; - } - - my $name = $a[0]; - - my $interval = 60; - if ( int(@a)>=3 ) { $interval = $a[2]; } - if ( $interval < 10 ) { $interval = 10; } - - my $dev = $a[3]; - if ( defined $dev ) { - $dev .= ":3551" if ( $dev !~ m/:/ ); - } else { - $dev = "localhost:3551"; - } - - $hash->{HOST} = $dev; - $hash->{STATE} = "Initialized"; - $hash->{INTERVAL} = $interval; - $hash->{LOWBATT} = 20; - - $attr{$name}{asReadings} = "BATTV,BCHARGE,LINEV,LOADPCT,OUTPUTV,TIMELEFT,LASTXFER"; - - APCUPSD_PollTimer($hash); - - return undef; -} - - -sub APCUPSD_Undef($$) { - my ($hash, $arg) = @_; - - RemoveInternalTimer($hash); - return undef; -} - - -sub APCUPSD_RetrieveData($) { - my ($hash) = @_; - my $name = $hash->{NAME}; - - my ($cmd, $val); - $cmd = $apcaccess." status ".$hash->{HOST}." 2>&1"; - $val = `$cmd`; - - if ( $val =~ m/^Error/ | ! length($val) ) { - Log3 $hash, 1, $val; - readingsSingleUpdate($hash, 'state', 'ERROR', 1); - return $val; - } - - my @lines = split /\n/, $val; - - no warnings 'numeric'; - - foreach my $line (@lines) { - if ( $line =~ m/^(.+?)\s*:\s*(.+?)\s*$/ ) { - $hash->{helper}{$1} = $2; - - if ( $1 eq 'STATUS' ) { - readingsSingleUpdate($hash, 'state', $2, 1); - } - if ( $1 eq 'ITEMP' ) { - readingsSingleUpdate($hash, 'temperature', 0+$2, 1); - } - if ( $1 eq 'BCHARGE' ) { - readingsSingleUpdate($hash, 'battery', $2 > $hash->{LOWBATT} ? 'ok' : 'low', 1); - } - if ( $1 eq 'MODEL' ) { - $hash->{MODEL} = $2; - } - if ( $1 eq 'SERIALNO' ) { - $hash->{SERIALNO} = $2; - } - if ( $1 eq 'BATTDATE' ) { - $hash->{BATTDATE} = $2; - } - } - } - - readingsBeginUpdate($hash); - foreach (split (',', $attr{$name}{asReadings})) { - s/^\s+//; - s/\s+$//; - $hash->{helper}{$_} =~ m/^([\-\d\.]*)(.*)$/; - if ( length($1) > 0 ) { - readingsBulkUpdate($hash, lc($_), 0+$1) if defined $hash->{helper}{$_}; - } else { - readingsBulkUpdate($hash, lc($_), $2) if defined $hash->{helper}{$_}; - } - } - readingsEndUpdate($hash, 1); - - return undef; -} - - -sub APCUPSD_PollTimer($) { - my ($hash) = @_; - my $name = $hash->{NAME}; - - RemoveInternalTimer($hash); - InternalTimer(gettimeofday()+$hash->{INTERVAL}, "APCUPSD_PollTimer", $hash, 0); - return if ( AttrVal($name, "disable", 0) > 0 ); - - APCUPSD_RetrieveData($hash); -} - - -1; -=cut - =pod +=item device +=item summary Modul +=item summary_DE Modul + =begin html - -

APCUPSD

+ +

apcstatus

    - APCUPSD (www.apcupsd.com) provides support for uninterruptible power supplies (UPS) manufactured by APC. This module provides access to a APCUPSD server for data readout (eg status, remaining time, input voltage, temperature, etc. ).
    - + apcstatus


    - + Define -
      - define <devicename> APCUPSD [<intervall> [<host>[:<port>]]
      -
      - <intervall> is the interval of data queries to APCUPSD. Default is 60 seconds.
      - <host> is the hostname or IP address of the APCUPSD server. Default is localhost.
      - :<port> is the TCP port APCUPSD server is listening on. Default is :3551.
      -
      - For the function of this module a local installation of APCUPSD package is required. The apcaccess tool is used for data access. - The apcupsd service may not run on the local FHEM system. - Network access to external APCUPSD hosts is possible. A local and networked mixed operation is supported too.
      -
      - If multiple UPS systems are connected to a single host multiple APCUPSD instances on different TCP ports have to be configured there.
      - To set up such a "multiple UPS system" please note www.apcupsd.com/manual/manual.html#controlling-multiple-upses-on-one-machine.
      -

      - Examples:
      - define Usv1 APCUPSD
      - define Usv2 APCUPSD 60 localhost:3552
      - define Usv3 APCUPSD 60 192.168.0.100:3551
      -

    - + Attributes -
      -
    • disable

    • -
    • asReadings
      - Comma-separated list of UPS values ​​to be used as readings. Default is BATTV,BCHARGE,LINEV,LOADPCT,OUTPUTV,TIMELEFT,LASTXFER.
      - Available values ​​can be listed using list <devicename>.
      - All availible readings for specific UPS model are listed in the section following "Helper:".
      - Example:
      - attr <name> asReadings TONBATT,NUMXFERS,LINEFREQ

    • -
    - - +
    + + Readings -
      -
    • battery
      - Battery level of the UPS. "ok" if > 20%, else "low" (if availible)

    • -
    • state
      - The state of the UPS (ONLINE, ON BATTERY, ...)

    • -
    • temperature
      - Internal system temperature (if availible) in degrees Celsius

    • -
    • and the configured parameters by asReadings

    • -
    +
=end html - -=begin html_DE - - -

APCUPSD

-
    - APCUPSD (www.apcupsd.com) bietet Unterstützung für unterbrechungsfreie Stromversorgungen (USV) von APC. Dieses Modul ermöglicht den Zugriff auf einen APCUPSD-Server, womit man Daten auslesen kann (z.B. den Status, Restlaufzeit, Eingangsspannung, Temperatur usw.).
    - -

    - - - Define -
      - define <devicename> APCUPSD [<intervall> [<host>[:<port>]]
      -
      - <intervall> ist das Poll-Intervall mit dem Daten von APCUPSD abgefragt werden. Default ist 60 Sekunden.
      - <host> ist der Hostname oder die IP-Adresse des APCUPSD-Servers. Default ist localhost.
      - :<port> ist der TCP-Port auf den die APCUPSD-Instanz konfiguriert wurde. Default ist :3551.
      -
      - Für die Funktion dieses Moduls wird eine lokale Installation des APCUPSD-Pakets benötigt da das darin enthaltene apcaccess-Tool für den Datenzugriff genutzt wird. - Der ebenfalls enthaltene APCUPSD-Dienst muss hingegen nicht zwingend auf dem FHEM-System laufen. - Der Netzwerkzugriff auf externe APCUPSD-Hosts ist möglich. Ebenso ein lokaler und vernetzter Mischbetrieb.
      -
      - Sollen mehrere USV-Systeme an einem Host von APCUPSD überwacht werden sind dort mehrere APCUPSD-Instanzen auf verschiedenen TCP-Ports notwendig.
      - Zur Einrichtung eines solchen "Mehrfach-USV-Systems" bitte www.apcupsd.com/manual/manual.html#controlling-multiple-upses-on-one-machine beachten.
      -

      - Beispiele:
      - define Usv1 APCUPSD
      - define Usv2 APCUPSD 60 localhost:3552
      - define Usv3 APCUPSD 60 192.168.0.100:3551
      -
    -
    - - - Attributes -
      -
    • disable

    • -
    • asReadings
      - Mit Kommata getrennte Liste der USV-Werte, die als Readings verwendet werden sollen. Der Standardwert lautet BATTV,BCHARGE,LINEV,LOADPCT,OUTPUTV,TIMELEFT,LASTXFER.
      - Verfügbare Werte lassen sich mittels list <devicename> darstellen.
      - Die vom jeweiligen USV-Modell auslesbaren Parameter werden dort im Abschnitt "Helper:" gelistet.
      - Beispiel:
      - attr <name> asReadings TONBATT,NUMXFERS,LINEFREQ

    • -
    - - - Readings -
      -
    • battery
      - Akkuladestand der USV. "ok" wenn > 20%, sonst "low" (wenn verfügbar)

    • -
    • state
      - Der Zustand der USV (ONLINE, ON BATTERY, ...)

    • -
    • temperature
      - Interne Systemtemperatur (wenn verfügbar) in Grad Celsius

    • -
    • sowie die unter asReadings konfigurierten Parameter

    • -
    -
- -=end html_DE =cut