Einsatz:
Abfrage von UPS via NUT in IP-Symcon.
Als Alternative zu APCUPSD wir häufig auch NUT eingesetzt, weils es auch andere Typen unterstützt.
So war auch mein Synology-NAS vom Werk aus mit NUT konfiguriert. Deshalb habe ich das existierende
APCUPSD-Script entsprechend modifiziert.
Das Script bietet eine Implementierung für die wichtigsten Parameter meiner APC UPS, kann aber leicht erweitert werden.
Es wird durch einen zeitgesteuerten IPS-Event (bei mir alle 5min) zyklisch aufgerufen.
Desweiteren wurde eine dynamische Erstellung und Verwaltung der IPS-Variablen sowie von zusätzlichen Variablenprofilen integriert.
Zur Verarbeitung in IPS ist es notwendig, die empfangenen Datensätze zu dekodieren. Jede UPS muss über eine individuelle ID verfügen.
Damit ist es möglich, das gleiche Script für mehrere UPS im Netzwerk einzusetzen.
Sourcecode: (V0.1 12.11.2011)
Funktion:
Das Script implementiert die Auswertung der Status-Daten einer oder mehrerer NUT-Installationen und wird gewöhnlich
über einen Timer (in IPS "zyklisches Ereignis") gestartet.
Dazu wird kurzzeitig eine Socketverbindung zu den konfigurierten UPSD-Instanzen aufgebaut,
mittels des Befehls "LIST UPS" die Liste der vorhandenen UPS abgefragt
und anschliessend mit dem gewonnenen UPS Namen ein "LIST VAR
Für jede UPS wird eine neue IPS-Kategorie in den IPS-Baum eingefügt und dort für viele übermittelte Parameter spezifische Variablen selbstständig angelegt, die sich anschliesssend beliebig weiterverarbeiten lassen. Leider sind die Variablen zwischen den Modellgruppen unterschiedlich, so das ggfls. eine Anpassung der Schlüsselwörter im Script vorgenommen werden muss.
Defaultseitig vorhandene Variablen, die nicht von der USV gefüllt werden können, werden wieder gelöscht. Ausnahme: "NominalPower(ups.realpower.nominal)" wird nur von wenigen UPS bereit gestellt, wird aber zur Berechnung der aktuellen Leistung benöigt. Es wird versucht, diesen Wert aus der Modellbezeichnung und einer Equivalenztabelle (array $nomvalues) zu ermitteln, ansonsten wird ein default Wert eingesetzt, dessen Variablenwert in IPSymcon geändert werden kann.
Den Variablen wurden gängige Variablenprofile zugewiesen, wobei nicht im IPS-Standard enthaltene Profile dynamisch angelegt werden.
Damit können die Statusdaten auch im Webfront automatisch visualisiert werden
Weiterhin werden alle Meldungen in Logfiles geschrieben werden.
Das Regvar-Script kann man auch über die Konsole ausführen.

Installation
Zunächst ist NUT zu installieren. NUT ist für viele Betriebssysteme erhältlich.
Anschliessend sind eine Reihe von Konfigurationsfiles zu bearbeiten.
Für jede UPS ist ein Eintrag in ups.conf mit einem Namen als Sektion und dem entsprechenden Treiber/Port sowie einer Beschreibung ("desc=...")vorzunehmen.
Der eingestellte Name ist der Schlüssel für spätere Zugriffe.
Beispiel:
[myups]
driver = usbhid-ups
port = auto
desc = PC-UPS
Nut muss als Netserver (in nut.conf) konfiguriert werden. In upsd.conf ist sinnvoller Weise "LISTEN 0.0.0.0" (default Port3493) einzustellen.
Auf Linux-Systemen ist gewöhnlich der TCP-Wrapper einkompiliert.
Deshalb muss man auch den Zugriff von IPSymcon in /etc/hosts.allow bzw. /etc/hosts.deny gestatten.
Testweise sollte nun das Programm "upsc" aus der NutClient-Installation aufgerufen werden, z.B. upsc myups@localhost
IPS-Konfiguration:
Dann wird in IPSymcon für jede UPSD-Installation eine IPS-Clientsocket-Instanz und eine zugehörige
RegisterVariablen-Instanz mit der jeweiligen ClientSocket-Instanz als Parent angelegt.
IPS-Instancen
In der Clientsocket-Instanz sind die notierten Werte für Host bzw. IP-Adresse und Port einzutragen.
Zum Eintragen muss die Checkbox "Socket öffnen" aktiviert werden. Im späteren Betrieb ist der Clientsocket normalerweise geschlossen
und wird nur zeitweise durch das Script für die Abfrage geöffnet.
IPS-Client Socket
Es ist ein neues Script mit dem Inhalt von nutregvar.phps zu erstellen und in jeder "Registervariable"-Instance als Ziel zuzuweisen.
Am Anfang des Scriptes sind die IDs der RegisterVariablem-Instancen einzutragen, deren zugeordnete Clientsocket-Instancen abgefragt werden sollen.
$regvars=array(39883,39131);Die StatusVariablen werden später automatisch erzeugt.


Spezielle Konfiguration
Am Enfang des Scriptes befindet sich eine Konfigurationssection, in der einige Optionen gesetzt werden können.
Kategorie- und Variablennamen: Die Namen der angelegten Kategorien kann man ändern, nicht aber deren Hierarchie und die Namen der Variablen. Die Masterkategorie wird in der globalen Variablen geändert. Der Parent der Masterkategorie ist per Default die IP-Symcon-Root (ID=0). Diese kann aber ebenfalls auf eine andere existierende! Kategorie geändert werden, sodass der Variablenbaum an beliebiger Stelle eingehängt werden kann.
$GLOBALS['parent']=0; //parent ID of master category $GLOBALS['catname']='UPSD'; //master category nameIdentifikation:Das Script benötigt eine eindeutige GeräteID, um die Werte bei mehreren USV den richtigen Variablen zuordnen zu können. Aktuell wird dafür 'ups.serial' verwendet. Möglicherweise wird aber nicht bei allen USV oder NUT-Versionen dieser Wert geliefert. Für NUT empfehle ich Version 2.6.1+, die ggfls nachinstalliert werden muss. Bei RHEL/CentOS6 wird z.B.über YUM nur V2.4.3 über epel ausgeliefert, dort fehlte 'ups.serial' bei einer APC. Aktuellere Packete bekommt man über das Fedora Repository oder man kompiliert selbst.
$GLOBALS['idname']='ups.serial';Logging: Das Logfile für das RegVar-Script kann am Anfang des Scriptes in der Variable "$logfile" gesetzt werden. Will man das Logging abschalten, muss die Variable für den entsprechenden Bereich auf eine leere Zeichkette gesetzt werden.
$logfile="";NominalPower: Es wird folgende Logik verwendet: