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.
Safety instructions
I know the following notes are always kind of annoying and seem unnecessary. Unfortunately, many people who knew "better" have lost eyes, fingers or other things due to carelessness or injured themselves. Data loss is almost negligible in comparison, but even these can be really annoying. Therefore, please take five minutes to read the safety instructions. Because even the coolest project is not worth injury or other trouble.
https://www.nerdiy.de/sicherheitshinweise/
Affiliate links/advertising links
The links to online shops listed here are so-called affiliate links. If you click on such an affiliate link and make a purchase via this link, Nerdiy.de will receive a commission from the relevant online shop or provider. The price does not change for you. If you make your purchases via these links, you support Nerdiy.de in being able to offer other useful projects in the future. 🙂
Requirements
Helpful articles:
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 – setup for nerdiys!
RaspberryPi – The first configuration!
RaspberryPi – Control the RaspberryPi via SSH
NodeRed – Installing NodeRed on the RaspberryPi
NodeRed - import and export node code
NodeRed – Pushbullet Nachrichten bei Ereignissen senden
NodeRed - Create a user interface with dashboard nodes
Required material:
In the following list you will find all the parts you need to implement this article.
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.
Log in to the RaspberryPi via SSH
To start, you must first log in to the Rasp Pi with Putty via SSH. How to do this is in the article RaspberryPi - Control the RaspberryPi via SSH described.

Update package management
The package management in Linux is a "central place" through which various software packages can be installed. In order for this to work reliably, the lists and sources of the package management should be updated before each installation of new packages.

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.
Import node code
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 - import and export node code 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 - Create a user interface with dashboard nodes.


[{"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-ADDRESS-YOUR-NAS* 1 monuser secret slave



sudo service nut-client restart

sudo upsc ups@*IP-ADDRESS-YOUR-NAS*

Import node code
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 - import and export node code 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 - Create a user interface with dashboard nodes.


[{"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"}]
Further information
https://wiki.ubuntuusers.de/USV/NUT/
https://flows.nodered.org/flow/cf9813fbca341607a73786c31df362c9
http://www.gtkdb.de/index_36_2203.html
Have fun with the project
I hope everything worked as described for you. If not or you have questions or suggestions please let me know in the comments. I will then add this to the article if necessary.
Ideas for new projects are always welcome. 🙂
PS Many of these projects - especially the hardware projects - cost a lot of time and money. Of course I do this because I enjoy it, but if you think it's cool that I share the information with you, I would be happy about a small donation to the coffee fund. 🙂