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.

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.

sudo apt-get update && sudo apt-get upgrade



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

sudo apt-get install apcupsd


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.

sudo nano /etc/apcupsd/apcupsd.conf


UPSCABLE usb

UPSTYPE usb










sudo nano /etc/default/apcupsd





sudo /etc/init.d/apcupsd start


apcaccess status


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.


[{"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 = {} Array.prototype.map.call( msg.payload.trim().split("\n"), function(line) { if ( line.trim() === '' ) return let part = line.split(':') // Some values contain ':', when they do, we have to rejoin if ( part.length > 2 ) { let newPart = [] newPart.push( part.shift() ) newPart.push( part.join(':') ) part = newPart } let payloadName = part[0].toLowerCase().trim() let payloadValue = part[1].trim() ans[payloadName] = payloadValue return } ) msg.payload = ans return 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()); return 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) { msg.payload="Power failure: UPS-Mains-voltage below 100V!"; return msg; }","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.





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.

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.

sudo nano /etc/nut/nut.conf


Mode=netclient



sudo nano /etc/nut/upsmon.conf

MONITOR ups@*IP-ADRESSE-EURER-NAS* 1 monuser secret slave



sudo service nut-client restart

sudo upsc ups@*IP-ADRESSE-EURER-NAS*

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.


[{"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 = {} Array.prototype.map.call( msg.payload.trim().split("\n"), function(line) { if ( line.trim() === '' ) return let part = line.split(':') // Some values contain ':', when they do, we have to rejoin if ( part.length > 2 ) { let newPart = [] newPart.push( part.shift() ) newPart.push( part.join(':') ) part = newPart } let payloadName = part[0].toLowerCase().trim() payloadName = part[0].replace(/\./g, "_") let payloadValue = part[1].trim() convertData[payloadName] = payloadValue return } ) msg.payload = convertData return 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()); return 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) { msg.payload="Stromausfall: USV-Eingangsspannung unter 100V!"; return msg; }","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
Viel Spaß mit dem Projekt
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. 🙂
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. 🙂