Was macht NUT?
Mit NUT (Network UPS Tools) kann man eine unterbrechungsfreie Stromversorgung (USV, UPS) mit Computern verbinden und Daten von den UPS bekommen.
Für ioBroker gibt es den nut Adapter von @Apollon77, Github und ioBrokerForum . Dieser Adapter stellt einen NUT-Cient bereit und legt eine Datenstruktur im Objektbereich an.
Ich nutze den Adapter hauptsächlich zum mitloggen der Daten wie verbleibende Akuulaufzeit und zur Detektion von Netzspannungsausfällen.
Geeignete UPS (USV)
Die meisten UPS unterstützen diesen Datenaustausch. Entweder per serieller Schnittstelle (nur noch selten anzutreffen), meist per USB oder die edleren direkt über Ethernet.
Luxus: UPS mit eingebauter Netzwerkkarte
Die Luxuslösung sieht dann so aus:
Man kann dann z.B. den NAS einige Minuten nach einem Spannungsausfall herunterfahren und die anderen Geräte wie ioBroker, Router, Switches, Homematic weiter betreiben.
Im ioBroker nut-Adapter trägt man die IP-Adresse der Netzwerkkarte der UPS, deren Port (i.d.R 3493), den Namen der UPS sowie Benutzernamen und Passwort, die auf der Netzwerkkarte der UPS festgelegt sind.
Ein konkretes Beispiel kann ich hier leider nicht geben, da ich leider eine andere Lösung habe.
Einfache Lösung mit Haken: NAS als NUT-Server
Wer über ein geeignetes NAS-Gerät verfügt - in meinem Beispiel Synology - kann das USB-Kabel der UPS direkt dort einstecken und den eingebauten NAS-Server nutzen.
In diesem Fall detektiert die Synology die angeschlossene UPS. Im Menue Hardware & Energie, Tab USV kann man den NUT Server aktivieren und die IP-Adressen der Clients - also auch des ioBroker-Rechners - einstellen.
Im ioBroker Adapter gibt man die IP Adresse der Synology an, sowie wieder Port 3493. Bei Synology muß der Name der UPS sowie dessen Benutzername ups lauten und das password secret .
Das funktioniert recht problemlos und stabil, hat aber einen Haken. Wenn die Synology bei einem Stromausfall heruntergefahren wird, stellt auch deren NUT Server den Dienst ein und der ioBroker wird nicht mehr mit den Daten der UPS versorgt. Also gerade dann, wenn es eigentlich am interessantesten ist.
Um das zu vermeiden, kann man den NUT-Server auf einem (eigenen) Kleinrechner betreiben. Alle anderen Geräte werden dann als Cient betrieben.
NUT-Server auf einem Kleinrechner (SBC)
In meinem Fall ist der SBC ein Orange Pi Plus 2e, der für diese Aufgabe zwar viel zu groß ist, aber durch Migration von ioBoker auf einen Windows Rechner frei wurde.
Das Aufsetzen des NUT-Server erfolgt auf den Spuren von Haus-Automatisierung und Wiki Ubuntuusers
Zuerst System aktualisieren bzw. neu aufsetzen mit µSD Karte
apt update
apt upgrade
Edit: Den NUT-Rechner mit der USV per USB verbinden. Darauf hat @Homoran hingewiesen.
Nut installation:
sudo apt install nut usbutils
Bei älteren Systemen sudo apt-get install nut usbutils
sudo nano /etc/nut/ups.conf
Einfügen:
[ups]
driver = "usbhid-ups"
port = "auto"
desc = "CyberPower"
pollinterval = 30
Bei Verwendung einer Synology muß [ups] verwendet werden.
Sudo reboot
sudo upsdrvctl start
sudo cp /lib/udev/rules.d/62-nut-usbups.rules /etc/udev/rules.d/
sudo reboot
sudo upsdrvctl start
sudo nano /etc/nut/nut.conf
Eintragen:
MODE=netserver
Danach den Dienst starten:
sudo upsd
Wenn alles funktioniert hat, kann man jetzt Daten ausgeben:
sudo upsc ups@localhost
Hier muss eine sinnvolle Liste gelistet werden: Beispiel:
root@opi2e_reserve:~# sudo upsc ups@localhost
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 20
battery.mfr.date: CPS
battery.runtime: 6690
battery.runtime.low: 300
battery.type: PbAcid
battery.voltage: 24.0
battery.voltage.nominal: 24
device.mfr: CPS
device.model: CP1500EPFCLCD
device.serial: CRABCD12345678
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 30
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: CyberPower HID 0.4
driver.version.internal: 0.41
input.transfer.high: 260
input.transfer.low: 170
input.voltage: 235.0
input.voltage.nominal: 230
output.voltage: 267.0
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.load: 5
ups.mfr: CPS
ups.model: CP1500EPFCLCD
ups.productid: 0501
ups.realpower.nominal: 900
ups.serial: CRABCD12345678
ups.status: OL
ups.test.result: No test initiated
ups.timer.shutdown: -60
ups.timer.start: -60
ups.vendorid: 0764
root@opi2e_reserve:~#
Weiter gehts
sudo nano /etc/nut/upsd.conf
Eintragen:
LISTEN 127.0.0.1 3493
LISTEN 192.168.178.123 3493
Also IP-Adresse der eigenen (Nut-Server) Eth Schnittstelle
Starten und stoppen, damit das conf-file wieder eingelesen wird
sudo upsd -c stop
sudo upsd
Jetzt werden Benutzerkonten angelegt, unter denen man von anderen Geräten auf den NUT-Server zugreifen kann. In meinem Beispiel:
Drei user werden erstellt
- upsmaster für den Administrator, der damit aber nichts macht
- monuser für die Synology
- upsmon_remote für den ioBroker
Dazu:
sudo nano /etc/nut/upsd.users
Eintragen:
[upsmaster]
password = irgendwasabergutmerken
actions = SET
instcmds = ALL
upsmon master
[monuser]
password = secret
upsmon slave
[upsmon_remote]
password = secret
upsmon slave
Wieder übernehmen
sudo upsd -c stop
sudo upsd
Jetzt müssen wir das Ganze auch noch reboot-fest machen.
Bei neueren Linux-Systemen geschieht das über systemd. @Thomas-Braun und @David-G haben diese Anpassung dankenswerterweise ausgearbeitet und getestet (siehe dort mit Nutzung dieser Fundstelle):
Zuerst mit
cat /etc/systemd/system/multi-user.target.wants/nut-server.service
prüfen, ob diese Datei vorhanden ist und nut bereits die Vorkehrungen für systemd getroffen hat.
Falls diese Datei existiert, Mit nano öffnen:
sudo nano /etc/systemd/system/multi-user.target.wants/nut-server.service
Diese Datei sieht dann erst mal so aus:
[Unit]
Description=Network UPS Tools - power devices information server
After=local-fs.target network.target nut-driver.service
# We don't Require drivers to be successfully started! This would be
# a change of behavior compared to init SysV, and could prevent from
# accessing successfully started, at least to audit a system.
Wants=nut-driver.service
Before=nut-monitor.service
[Service]
ExecStart=/sbin/upsd
Type=forking
[Install]
WantedBy=multi-user.target
Damit genügend Zeit zur Installation der USB Treiber bleibt, nach der Zeile [Service] noch die Verzögerung
ExecStartPre=/bin/sleep 30
eintragen und die geänderte Datei abspeichern.
Die Datei sollte nun so aussehen
[Unit]
Description=Network UPS Tools - power devices information server
After=local-fs.target network.target nut-driver.service
# We don't Require drivers to be successfully started! This would be
# a change of behavior compared to init SysV, and could prevent from
# accessing successfully started, at least to audit a system.
Wants=nut-driver.service
Before=nut-monitor.service
[Service]
ExecStartPre=/bin/sleep 30
ExecStart=/sbin/upsd
Type=forking
[Install]
WantedBy=multi-user.target
{
Hier die Methode für alte Systeme, bei denen die Datei /etc/systemd/system/multi-user.target.wants/nut-server.service nicht existiert. Darf nicht verwendet werden, wenn diese Datei vorhanden ist und die vorherigen Schritte schon ausgeführt wurden
sudo nano /etc/rc.local
Hier VOR exit=0 einfügen
#additions for nut server
upsdrvctl start
upsd
#end additions for nut server
} Ende der Einstellungen für Altsysteme. Bei neueren Sytsemen nicht mehr verwenden]
Jetzt wird noch der ioBroker Adapter eingestellt. Beispiel
IP des NUT Servers: 192.168.178.123 #Beispiel
Port des NUT Servers: 3493
NUT Name der UPS: ups
Aktualisierungsintervall 300s
Username der UPS: upsmon_remote
Passwort der UPS: secret
Bei der Synology wird eingestellt (Hardware & Energie, Tab USV):
Anhaken: USV-Unterstützung aktivieren
Netzwerk-USV-Typ: Synology USV Server
Netzwerk-USV-Server-IP: 192.168.178.123 #Beispiel
Die Zeit einstellen, nach der die Synology heruntergefahren werden soll + anhaken.
NUT-Server und ioBroker auf einem Rechner
Diese Konfiguration hatte ich nie in Betrieb. Sie müßte aber mit den o.g. Installationsschritten möglich sein. Als IP-Adresse des NUT Servers kann innerhalb des Host Rechners dann localhost oder 127.0.0.1 verwendet werden.
Edit:
Welcher Treiber passt zu meiner USV?
Auswahltabelle Treiber auf der Seite des NUT-Projekts