oliver.archner@bayceer.uni-bayreuth.de
02.06.2018
Eine gesicherte Stromversorgung ist für eine lückenlose Aufzeichnung von Messwerten unerlässlich. An Standorten mit einer Netzversorgung von 230V dienen sog. unterbrechungsfreie Stromversorgungen (USV) zur Überbrückung von kurzen Stromausfällen und zur Sicherung der Geräte vor Spannungsspitzen.
In dieser Anleitung zeigen wir ihnen, wie sie eine USV mit einem Raspberry Pi überwachen und den Status an ein BayEOS Gateway senden. Auf Grundlage der Gateway Daten lassen sich im Anschluss Dienste wie z.B. eine automatische Benachrichtigung aufbauen.
wget -O - http://www.bayceer.uni-bayreuth.de/repos/apt/conf/bayceer_repo.gpg.key |apt-key add -
deb http://www.bayceer.uni-bayreuth.de/repos/apt/debian stretch main
apt-get update
Für den Zugriff auf das Gerät setzen wir Teile des NUT Projekts ein und ergänzen Sie um die beliebten BayEOS Packages script-run und bayeosgatewayclient.
apt-get install nut python-nut python-bayeosgatewayclient script-run
Wir verbinden die USV über das USB Kabel mit dem Raspberry Pi und kontrollieren anschließend mit lsusb
, ob ein neues Device angelegt wurde.
root:# lsusb
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
/etc/nut/ups.conf
[apc700]
driver = usbhid-ups
port = auto
desc = "Back-UPS ES 700G"
cp /lib/udev/rules.d/62-nut-usbups.rules /etc/udev/rules.d/
reboot
/etc/nut/nut.conf
MODE=standalone
upsdrvctl start
startenupsc
gibt uns den Gerätestatus aus:
root# upsc apc700@localhost
Init SSL without certificate database
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.date: not set
battery.mfr.date: 2010/06/19
battery.runtime: 2625
battery.runtime.low: 120
battery.type: PbAc
battery.voltage: 13.4
battery.voltage.nominal: 12.0
device.mfr: APC
device.model: Back-UPS ES 700G
device.serial: 3B1025X40366
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
input.sensitivity: medium
input.transfer.high: 266
input.transfer.low: 180
input.voltage: 230.0
input.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 871.O2 .I
ups.firmware.aux: O2
ups.load: 0
ups.mfr: APC
ups.mfr.date: 2010/06/19
ups.model: Back-UPS ES 700G
ups.productid: 0002
ups.serial: 3B1025X40366
ups.status: OL
ups.timer.reboot: 0
ups.timer.shutdown: -1
ups.vendorid: 051d
update-rc.d nut-server defaults
Ein polling Skript fragt alle zehn Sekunden den Gerätestatus ab und sendet ihn bei einer Änderung an ein Gateway. Wir wandeln die Variable upc.status in Textmeldungen um und senden die Werte der Variablen battery.charge und input.voltage als Float-Index Frames (0x41) an ein Gateway.
Datei /usr/local/bin/usv.py
#!/usr/bin/python from bayeosgatewayclient import BayEOSWriter, BayEOSSender from time import sleep import PyNUT PATH = '/tmp/bayeos/usv' NAME = 'Back-UPS-ES-700G' URL = 'http://bayconf.bayceer.uni-bayreuth.de/gateway/frame/saveFlat' # Defintion: https://networkupstools.org/docs/developer-guide.chunked/ar01s04.html STATUS_DIC = {"OL":"on mains", "OB":"on battery", "LB":"low battery", "HB":"high battery", "RB":"replace battery", "CHRG":"battery is charging", "DISCHRG":"battery is discharging", "BYPASS":"bypass circuit is active", "CAL":"calibrating", "OFF":"offline", "OVER":"overloaded", "TRIM":"trimming incoming voltage", "BOOST":"boosting incoming voltage", "FSD":"forced shutdown"} writer = BayEOSWriter(PATH) sender = BayEOSSender(PATH, NAME, URL) sender.start() status = None voltage = None charge = None flush = False while True: nut = PyNUT.PyNUTClient() ups = nut.GetUPSVars(UPS) new_status = ups['ups.status'] if new_status != status: status = new_status msg = "Status:" + ", ".join([STATUS_DIC[x] for x in status.split()]) writer.save_msg(msg) flush = True new_voltage = float(ups['input.voltage']) if new_voltage != voltage: voltage = new_voltage write.save([[1,voltage]],value_type=0x41) flush = True new_charge = float(ups['battery.charge']) if new_charge != charge: charge = new_charge writer.save([[2,charge]],value_type=0x41]) flush = True if flush: writer.flush() flush = False del nut sleep(10)
Ein Eintrag in der Datei /etc/script-run.conf
stellt sicher, dass das Skript beim System-Start aufgerufen wird. Beendet ein nicht abgefanger Fehler unser Skript, wird es automatisch neu gestartet. Auf diese Weise können wir die Implementierung aufwendiger Fehlerbehandlungsroutinen vernachlässigen.
## SCRIPT-SECTION
## use one line per script
/usr/local/bin/usv.py
Wir starten den Raspberry Pi mit dem reboot
Befehl und öffnen anschließend die Weboberfläche des Gateway
Eine Suche über den Origin 'UPS' findet ein neues Gerät
Auf der Registrierkarte 'Nachrichten' können wir die Statusmeldungen kontrollieren:
Die Messwert der Variablen finden wir auf der Registrierkarte 'Kanäle':
Jetzt definieren wir für beide Kanäle die folgenden Statussgrenzen auf dem Gateway:
Kanal | Min. Fehler | Min. Warnung |
---|---|---|
input_voltage | 220 | |
battery_voltage | 30 | 50 |
Unterbrechen wir die Stromversorgung der USV, können wir den Statuswechsel von 'Ok' nach 'Warnung' bis zu 'Kritisch' in der Gateway Hauptansicht live mitverfolgen:
Die Kanalansicht zeigt die Kanalwerte jetzt je nach Status farblich hervorgehoben: