HowTo: Node Red – USV-Status auslesen

Eine dieser Schwachstellen eines SmartHome-Systems die einem erst so richtig bewusst wird, wenn etwas schief läuft ist „Energie“. Die ganzen Sensoren, Aktoren und die steuernde Intelligenz dahinter laufen ja nun leider nicht mit Luft und Liebe. Und auch wenn die von dem System genutzte Energie nicht sehr hoch und generell die Ersparnis dadurch sicherlich höher als die „verbrauchte“ Energie ist, so ist die Versorgungsenergie doch essenziell. Sprich: Kein Strom-> kein SmartHome.

Aber das ist zu teilen erstmal ein Luxus-Problem mit dem man leben könnte. Viel schlimmer finde ich den Gedanken, dass mein RaspberryPi oder generell jeder Computer sich durch einen plötzlichen Stromausfall derartig verschlucken könnte, dass dieser ggf. danach nicht mehr hochfährt.
Denn wird Euer SmartHome-System(RaspberryPi, BeagleBone, Windows-PC, etc..) gerade in dem Moment unterbrochen in dem er wichtige (System-)Daten schreibt so ist es möglich, dass dieses nach wiederherstellen der Stromversorgung nicht mehr richtig hochfährt. Dies führt also im Extremfall zu schmerzlichem Datenverlust und damit oft auch zu einem hohen Zeitverlust. Denn im Extremfall hat man kein Backup des Systems und muss dann das komplette System inkl. aller Systemkomponenten neu aufspielen und konfigurieren.

Aber: Tatsächlich scheinen auch schon andere Menschen über dieses Problem gestolpert zu sein. Für diesen Fall wurden nämlich Unterbrechungsfreie Stromversorgungen(USV’s) erfunden. Diese Geräte werden zwischen Steckdose und Verbraucher(in diesem Fall Euer RaspberryPi,etc.) geschaltet und überwachen ab da durchgehend die Qualität Eurer Netzspannung. Das heißt es wird durchgehend überwacht, ob die eingehende Wechselspannung und die Frequenz in dem erlaubten Bereich ist. Tritt dabei eine Unter- oder Überspannung auf, oder stimmt sonst etwas nicht mit der Versorgungsspannung, schaltet die USV innerhalb von millisekunden den Spannungseingang ab und um auf einen internen Pufferakku. Diese übernimmt dann die Versorgung der angeschlossenen Verbraucher solange bis der Pufferakku leer ist.

USV’s gibt es dabei mittlerweile in allerhand Formen. Die kleinsten sehen aus wie etwas klobige Merfachsteckdosen. Andere – bzw. dessen Akkus – können einen kompletten Raum füllen.

Für den normalen SmartHome-Nutzer reichen da sicherlich die kleineren Varianten. Wie zum Beispiel …

Wie Ihr Eure eigene USV letztendlich in NodeRed integriert und auf Veränderungen reagiert ist in diesem Artikel erklärt.


Sicherheitshinweise

Ich weiß die folgenden Hinweise sind immer irgendwie lästig und wirken unnötig. Aber leider haben schon viele Menschen die es "besser" wussten aus Leichtsinnigkeit Augen, Finger oder anderes verloren bzw. sich verletzt. Im Vergleich dazu ist ein Datenverlust fast nicht der Rede Wert, aber auch diese können echt ärgerlich sein. Deswegen nehmt Euch bitte fünf Minuten Zeit um die Sicherheitshinweise zu lesen. Denn auch das coolste Projekt ist keine Verletzung oder anderen Ärger wert.
https://www.nerdiy.de/sicherheitshinweise/

Affiliatelinks/Werbelinks

Die hier in aufgeführten Links zu Online-Shops sind sogenannte Affiliate-Links. Wenn Du auf so einen Affiliate-Link klickst und über diesen Link einkaufst, bekommt Nerdiy.de von dem betreffenden Online-Shop oder Anbieter eine Provision. Für Dich verändert sich der Preis nicht. Falls Du Deine Einkäufe über diese Links tätigst unterstützt Du Nerdiy.de dabei auch in Zukunft weitere nützliche Projekte anbieten zu können. 🙂 


Voraussetzungen

Hilfreiche Artikel:
Damit Ihr Eure USV über Euren RaspberryPi und NodeRed steuern/konfigurieren könnt sollte dieser natürlich soweit vorbereitet sein, dass NodeRed auf diesem läuft und Ihr per SSH auf diesen zugreifen könnt.

RaspberryPi – Einrichten für Nerdiys!
RaspberryPi – Die Erste Konfiguration!
RaspberryPi – Den RaspberryPi über SSH steuern
NodeRed – Installation von NodeRed auf dem RaspberryPi
NodeRed – Node-Code importieren und exportieren
NodeRed – Pushbullet Nachrichten bei Ereignissen senden
NodeRed – Mit Dashboard-Nodes eine Benutzeroberfläche erstellen

Benötigtes Material:

In der folgenden Liste findet Ihr alle Teile die Ihr zur Umsetzung dieses Artikels benötigt.


Auslesen einer an den RaspberryPi angeschlossenen USV

Der Nachteil einer Unterbrechungsfreien Stromversorgung ist, dass der RaspberryPi ohne weiteres nichts davon mitbekommt, sobald etwas mit der Stromversorgung nicht (mehr) stimmt. Eigentlich ist es ja so gewünscht. Auf der anderen Seite kann der RaspberryPi aber so auch nicht auf diese Änderung reagieren.

Denn auch wenn der Akku einer USV im Vergleich zum Verbrauch eines RaspberryPi’s recht üppig ist: Die Akkukapazität ist endlich. Deswegen sollte der RaspberryPi zum Beispiel automatisch herunterfahren bevor der Akku vollends erschöpft ist. So werden Risiken zu Datenverlust minimiert und es kann kontrolliert auf den Stromausfall reagiert werden.

Damit der RasperryPi über Veränderungen von der USV informiert werden kann muss diese über eine USB oder serielle Verbindung mit dem RasperryPi verbunden werden.

Für den RaspberryPi gibt es dazu das Programm „Apcupsd“, welches es Euch ermöglicht den Status Eurer USV einzulesen. Diesen Status könnt Ihr dann ebenfalls dazu nutzen um per NodeRed darauf zu reagieren.

So wäre es zum Beispiel möglich bestimmte Komponenten ebenfalls abzuschalten oder auch anderen RaspberryPi’s – insofern sie durch den Stromausfall nicht eh ausgefallen sind  – herunterzufahren.

Bevor Ihr allerdings den Status Eurer USV in NodeRed auslesen könnt, muss zunächst „apcupsd“ installiert werden.


Per SSH auf dem RaspberryPi einloggen

Um zu beginnen müsst Ihr Euch als erstes mit Putty per SSH auf dem RasPi einloggen. Wie das geht ist im Artikel RaspberryPi - Den RaspberryPi über SSH steuern beschrieben.

Nach der Eingabe Eures Benutzernamen und Passworts könnt Ihr die ersten Befehle eingeben.

Paketverwaltung aktualisieren

Die Paketverwaltung in Linux ist eine "zentrale Stelle" über die sich diverse Software-Pakete installieren lassen. Damit dies zuverlässig funktioniert sollten vor jeder Installation von neuen Paketen die Listen und Quellen der Paketverwaltung aktualisiert werden.

Um das Update der Paketverwaltung zu starten müsst ihr folgenden Befehl eingeben.
sudo apt-get update && sudo apt-get upgrade
Je nachdem wie lange Euer letztes Update der Paketverwaltung her ist kann dieser Vorgang nun etwas dauern. Dabei werden zuerst die Listen aktualisiert in denen auf die einzelnen Paketquellen verwiesen wird.
Danach werden die Pakete selber aktualisiert. Da dabei zusätzlicher Speicher belegt wird, werdet Ihr nochmal nach Eurem Einverständnis gefragt. Dies müsst Ihr mit einem "J" und "Enter" bestätigen.
Ist die Aktualisierung abgeschlossen wird euch eine kleine Zusammenfassung über die Dauer und den Umfang des Updates angezeigt.

„apcupsd“ auf dem RaspberryPi installieren

Damit Euer RaspberryPi mit der angeschlossenen USV kommunizieren kann, müsst Ihr zunächst ein paar Pakete installieren.

Ein Programm dass direkt mit Eurer über USB angeschlossenen USV kommunizieren kann ist das Programm „apcupsd“, welches Ihr mit folgendem Befehl installiert.
sudo apt-get install apcupsd
Eventuelle Nachfragen, dass durch das Programm zusätzlicher Speicher belegt wird, bestätigt Ihr mit „J“.
Die Installation dauert in etwa zwei Minuten.

Apcupsd konfigurieren

Bevor Ihr „apcupsd“ nutzen könnt, muss dieses zunächst natürlich noch konfiguriert werden. Dazu müssen ein paar Konfigurationsdateien bearbeitet werden.

Die erste Konfigurationsdatei öffnet Ihr mit folgendem Befehl.
sudo nano /etc/apcupsd/apcupsd.conf
In der geöffneten Konfigurationsdatei müsst Ihr nun als erstes mit den Pfeiltasten…
…bis zur dargestellten Zeile navigieren. Dort wird festgelegt, über welchen Kabeltyp die USV mit Eurem RaspberryPi verbunden ist. Sehr wahrscheinlich ist Eure USV über den USB-Anschluss mit Eurem RaspberryPi verbunden. Deshalb stellt Ihr hier auch „UPSCABLE usb“ ein.
UPSCABLE usb
Da Ihr ein USB-Kabel angeschlossen habt, müsst Ihr natürlich auch den UPSTYPE auf usb setzen.
UPSTYPE usb
Damit die Verbindung zur USV über USB funktioniert, müsst Ihr nun noch den Parameter „DEVICE“ bearbeiten. Diesem darf kein Wert zugewiesen werden. Entfernt dazu also den abgebildeten Teil „/dev/ttsyS0“ neben „DEVICE“.
Dies sollte dann so aussehen.
Nun könnt Ihr noch ein paar Einstellungen vornehmen, wie sich apcupsd im Fall eines Stromausfalls verhalten soll. Mit dem Parameter „BATTERYLEVEL“ lässt sich zum Beispiel einstellen, dass der RaspberryPi bei einem verbleibenden Ladezustand der USV von 5% heruntergefahren wird.
Der Parameter „MINUTES“ gibt dabei an bei welcher Restlaufzeit in Minuten der RaspberryPi heruntergefahren werden soll.
Mit dem Parameter „NETSERVER“ könnt Ihr einen Nertzwerkserver aktivieren, der die Informationen der USV über das Netzwerk zur Verfügung stellt. So können auch andere Netzwerkteilnehmer im Falle eines Stromausfalls ebenfalls auf diesen reagieren und zum Beispiel herunterfahren. Um den Netzwerkserver zu aktivieren müsst Ihr den Parameter auf „NETSERVER on“ einstellen.
Mithilfe des Parameters „NISIP“ könnt Ihr einstellen auf welche IP-Adresse der Server „höhrt“. Dies ist nur dann nötig, wenn Ihr mehr als eine Netzwerkinterface an dem betreffendem System habt. An einem RaspberryPi könntet Ihr damit zum Beispiel einstellen, dass der Server nur anfragen Beantwortet die er über das WLAN-Interface und nicht über das LAN-Interface erhält. In den meisten Fällen könnt Ihr diesen Parameter allerdings auf „NISIP 0.0.0.0“ einstellen. Dies bedeutet, dass alle Anfragen, unabhängig vom Netzwerk-Interface, beantwortet werden.
Durch den Parameter „NISPORT“ wird der Port festgelegt unter dem die Informationen des Servers abgerufen werden können. Diesen solltet Ihr unverändert auf dem Wert „3551“ eingestellt lassen.
Diese Konfiguration speichert Ihr dann mit einem Druck auf „STRG-X“ und „J“…
…und „Enter“.
Nun müsst Ihr apcupsd noch mitteilen, dass eine Konfiguration vorhanden ist. Öffnet dazu eine weitere Konfigurationsdatei durch folgenden Befehl.
sudo nano /etc/default/apcupsd
Stellt den Parameter „ISCONFIGURED“ dazu auf…
…“yes“ ein.
Diese Konfiguration speichert Ihr dann wieder mit einem Druck auf „STRG-X“ und „J“…
…und „Enter“.
Starten lässt sich der apcupsd-Service dann mit folgendem Befehl.
sudo /etc/init.d/apcupsd start
Ist das Programm erfolgreich gestartet sollte das ganze dann so aussehen.
Mit dem Befehl „apcaccess status“ lässt sich dann der aktuelle Status der USV anzeigen. Sollte keine Verbindung zur USV hergestellt werden können sieht die Antwort wie abgebildet aus.
apcaccess status
Im Fall, dass die Verbindung zur USV hergestellt werden und die Informationen ausgelesen werden können, werden Euch dann die abgebildeten Informationen angezeigt.
Solltet Ihr „apcupsd“ mal neustarten müssen reicht die Eingabe des folgenden Befehls.
sudo /etc/init.d/apcupsd restart

Ihr habt nun also bereits die Möglichkeit die Informationen der USV auf dem RaspberryPi anzeigen zu lassen.  Um diese Informationen auch für Euer SmartHome zu nutzen könnt Ihr den folgenden NodeCode verwenden.


NodeCode importieren

Mit dem folgendem NodeCode könnt Ihr Euch ein paar Details des aktuellen Status Eurer USV anzeigen lassen. So könnt Ihr individuell auf bestimmte Eigenschaften reagieren.

Zum Beispiel wäre es möglich Euch per Pushbullet-Nachricht über einen Stromausfall benachrichtigen zu lassen oder wie im unten angegebenen Beispiel die wichtigsten Daten auf dem Dashboard anzeigen zu lassen. Damit im Falle eines Stromausfalls Pushbullet-Nachrichten versendet werden können, solltet Ihr natürlich sicherstellen, dass Eure komplette Netzwerkinfrastruktur auch durch die USV abgesichert wird. Ist der Stromausfall sehr großflächig hilft aber natürlich auch das nicht mehr. Deswegen ist eine Kommunikation über das Internet im Falle eines Stromausfalls natürlich nicht garantiert möglich.

Wie Ihr NodeCode in Eure NodeRed Konfiguration importiert ist im Artikel NodeRed – Node-Code importieren und exportieren beschrieben. Nach dem importieren müsst ihr ggf. auch die Pushbullet-Node konfigurieren. Infos dazu findet Ihr im Artikel NodeRed – Pushbullet Nachrichten bei Ereignissen senden. Zum Anzeigen der USV-Daten werden Dashboard-Nodes verwendet. Infos dazu findet Ihr im Artikel NodeRed – Mit Dashboard-Nodes eine Benutzeroberfläche erstellen.

Ansicht der USV-Status-Anzeige im Dashboard.
Übersicht der NodeCode-Konfiguration in der NodeRed Konfigurationsoberfläche.
[{"id":"e2a1a48.9207858","type":"exec","z":"8c9f8f17.13eb78","command":"/sbin/apcaccess","append":"","useSpawn":"","name":"apcaccess","x":390,"y":1740,"wires":[["c5f64040.b7a32","9ef1333b.1cf96"],[],[]]},{"id":"ebe2e46e.660788","type":"inject","z":"8c9f8f17.13eb78","name":"status request","topic":"","payload":"","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":"","x":200,"y":1740,"wires":[["e2a1a48.9207858"]]},{"id":"c5f64040.b7a32","type":"trigger","z":"8c9f8f17.13eb78","op1":"true","op2":"false","op1type":"bool","op2type":"bool","duration":"1","extend":true,"units":"min","reset":"","bytopic":"all","name":"status","x":570,"y":1700,"wires":[["c65a87d0.d60ef8"]]},{"id":"c65a87d0.d60ef8","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"change","p":"topic","pt":"msg","from":"^(.*)$","fromt":"re","to":"online","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":1700,"wires":[["e9c65962.f1bd98"]]},{"id":"9ef1333b.1cf96","type":"function","z":"8c9f8f17.13eb78","name":"convert2Json","func":"const ans = {}\n\nArray.prototype.map.call( msg.payload.trim().split(\"\\n\"), function(line) \n{\n    if ( line.trim() === '' ) return\n    let part = line.split(':')\n    // Some values contain ':', when they do, we have to rejoin\n    if ( part.length > 2 ) {\n        let newPart = []\n        newPart.push( part.shift() )\n        newPart.push( part.join(':') )\n        part = newPart\n    }\n    \n    let payloadName = part[0].toLowerCase().trim()\n    let payloadValue = part[1].trim()\n    ans[payloadName] = payloadValue\n    return\n    \n} )\n\nmsg.payload = ans\n\nreturn msg","outputs":1,"noerr":0,"x":600,"y":1760,"wires":[["7177d00d.0f8c1","f49b6561.709b18","9cd3b15b.3aa0a","cbdff947.6252f8","9a68559b.2e0408","a998a9f0.b4c2f8","cbb1400b.8107f","4db0abb3.948d94"]]},{"id":"e9c65962.f1bd98","type":"debug","z":"8c9f8f17.13eb78","name":"online/offline-Status","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":980,"y":1700,"wires":[]},{"id":"7177d00d.0f8c1","type":"debug","z":"8c9f8f17.13eb78","name":"Data as JSON payload","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":840,"y":1760,"wires":[]},{"id":"90dd24c3.50c968","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Battery charge","group":"c8fbbc62.c288a","order":4,"width":0,"height":0,"gtype":"gage","title":"Battery charge:","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#ca3838","#e6e600","#00b500"],"seg1":"","seg2":"","x":1080,"y":1800,"wires":[]},{"id":"4b7d84af.22ddfc","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Batterie-Temperature","group":"c8fbbc62.c288a","order":5,"width":0,"height":0,"gtype":"gage","title":"Batterie-Temperature:","label":"°C","format":"{{value}}","min":"20","max":"40","colors":["#00b500","#00b500","#ca3838"],"seg1":"","seg2":"","x":1100,"y":1840,"wires":[]},{"id":"c655e83c.23f538","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Batterie-Voltage","group":"c8fbbc62.c288a","order":6,"width":0,"height":0,"gtype":"gage","title":"Batterie-Voltage:","label":"V","format":"{{value}}","min":"11","max":"15","colors":["#ca3838","#00b500","#ca3838"],"seg1":"","seg2":"","x":1080,"y":1880,"wires":[]},{"id":"3ce99364.46890c","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Mains voltage","group":"c8fbbc62.c288a","order":7,"width":0,"height":0,"gtype":"gage","title":"Mains voltage:","label":"V","format":"{{value}}","min":"220","max":"240","colors":["#ca3838","#00b500","#ca3838"],"seg1":"","seg2":"","x":1080,"y":1920,"wires":[]},{"id":"810aaaf7.ec4f48","type":"ui_text","z":"8c9f8f17.13eb78","group":"c8fbbc62.c288a","order":1,"width":0,"height":0,"name":"Status","label":"Status:","format":"{{msg.payload}}","layout":"row-spread","x":1050,"y":1960,"wires":[]},{"id":"f49b6561.709b18","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.bcharge","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":1800,"wires":[["90dd24c3.50c968"]]},{"id":"9cd3b15b.3aa0a","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.itemp","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":1840,"wires":[["4b7d84af.22ddfc"]]},{"id":"cbdff947.6252f8","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.battv","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":1880,"wires":[["c655e83c.23f538"]]},{"id":"9a68559b.2e0408","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.linev","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":1920,"wires":[["3ce99364.46890c"]]},{"id":"a998a9f0.b4c2f8","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.status","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":820,"y":1960,"wires":[["810aaaf7.ec4f48"]]},{"id":"5f70becf.c02b8","type":"ui_text","z":"8c9f8f17.13eb78","group":"c8fbbc62.c288a","order":2,"width":0,"height":0,"name":"Last Update","label":"Last Update:","format":"{{msg.payload}}","layout":"row-spread","x":1070,"y":2000,"wires":[]},{"id":"cbb1400b.8107f","type":"function","z":"8c9f8f17.13eb78","name":"","func":"msg.payload=Date(Date.now());\nreturn msg;","outputs":1,"noerr":0,"x":790,"y":2000,"wires":[["5f70becf.c02b8"]]},{"id":"4db0abb3.948d94","type":"function","z":"8c9f8f17.13eb78","name":"","func":"if (msg.payload.linev<=100)\n{\n    msg.payload=\"Power failure: UPS-Mains-voltage below 100V!\";\n    return msg;\n}","outputs":1,"noerr":0,"x":790,"y":2040,"wires":[["f62fd4e0.66c8b8"]]},{"id":"f62fd4e0.66c8b8","type":"pushbullet","z":"8c9f8f17.13eb78","config":"e3daf163.eeb16","pushtype":"note","title":"SmartHome","chan":"","name":"","x":1070,"y":2040,"wires":[]},{"id":"622137c.74419c8","type":"inject","z":"8c9f8f17.13eb78","name":"Test Power failure","topic":"","payload":"60","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":410,"y":2040,"wires":[["4f72d77f.af5ee8"]]},{"id":"4f72d77f.af5ee8","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"temp","pt":"flow","to":"payload","tot":"msg"},{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"payload.linev","pt":"msg","to":"temp","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":2040,"wires":[["4db0abb3.948d94"]]},{"id":"c8fbbc62.c288a","type":"ui_group","z":"","name":"USV2","tab":"4719e8d9.2a46f8","disp":true,"width":"6","collapse":false},{"id":"e3daf163.eeb16","type":"pushbullet-config","z":"","name":"FabsPushbullet"},{"id":"4719e8d9.2a46f8","type":"ui_tab","z":"","name":"Einstellungen","icon":"dashboard"}]

Auslesen einer an eine Synology-NAS angeschlossenen USV

Falls Ihr eine Synology-NAS oder generell ein NAS besitzt ist das Thema Datenverlust noch von viel größerer Bedeutung. Immerhin sollen die Familienfotos(oder ein Teil davon) bei einem Stromausfall ja nicht im Daten-Nirwana verschwinden. Deswegen bieten viele Hersteller die Funktion an das eigen NAS mit einer USV vor Stromausfall zu schützen. Die USV wird dabei dann auch per USB an das NAS angeschlossen um über eine Statusänderung informieren zu können. Sollte dann ein Stromausfall eintreten, erkennt das NAS dies und fährt automatisch und kontrolliert herunter. Praktisch und gut für die auf dem NAS gespeicherten Daten. Gleichzeitig aber unpraktisch, dass die anderen Netzwerkteilnehmer nichts von der Situation erfahren(Außer darüber, dass der Strom ausgefallen ist).

Dazu bieten zumindest die NAS von Synology eine Lösung an: Über einen integrierten Netzwerk-USV-Server lässt sich dort auch von anderen Netzwerkteilnehmern der Status der an das NAS angeschlossenen USV erfassen. So kann man den Status letztendlich auch auf dem RaspberryPi und somit auch in NodeRed erfassen.

Damit der Netzwerk-USV-Server funktioniert muss er zunächst eingerichtet werden. Wechselt dazu in die Systemsteuerung der DiskStationManager(DSM)-Oberfläche…
… und zur Kategorie „Hardware & Energie“. Dort klickt Ihr auf die Karteikarte „USV“.
Dort sollte die angeschlossene USV bereits konfiguriert sein. In diesem Fall wird das NAS nach dem Auftreten eines Stromausfalls nach 3 Minuten automatisch heruntergefahren. Um nun den Netzwerk-USV-Server zu aktivieren, setzt Ihr einen Haken bei „Netzwer-USV-Server aktivieren“ und klickt auf den Button „Zugelassene DiskStation Geräte“.
In dem sich nun öffnendem Fenster könnt Ihr mehrere IP-Adressen von Geräten in Eurem Netzwerk eintragen, denen es erlaubt ist auf die Informationen des Netzwerk-USV-Servers zuzugreifen. Dieses so genannte „Whitelist“-Verfahren stellt sicher, dass nur berechtigte Netzwerkteilnehmer diese Informationen erhalten können. In diesem Feld tragt Ihr wie abgebildet die IP-Adresse Eures RaspberryPi’s ein von dem Ihr per NodeRed den USV-Status einlesen wollt. Wie Ihr die IP-Adresse der Geräte in Eurem Netzwerk herausfindet ist im Artikel IP-Adresse der Geräte im Netzwerk anzeigen/herausfinden beschrieben. Habt ihr die IP-Adresse eingetragen klickt Ihr auf „OK“…
…und im darauffolgenden Fenster auf „Übernehmen“.

Die NetworkUpsTools(NUT) auf dem RaspberryPi installieren um USV-Daten von einem USV-Server abrufen zu können

Nun wo der Server zur Bereitstellung der USV Informationen eingerichtet ist, muss natürlich auch die Client-Seite(also Euer RaspberryPi) entsprechend konfiguriert werden. Denn dieser muss natürlich auch Kontakt zu dem Netzwerk-USV-Server auf Eurem NAS aufnehmen können. Ein Programm dass dies ermöglicht ist das „NetworkUpsTool“, welches wie folgt installiert werden kann.

Zum installieren der Anwendung „NUT“ müsst Ihr folgenden Befehl eingeben.
sudo aptitude install nut

Hinweis: Für die Installation von „NUT“ benötigt Ihr die Erweiterung „aptitude“ für die Paketverwaltung „APT“. Diese lässt sich – falls nicht bereits vorhanden – mit folgendem Befehl installieren.

sudo apt-get install aptitude

Eventuelle Fragen während der Installation bestätigt Ihr mit einem „y“ und „Enter“. Meistens(wie auch in diesem Beispiel) beziehen sich diese Fragen darauf, ob durch die zu installierenden Tools zusätzlicher Speicherplatz belegt und ob auch weitere (benötigte) Pakete installiert werden dürfen.

Nach der Installation muss „NUT“ noch konfiguriert werden. Dazu öffnet Ihr die Konfigurationsdatei mit dem folgenden Befehl.
sudo nano /etc/nut/nut.conf
In der nun offenen Konfigurationsdatei navigiert Ihr mit den Pfeiltasten bis zur dargestellten Zeile.
Dort angekommen ändert Ihr die Zeile von „Mode=none“ zu „Mode=netclient“. Dies teil „NUT“ mit, dass es als Netzwerk-Client für einen Netzwerk-USV-Server fungieren soll.
Mode=netclient
Diese Konfiguration speichert Ihr mit einem Druck auf „STRG-X“ und „J“…
…und letztendlich auf „Enter“.
Nun müsst Ihr natürlich noch konfigurieren unter welcher Adresse der Netzwerk-USV-Server zu erreichen ist. Dazu öffnet Ihr eine weitere Konfigurationsdatei mit folgendem Befehl.
sudo nano /etc/nut/upsmon.conf
Navigiert dann mit den Pfeiltasten bis Ihr in der angegebenen Zeile angekommen seid. Dort muss die Zeile „MONITOR ups@*IP-ADRESSE-EURER-NAS* 1 monuser secret slave“ eingefügt werden. Dabei muss *IP-ADRESSE-EURER-NAS* natürlich durch die IP-Adresse Eures Netzwerk-USV-Servers also Eurer NAS ersetzt werden. Nur so weiß NUT woher es die USV-Informationen beziehen kann.
MONITOR ups@*IP-ADRESSE-EURER-NAS* 1 monuser secret slave
Diese Konfiguration speichert Ihr dann wieder mit einem Druck auf „STRG-X“ und „J“…
…und letztendlich auf „Enter“.
Damit die Änderungen an der Konfigurationsdatei übernommen werden müsst Ihr den NUT-Clienten nun nur noch neu starten. Dies geht mit dem Befehl „sudo service nut-client restart“.
sudo service nut-client restart
Mithilfe des Befehls „sudo upsc ups@*IP-ADRESSE-EURER-NAS*“ könnt Ihr nun die aktuellen Informationen zu Eurer USV vom Netzwerk-USV-Server abrufen. Dabei muss *IP-ADRESSE-EURER-NAS* natürlich wieder durch die IP-Adresse Eures Netzwerk-USV-Servers also Eurer NAS ersetzt werden.
sudo upsc ups@*IP-ADRESSE-EURER-NAS*
Die Informationen werden Euch dann nach dem angegeben Muster angezeigt. Dadurch wird zum Beispiel der Ladezustand, das Modell, und verschiedene Spannungen angezeigt.

NodeCode importieren

Mit dem folgendem NodeCode könnt Ihr Euch ein paar Details des aktuellen Status Eurer an Eure Synology NAS angeschlossenen USV anzeigen lassen. So könnt Ihr individuell auf bestimmte Eigenschaften reagieren.

Zum Beispiel wäre es möglich Euch per Pushbullet-Nachricht über einen Stromausfall benachrichtigen zu lassen oder wie im unten angegebenen Beispiel die wichtigsten Daten auf dem Dashboard anzeigen zu lassen. Damit im Falle eines Stromausfalls Pushbullet-Nachrichten versendet werden können, solltet Ihr natürlich sicherstellen, dass Eure komplette Netzwerkinfrastruktur auch durch die USV abgesichert wird. Ist der Stromausfall sehr großflächig hilft aber natürlich auch das nicht mehr. Deswegen ist eine Kommunikation über das Internet im Falle eines Stromausfalls natürlich nicht garantiert möglich.

Wie Ihr NodeCode in Eure NodeRed Konfiguration importiert ist im Artikel NodeRed – Node-Code importieren und exportieren beschrieben. Nach dem importieren müsst ihr ggf. auch die Pushbullet-Node konfigurieren. Infos dazu findet Ihr im Artikel NodeRed – Pushbullet Nachrichten bei Ereignissen senden. Zum Anzeigen der USV-Daten werden Dashboard-Nodes verwendet. Infos dazu findet Ihr im Artikel NodeRed – Mit Dashboard-Nodes eine Benutzeroberfläche erstellen.

Ansicht der USV-Status-Anzeige im Dashboard.
Übersicht der NodeCode-Konfiguration in der NodeRed Konfigurationsoberfläche.
[{"id":"b7aefd76.e8bf9","type":"comment","z":"8c9f8f17.13eb78","name":"USV-Server data request","info":"","x":170,"y":2160,"wires":[]},{"id":"66e7a9bd.eb6c58","type":"inject","z":"8c9f8f17.13eb78","name":"","topic":"status request","payload":"","payloadType":"date","repeat":"60","crontab":"","once":true,"onceDelay":0.1,"x":180,"y":2240,"wires":[["d3649b9.f1b5468"]]},{"id":"d3649b9.f1b5468","type":"exec","z":"8c9f8f17.13eb78","command":"sudo upsc ups@192.168.3.59","addpay":false,"append":"","useSpawn":"","timer":"","oldrc":false,"name":"get UPS status","x":420,"y":2240,"wires":[["22edb893.55ed38"],[],[]]},{"id":"22edb893.55ed38","type":"function","z":"8c9f8f17.13eb78","name":"convert2Json","func":"const convertData = {}\n\nArray.prototype.map.call( msg.payload.trim().split(\"\\n\"), function(line) \n{\n    if ( line.trim() === '' ) return\n    let part = line.split(':')\n    \n    // Some values contain ':', when they do, we have to rejoin\n    if ( part.length > 2 ) {\n        let newPart = []\n        newPart.push( part.shift() )\n        newPart.push( part.join(':') )\n        part = newPart\n    }\n    \n    let payloadName = part[0].toLowerCase().trim()\n    payloadName = part[0].replace(/\\./g, \"_\")\n    let payloadValue = part[1].trim()\n    convertData[payloadName] = payloadValue\n    return\n    \n} )\n\nmsg.payload = convertData\n\nreturn msg","outputs":1,"noerr":0,"x":630,"y":2240,"wires":[["61f07a9c.f54824","a1504bd4.049f18","4e4d02.d85ad3","641d6b8a.a25e34","49343e5b.85218","3c698623.45215a","83b9ebee.451878","282426fe.c5650a","50224b5b.8a4164"]]},{"id":"61f07a9c.f54824","type":"debug","z":"8c9f8f17.13eb78","name":"Data as JSON payload","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":920,"y":2240,"wires":[]},{"id":"21f21239.2c2bce","type":"ui_text","z":"8c9f8f17.13eb78","group":"6f8a5651.9e0318","order":0,"width":0,"height":0,"name":"Test:","label":"Test:","format":"{{msg.payload}}","layout":"row-spread","x":1130,"y":2480,"wires":[]},{"id":"a1504bd4.049f18","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.battery_charge","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":2280,"wires":[["3442fea.41d6702"]]},{"id":"4e4d02.d85ad3","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.battery_temperature","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":2320,"wires":[["5362d4fa.9026ac"]]},{"id":"641d6b8a.a25e34","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.battery_voltage","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":2360,"wires":[["bd21c5da.510bc8"]]},{"id":"49343e5b.85218","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.input_voltage","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":2400,"wires":[["22a47d9.d019982"]]},{"id":"3c698623.45215a","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.ups_status","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":2440,"wires":[["6a33c3ab.06088c"]]},{"id":"83b9ebee.451878","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.ups_test_result","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":2480,"wires":[["21f21239.2c2bce"]]},{"id":"282426fe.c5650a","type":"function","z":"8c9f8f17.13eb78","name":"","func":"msg.payload=Date(Date.now());\nreturn msg;","outputs":1,"noerr":0,"x":870,"y":2520,"wires":[["12142ef5.0928f1"]]},{"id":"50224b5b.8a4164","type":"function","z":"8c9f8f17.13eb78","name":"","func":"if (msg.payload.input_voltage<=100)\n{\n    msg.payload=\"Stromausfall: USV-Eingangsspannung unter 100V!\";\n    return msg;\n}","outputs":1,"noerr":0,"x":870,"y":2560,"wires":[["b4128198.758dd"]]},{"id":"b4128198.758dd","type":"pushbullet","z":"8c9f8f17.13eb78","config":"","pushtype":"note","title":"SmartHome","chan":"","name":"","x":1150,"y":2560,"wires":[]},{"id":"88e174da.1ab6d8","type":"inject","z":"8c9f8f17.13eb78","name":"Test Power failure","topic":"","payload":"60","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":490,"y":2560,"wires":[["b7ac5f17.07bbb"]]},{"id":"b7ac5f17.07bbb","type":"change","z":"8c9f8f17.13eb78","name":"","rules":[{"t":"set","p":"temp","pt":"flow","to":"payload","tot":"msg"},{"t":"delete","p":"payload","pt":"msg"},{"t":"set","p":"payload.input_voltage","pt":"msg","to":"temp","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":2560,"wires":[["50224b5b.8a4164"]]},{"id":"3442fea.41d6702","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Battery charge","group":"c8fbbc62.c288a","order":4,"width":0,"height":0,"gtype":"gage","title":"Battery charge:","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#ca3838","#e6e600","#00b500"],"seg1":"","seg2":"","x":1160,"y":2280,"wires":[]},{"id":"5362d4fa.9026ac","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Batterie-Temperature","group":"c8fbbc62.c288a","order":5,"width":0,"height":0,"gtype":"gage","title":"Batterie-Temperature:","label":"°C","format":"{{value}}","min":"20","max":"40","colors":["#00b500","#00b500","#ca3838"],"seg1":"","seg2":"","x":1180,"y":2320,"wires":[]},{"id":"bd21c5da.510bc8","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Batterie-Voltage","group":"c8fbbc62.c288a","order":6,"width":0,"height":0,"gtype":"gage","title":"Batterie-Voltage:","label":"V","format":"{{value}}","min":"11","max":"15","colors":["#ca3838","#00b500","#ca3838"],"seg1":"","seg2":"","x":1160,"y":2360,"wires":[]},{"id":"22a47d9.d019982","type":"ui_gauge","z":"8c9f8f17.13eb78","name":"Mains voltage","group":"c8fbbc62.c288a","order":7,"width":0,"height":0,"gtype":"gage","title":"Mains voltage:","label":"V","format":"{{value}}","min":"220","max":"240","colors":["#ca3838","#00b500","#ca3838"],"seg1":"","seg2":"","x":1160,"y":2400,"wires":[]},{"id":"6a33c3ab.06088c","type":"ui_text","z":"8c9f8f17.13eb78","group":"c8fbbc62.c288a","order":1,"width":0,"height":0,"name":"Status","label":"Status:","format":"{{msg.payload}}","layout":"row-spread","x":1130,"y":2440,"wires":[]},{"id":"12142ef5.0928f1","type":"ui_text","z":"8c9f8f17.13eb78","group":"c8fbbc62.c288a","order":2,"width":0,"height":0,"name":"Last Update","label":"Last Update:","format":"{{msg.payload}}","layout":"row-spread","x":1150,"y":2520,"wires":[]},{"id":"6f8a5651.9e0318","type":"ui_group","z":"","name":"USV","tab":"fe022c7.d9788d","disp":true,"width":"6","collapse":false},{"id":"c8fbbc62.c288a","type":"ui_group","z":"","name":"USV2","tab":"4719e8d9.2a46f8","disp":true,"width":"6","collapse":false},{"id":"fe022c7.d9788d","type":"ui_tab","z":"","name":"Einstellungen","icon":"dashboard"},{"id":"4719e8d9.2a46f8","type":"ui_tab","z":"","name":"Einstellungen","icon":"dashboard"}]

Weiterführende Informationen

https://wiki.ubuntuusers.de/USV/NUT/
https://flows.nodered.org/flow/cf9813fbca341607a73786c31df362c9
http://www.gtkdb.de/index_36_2203.html

https://www.biesalski.info/wordpress/synology-diskstation-als-netzwerk-usv-server-fuer-linux-oder-windows-rechner-verwenden/


Ich hoffe bei euch hat alles wie beschrieben funktioniert. Falls nicht oder ihr Fragen oder Anregungen habt lasst es mich in den Kommentaren bitte wissen. Ich trage dies dann ggf. in den Artikel nach.
Auch Ideen für neue Projekte sind immer gerne willkommen. 🙂

Fab

P.S. Viele dieser Projekte - besonders die Hardwareprojekte - kosten viel Zeit und Geld. Natürlich mache ich das weil ich Spaß daran habe, aber wenn Du es cool findest, dass ich die Infos dazu mit Euch teile, würde ich mich über eine kleine Spende an die Kaffeekasse freuen. 🙂

Buy Me a Coffee at ko-fi.com

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.