Raspberry Pi als Network-UPS-Master

Wir kommen nun zu Teil 2 meiner USV-Serie. Dieser Post beschäftigt sich rein mit der Installation der Network UPS Tools auf Raspbian.
Ich habe für meinen Fall hier auf einen Raspberry Pi 4 Model B in der kleinsten Konfiguration mit 1GB RAM und einer 16GB Micro-SD-Karte zurückgegriffen. Preiswert und trotzdem noch völlig überdimensioniert für mein Vorhaben. Der Raspberry Pi ist in meinem Fall noch einen PoE-HAT ausgestattet welcher es mir ermöglicht den Pi direkt über das Netzwerkkabel mit Strom zu versorgen. Als Betriebssystem hab ich hier Raspbian ohne GUI gewählt, mehr wird hier auch nicht benötigt.

Meine Setup dafür besteht aus

  • Raspberry Pi 4 Model B mit 2GB RAM
  • Raspberry PoE HAT
  • Micro-SD-Karte mit 16GB
  • Eaton Ellipse ECO 1200

Installation am Pi

Ausgehend davon das der Pi läuft und via SSH erreichbar ist, hier nun die Konfigurationsschritte für die Network UPS Tools.
Als erstes installieren wir nun mal die benötigten Pakete

sudo apt-get install nut usbutils

Für die Konfiguration müssen wir natürlich unsere USP am Pi anschließen. Wenn das erledigt ist checken wir mal ob wir das USB-Device schon am Pi sehen.

lsusb

Hier sollte ein ähnlicher Output kommen wie bei mir:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0463:ffff MGE UPS Systems UPS
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

So, die UPS wurde erkannt und ist bereit für die Konfiguration. Dafür öffnen wir die Konfigurationsdatei /etc/nut/ups.conf

sudo nano /etc/nut/ups.conf

In dieser Datei müssen wir unsere UPS/USV jetzt hinterlegen.

[ups01]
driver = usbhid-ups
port = auto
vendorid = 0463
desc = "Eaton Ellipse ECO 1200"

Zur Erläuterung:
[ups01] ist der technische Name der UPS. Kann frei gewählt werden, muss aber in den eckigen Klammern stehen.

driver = usbhid-ups gibt an welcher Treiber für die USV verwendet werden soll. Eine vollständige Liste der unterstützen Geräte und deren Treiber findet man in der Hardware Compatibility List von Network-UPS-Tools.

port = auto gibt den Hardware-Port an, bei USB ist das in der Regel auto. Bei einer seriell angebundenen USV benötigt man hier dann den jeweiligen COM-Port

vendorid = 0463 ist bestandteil der USB-Device-ID. Meine UPS hat z.B. die ID 0463:ffff. Die Vendor-ID sind die ersten vier Stellen, also 0463.

desc = „Eaton Ellipse ECO 1200“ ist eine freie textuelle Bezeichnung der jeweiligen UPS.

Ist die Konfiguration erledigt müssen wir den Driver-Controller starten. Das sollte bei der Erstkonfiguration, sofern die Konfiguration ok ist, einwandfrei durchlaufen.

sudo upsdrvctl start

Anschließend können wir uns den Status der UPS mittels dem UPS-Client (upsc) abfragen und wir sollten alle notwendigen Parameter der UPS aufgelistet bekommen.

sudo upsc ups01
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 20
battery.runtime: 3000
battery.type: PbAc
device.mfr: EATON
device.model: Ellipse ECO 1200
device.serial: 000000000
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.parameter.vendorid: 0463
driver.version: 2.7.4
driver.version.data: MGE HID 1.39
driver.version.internal: 0.41
input.transfer.high: 264
input.transfer.low: 184
outlet.1.desc: PowerShare Outlet 1
outlet.1.id: 2
outlet.1.status: on
outlet.1.switchable: no
outlet.2.desc: PowerShare Outlet 2
outlet.2.id: 3
outlet.2.status: on
outlet.2.switchable: no
outlet.desc: Main Outlet
outlet.id: 1
outlet.power: 25
outlet.switchable: no
output.frequency.nominal: 50
output.voltage: 230.0
output.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.firmware: 02
ups.load: 8
ups.mfr: EATON
ups.model: Ellipse ECO 1200
ups.power.nominal: 1200
ups.productid: ffff
ups.serial: 000000000
ups.status: OL
ups.timer.shutdown: -1
ups.timer.start: -1
ups.vendorid: 0463

Sehr gut, die USP ist erfolgreich am Raspi angeschlossen und die Kommunikation funktioniert. Nun müssen wir den Server noch aktivieren. Hierzu muss zunächste, wer hätte es gedacht, das Config-File /etc/nut/nut.conf adaptiert werden.

sudo nano /etc/nut/nut.conf

Die einzige Änderung hier: der Parameter MODE muss auf netserver gestellt werden.

MODE=netserver

Nächstes File: /etc/nut/upsd.conf muss dahingehend adaptiert werden, dass auch externer Zugrifff von anderen Netzwerkgeräten zugelassen wird.

sudo nano /etc/nut/upsd.conf 

Hier im Bereich LISTEN die Server-IP zusätzlich zur localhost-IP zu hinterlegen. Wichtig hier: entweder dem Server eine fixe IP geben oder im jeweiligen DHCP-Server eine fixe Zuweisung hinterlegen.

LISTEN 127.0.0.1 3493
LISTEN 192.168.0.100

Ein Config-File noch dann haben wir es (fast) geschafft. /etc/nut/upsd.user beinhaltet die Definition für verschiedene Benutzer welche sich mit den darin hinterlegten Zugangsdaten am Network-UPS-Server anmelden dürfen.

 sudo nano /etc/nut/upsd.user

Hier legen wir nun zumindest einen User mit der Master-Rolle und einen mit einer Slave-Rolle an.

[upsmaster]
        password = yoursecret
        upsmon master
 
[upsremote]
        password  = yoursecret
        upsmon slave 

Ups, da war doch noch ein weiters File. In /etc/nut/upsmon.conf muss natürlich noch hinterlegt werden welche UPS gemonitored werden soll.

sudo nano /etc/nut/upsmon.conf 

Dazu benötigen wir hier nun schonmal unseren User upsmaster. Wir hängen einfach folgende Zeile an das File an um das Monitoring für unsere UPS zu aktivieren,

MONITOR ups01@localhost 1 upsmaster yoursecret master

Im Anschluss daran starten wir den Service einfach mal neu bzw. können wir auch einen kompletten Reboot durchführen.

sudo systemctl restart nut-server

Wenn wir dann den Status des Services abfragen sollten wir ungefähr folgende Ausgabe bekommen.

● nut-server.service - Network UPS Tools - power devices information server
Loaded: loaded (/lib/systemd/system/nut-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-06 12:49:17 CEST; 2h 43min ago
Process: 579 ExecStart=/sbin/upsd (code=exited, status=0/SUCCESS)
Main PID: 580 (upsd)
Tasks: 1 (limit: 1599)
Memory: 1.5M
CGroup: /system.slice/nut-server.service
└─580 /lib/nut/upsd
May 06 12:49:17 raspberrypi systemd[1]: Starting Network UPS Tools - power devices information server…
May 06 12:49:17 raspberrypi upsd[579]: fopen /var/run/nut/upsd.pid: No such file or directory
May 06 12:49:17 raspberrypi upsd[579]: listening on 192.168.0.100 port 3493
May 06 12:49:17 raspberrypi upsd[579]: listening on 127.0.0.1 port 3493
May 06 12:49:17 raspberrypi upsd[579]: listening on 192.168.0.100 port 3493
May 06 12:49:17 raspberrypi upsd[579]: listening on 127.0.0.1 port 3493
May 06 12:49:17 raspberrypi upsd[579]: Connected to UPS [ups01]: usbhid-ups-ups01
May 06 12:49:17 raspberrypi upsd[579]: Connected to UPS [ups01]: usbhid-ups-ups01
May 06 12:49:17 raspberrypi upsd[580]: Startup successful
May 06 12:49:17 raspberrypi systemd[1]: Started Network UPS Tools - power devices information server.

Nice-to-have: NUT-CGI

Mann mit wenigem Aufwand auch eine Weboberfläche zum visuellen Monitoring aktivieren. Das sieht dann ungefähr so aus:

NUT-CGI im Browser

Was brauchen wir dafür? Lediglich die Packages apache2 und nut-cgi
Außerdem müssen wir CGI am Webserver als Modul aktivieren.

sudo apt-get install apache2
sudo apt-get install nut-cgi 

sudo a2enmod cgi

In altbekannter Weise müssen wir natürlich wiedermal das eine oder andere Config-File ändern. Wir beginnen mit /etc/nut/hosts.conf
Hier wird hinterlegt welche UPS gemonitored werden soll. Man kann somit hier auch mehrere Geräte von einem Server aus überwachen.

sudo nano /etc/nut/hosts.conf

Hier hinterlegen wir einfach die USV und den Host sowie eine Bezeichnung, welche dann im Web angezeigt wird.

MONITOR ups01@localhost "UPS01: Eaton Ellipse ECO 1200"

Aus Sicherheitsgründen ist der Zugriff via CGI standardmäßig im File /etc/nut/upsset.conf deaktiviert.

sudo nano /etc/nut/upsset.conf

Um den Zugriff zu aktivieren müssen wir den auskommentierten Bereich ### I_HAVE_SECURED_MY_CGI_DIRECTORY die # entfernen.

### 
I_HAVE_SECURED_MY_CGI_DIRECTORY
###

Das wars. Nun noch den Webserver neu starten und die Tools sollten laufen

systemctl restart apache2

Die URLs zu den unterschiedlichen Weboberflächen

Zusammenfassung:

Soweit läuft unser physicher Server nun. Er sollte nun auch die Parameter der UPS in Echtzeit anzeigen. Wenn ihr das testen wollt zieht einfach mal den Netzstecker der USV. Im NUT-CGI sollte die USV dann sofort auf den STATUS ON BATTERY switchen.

Der nächste Post wird sich mit der Anbindung des Network-UPS-Servers an das QNAP-NAS beschäftigen. Lassen wir uns mal überraschen was da noch alles auf mich zukommt.