Überwachen der Stromversorgung mit BayEOS

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.

 

ups-pi

BayEOS Package Repository Konfiguration

  • Key Import
    wget -O - http://www.bayceer.uni-bayreuth.de/repos/apt/conf/bayceer_repo.gpg.key |apt-key add -
  • Eintrag für Repository in /etc/apt/sources.list
    deb http://www.bayceer.uni-bayreuth.de/repos/apt/debian stretch main
  • Repository cache akualisieren
    apt-get update

Software Installation

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

Verbinden der USV mit dem Raspberry Pi

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

NUT Daemon

  1. Um ein Gerät in das NUT System aufzunehmen, registrieren wir es in der Datei /etc/nut/ups.conf
    [apc700]
            driver = usbhid-ups
            port = auto
            desc = "Back-UPS ES 700G" 
    
  2. Eventuell müssen wir die Zugriff-Rules anpassen:
    cp /lib/udev/rules.d/62-nut-usbups.rules /etc/udev/rules.d/
    reboot
  3. Wir definieren den Standalone Mode in der Datei /etc/nut/nut.conf
    MODE=standalone
  4. Jetzt können wir den Daemon mit dem Kommando: upsdrvctl start starten
  5. Eine erste Abfrage über das Tool upsc 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
    
  6. Wir ergänzen den Systemstart mit update-rc.d nut-server defaults

Polling Skript

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.

Python-Skript

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)

Skript Start

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

Funktionskontrolle

  • 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
    ups-search

  • Auf der Registrierkarte 'Nachrichten' können wir die Statusmeldungen kontrollieren:
    ups-messages

  • Die Messwert der Variablen finden wir auf der Registrierkarte 'Kanäle':
    ups-channels

  • 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:
    ups-status

  • Die Kanalansicht zeigt die Kanalwerte jetzt je nach Status farblich hervorgehoben:
    ups-channels-warn

Nächste Schritte

  1. Konfiguration der automatischen Benachrichtigung per E-Mail auf Basis des Nagios-Plugins
  2. Erstellen eines Skripts zur Statusabfrage per HTTP GET auf dem Gateway mit automatischer E-Mail Benachrichtigung im Fehlerfall.
This site makes use of cookies More information