Anzeige NUT(Network UPS Tools) Statusmeldungen

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 "-Befehl zur Abfrage der Variablen der UPS abgesetzt. Die erhaltenen Daten anhand von Schlüsselbergriffen gematcht und dann in IPS-Variablen ausgegeben.

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.

Dynamisch erzeugte Variablen
Dynamisch erzeugte Variablen


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-Instanzen 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.

Clientsocket 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.

IPS RegisterVariable
IPS Register Variable

Es ist dem Script ein neues zyklisches Ereignis mit der gewünschten Abfragerate zuszuweisen. Einen guten Kompromiss zwischen erzeugter Last und schneller Benachrichtigung stellen für mich Werte zwischen 2-5min dar.

IPS Event
IPS Timer Event


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 name
 
Identifikation: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.
Als Alternative kann ein anderer eindeutiger Parameter genutzt werden, wenn dieser die USV sicher unterscheidet. Kandidaten dafür sind z.B. desc (kann man in ups.conf selber definieren) oder ups.model. Dafür muss die entsprechende globale Variablen geändert werden.
$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: Eigene Parameter
Die verschiedenen USV-Modelle stellen eine unterschiedliche Anzahl von Parametern zur Verfügung. Deshalb und aus Gründen der Übersichtlichkeit ist es nicht sinnvoll, alle Parameter im Script anzugeben. Wer möchte, kann das Script aber relativ einfach ergänzen. Details sind in diesem und dem nachfolgenden Posting zu finden.

Index
Disclaimer

© 2011 Thomas Dreßler
Alle Rechte vorbehalten
letzte Änderung 30.12.2011