HowTo: Knooppunt Rood - UPS-status lezen

Eén van de zwakke punten van een SmartHome-systeem waar je je pas echt van bewust wordt als er iets misgaat, is ‘energie’. Helaas werken alle sensoren, actuatoren en de controlerende intelligentie daarachter niet op lucht en liefde. En zelfs als de energie die door het systeem wordt gebruikt niet erg hoog is en de besparingen over het algemeen hoger zijn dan de “gebruikte” energie, is de leveringsenergie nog steeds essentieel. Met andere woorden: geen elektriciteit -> geen SmartHome.

Maar dat delen is een luxeprobleem waar je mee zou kunnen leven. Wat ik veel erger vind, is de gedachte dat mijn Raspberry Pi of welke computer dan ook zo verstikt zou kunnen raken door een plotselinge stroomstoring dat hij daarna misschien niet meer opstart.
Als uw SmartHome-systeem (RaspberryPi, BeagleBone, Windows PC, etc..) wordt onderbroken op het moment dat het belangrijke (systeem)gegevens schrijft, is het mogelijk dat het niet meer goed opstart nadat de stroomvoorziening is hersteld. In extreme gevallen leidt dit tot pijnlijk gegevensverlies en vaak veel tijd. In extreme gevallen heeft u geen back-up van het systeem en moet u het gehele systeem inclusief alle systeemcomponenten opnieuw installeren en configureren.

Maar: in feite lijken andere mensen ook op dit probleem te zijn gestuit. Voor dit geval zijn ononderbroken stroomvoorzieningen (UPS's) uitgevonden. Deze apparaten worden aangesloten tussen het stopcontact en de consument (in dit geval je Raspberry Pi etc.) en monitoren vanaf dat moment continu de kwaliteit van je netspanning. Dit betekent dat er continu wordt gemonitord of de binnenkomende wisselspanning en de frequentie zich binnen het toegestane bereik bevinden. Als er sprake is van onder- of overspanning, of als er iets anders mis is met de voedingsspanning, schakelt de UPS binnen milliseconden de spanningsingang uit en schakelt deze over naar een interne back-upbatterij. Deze neemt dan de voeding van de aangesloten verbruikers over totdat de bufferbatterij leeg is.

UPS'en zijn er nu in allerlei vormen. De kleinste zien eruit als wat onhandige stekkerdozen. Anderen – of hun batterijen – kunnen een hele kamer vullen.

Voor de normale SmartHome-gebruiker zijn de kleinere versies zeker voldoende. Zoals, bijvoorbeeld …

Hoe u uiteindelijk uw eigen UPS in NodeRed integreert en op veranderingen reageert, leest u in dit artikel.


Veiligheidsinstructies

Ik weet dat de volgende opmerkingen altijd een beetje vervelend zijn en onnodig lijken. Helaas hebben veel mensen die "beter" wisten door onvoorzichtigheid ogen, vingers of andere dingen verloren of zichzelf verwond. Gegevensverlies is in vergelijking bijna te verwaarlozen, maar zelfs dit kan erg vervelend zijn. Neem daarom vijf minuten de tijd om de veiligheidsinstructies te lezen. Omdat zelfs het coolste project geen blessure of andere problemen waard is.
https://www.nerdiy.de/sicherheitshinweise/

Affiliate links / reclame links

De hier vermelde links naar online winkels zijn zogenaamde affiliate-links. Als u op zo'n affiliate-link klikt en via deze link een aankoop doet, ontvangt Nerdiy.de een commissie van de betreffende onlineshop of aanbieder. De prijs verandert voor jou niet. Als u via deze links uw aankopen doet, steunt u Nerdiy.de om in de toekomst andere nuttige projecten aan te kunnen bieden. 🙂 


Eisen

Handige artikelen:
Om ervoor te zorgen dat u uw UPS via uw RaspberryPi en NodeRed kunt besturen/configureren, moet deze uiteraard zo worden voorbereid dat NodeRed erop draait en u er via SSH toegang toe heeft.

RaspberryPi – setup voor nerds!
RaspberryPi – De eerste configuratie!
RaspberryPi – Bedien de RaspberryPi via SSH
NodeRed – NodeRed installeren op de RaspberryPi
NodeRed - importeer en exporteer knooppuntcode
NodeRed – Stuur Pushbullet-berichten over evenementen
NodeRed - Maak een gebruikersinterface met dashboardknooppunten

Benodigd materiaal:

In de volgende lijst vindt u alle onderdelen die u nodig heeft om dit artikel te implementeren.


Een UPS lezen die is aangesloten op de RaspberryPi

Het nadeel van een ononderbroken stroomvoorziening is dat de Raspberry Pi niets merkt zodra er iets mis is met de stroomvoorziening. Eigenlijk is dat wat je wilt. Aan de andere kant kan de RaspberryPi niet op deze verandering reageren.

Want ook al is de batterij van een UPS behoorlijk groot vergeleken met het verbruik van een Raspberry Pi, de batterijcapaciteit is eindig. Daarom moet de RaspberryPi bijvoorbeeld automatisch uitschakelen voordat de batterij helemaal leeg is. Dit minimaliseert het risico op gegevensverlies en maakt een gecontroleerde reactie op de stroomstoring mogelijk.

Om ervoor te zorgen dat de RasperryPi op de hoogte wordt gehouden van wijzigingen van de UPS, moet deze via een USB- of seriële verbinding met de RasperryPi zijn verbonden.

Voor de Raspberry Pi bestaat het programma “Apcupsd”, waarmee u de status van uw UPS kunt uitlezen. Deze status kun je vervolgens ook gebruiken om er via NodeRed op te reageren.

Zo zou het bijvoorbeeld mogelijk zijn om bepaalde componenten uit te schakelen of andere Raspberry Pis uit te schakelen - zolang deze niet al uitgevallen zijn door de stroomstoring.

Voordat u echter de status van uw UPS in NodeRed kunt aflezen, moet eerst “apcupsd” geïnstalleerd worden.


Log in op de RaspberryPi via SSH

Om te beginnen moet je eerst inloggen op de Rasp Pi met Putty via SSH. Hoe je dit doet staat in het artikel RaspberryPi - Bedien de RaspberryPi via SSH beschreven.

Na het invoeren van uw gebruikersnaam en wachtwoord kunt u de eerste opdrachten invoeren.

Pakketbeheer updaten

Het pakketbeheer in Linux is een "centrale plek" van waaruit verschillende softwarepakketten kunnen worden geïnstalleerd. Om dit betrouwbaar te laten werken, moeten de lijsten en bronnen van het pakketbeheer worden bijgewerkt voor elke installatie van nieuwe pakketten.

Om de update van het pakketbeheer te starten, moet u de volgende opdracht invoeren.
sudo apt-get update && sudo apt-get upgrade
Afhankelijk van hoe lang geleden uw laatste update van het pakketbeheer was, kan dit proces nu even duren. De lijsten die naar de afzonderlijke pakketbronnen verwijzen, worden eerst bijgewerkt.
Daarna worden de pakketten zelf bijgewerkt. Aangezien extra geheugen bezet is, wordt u opnieuw om uw toestemming gevraagd. Je moet dit bevestigen met een "J" en "Enter".
Zodra de update is voltooid, ziet u een korte samenvatting van de duur en omvang van de update.

Installeer "apcupsd" op de Raspberry Pi

Om uw RaspberryPi te laten communiceren met de aangesloten UPS, moet u eerst een aantal pakketten installeren.

Een programma dat rechtstreeks kan communiceren met uw UPS die via USB is aangesloten, is het programma “apcupsd”, dat u installeert met het volgende commando.
sudo apt-get install apcupsd
Als u vraagt of het programma extra geheugen gebruikt, bevestigt u dit met “Y”.
De installatie duurt ongeveer twee minuten.

Apcupsd configureren

Voordat je “apcupsd” kunt gebruiken, moet het uiteraard eerst geconfigureerd worden. Om dit te doen, moeten enkele configuratiebestanden worden bewerkt.

U opent het eerste configuratiebestand met de volgende opdracht.
sudo nano /etc/apcupsd/apcupsd.conf
In het geopende configuratiebestand moet u eerst de pijltjestoetsen gebruiken…
…navigeer naar de weergegeven regel. Deze bepaalt met welk type kabel de UPS op je Raspberry Pi is aangesloten. Uw UPS is hoogstwaarschijnlijk via de USB-poort op uw Raspberry Pi aangesloten. Daarom stel je hier ook “UPSCABLE usb” in.
UPSKABEL usb
Omdat je een USB-kabel hebt aangesloten, moet je uiteraard ook het UPSTYPE op usb zetten.
UPSTYPE usb
Om de verbinding met de UPS via USB te laten werken, moet u nu de parameter “DEVICE” bewerken. Hieraan mag geen waarde worden toegekend. Om dit te doen, verwijdert u het getoonde onderdeel “/dev/ttsyS0” naast “DEVICE”.
Dit zou er dan zo uit moeten zien.
Nu kunt u een paar instellingen maken over hoe apcupsd zich moet gedragen in het geval van een stroomstoring. De parameter “BATTERYLEVEL” kan bijvoorbeeld worden gebruikt om de RaspberryPi zo in te stellen dat hij wordt uitgeschakeld wanneer de UPS nog een resterende lading van 5% heeft.
De parameter “MINUTES” geeft de resterende looptijd in minuten aan, waarna de RaspberryPi moet worden uitgeschakeld.
Met de parameter “NETSERVER” kunt u een netwerkserver activeren die de UPS-informatie via het netwerk beschikbaar stelt. Dit betekent dat bij een stroomstoring ook andere netwerkdeelnemers hierop kunnen reageren en zich bijvoorbeeld kunnen afsluiten. Om de netwerkserver te activeren moet u de parameter instellen op “NETSERVER on”.
Met de parameter “NISIP” kunt u instellen naar welk IP-adres de server “luistert”. Dit is alleen nodig als u meer dan één netwerkinterface op het betreffende systeem heeft. Op een Raspberry Pi kun je hem bijvoorbeeld zo instellen dat de server alleen vragen beantwoordt die hij via de WLAN-interface ontvangt en niet via de LAN-interface. In de meeste gevallen kunt u deze parameter echter instellen op “NISIP 0.0.0.0”. Dit betekent dat alle verzoeken worden beantwoord, ongeacht de netwerkinterface.
De parameter “NISPORT” specificeert de poort waaronder de informatie van de server toegankelijk is. U dient dit ongewijzigd te laten op de waarde “3551”.
Vervolgens slaat u deze configuratie op door op “CTRL-X” en “J” te drukken…
…en “Invoeren”.
Nu moet u apcupsd vertellen dat er een configuratie bestaat. Open hiervoor een ander configuratiebestand met de volgende opdracht.
sudo nano /etc/default/apcupsd
Om dit te doen, stelt u de parameter “ISCONFIGURED” in op…
…"Ja".
U kunt deze configuratie vervolgens opnieuw opslaan door op “CTRL-X” en “J” te drukken…
…en “Invoeren”.
De apcupsd-service kan vervolgens worden gestart met het volgende commando.
sudo /etc/init.d/apcupsd start
Als het programma succesvol is gestart, zou het geheel er zo uit moeten zien.
De huidige status van de UPS kan vervolgens worden weergegeven met behulp van het commando “apcaccess status”. Als er geen verbinding met de UPS tot stand kan worden gebracht, ziet het antwoord eruit zoals weergegeven.
apcaccess-status
Als de verbinding met de UPS tot stand is gebracht en de informatie kan worden uitgelezen, wordt vervolgens de getoonde informatie weergegeven.
Als u “apcupsd” opnieuw moet opstarten, voert u gewoon de volgende opdracht in.
sudo /etc/init.d/apcupsd herstart

U heeft nu de mogelijkheid om de UPS-informatie op de RaspberryPi weer te geven. Om deze informatie te gebruiken voor uw SmartHome kunt u de volgende NodeCode gebruiken.


Knooppuntcode importeren

Met de volgende NodeCode kunt u enkele details van de huidige status van uw UPS weergeven. Hierdoor kun je individueel reageren op bepaalde kenmerken.

Zo zou het bijvoorbeeld mogelijk zijn om via een pushbullet bericht op de hoogte te worden gebracht van een stroomstoring of om de belangrijkste gegevens op het dashboard weer te geven zoals in onderstaand voorbeeld. Om ervoor te zorgen dat bij een stroomstoring pushbullet-berichten kunnen worden verzonden, moet u er uiteraard voor zorgen dat ook uw gehele netwerkinfrastructuur door de UPS wordt beschermd. Als de stroomstoring zich over een heel groot gebied afspeelt, helpt dit uiteraard niet meer. Bij een stroomstoring is de communicatie via internet dus uiteraard niet gegarandeerd.

Hoe u uw NodeCode in uw NodeRed-configuratie importeert, staat in het artikel NodeRed - importeer en exporteer knooppuntcode beschreven. Na het importeren moet u mogelijk ook het Pushbullet-knooppunt configureren. Informatie hierover vindt u in het artikel NodeRed – Stuur Pushbullet-berichten over evenementen. Dashboardknooppunten worden gebruikt om UPS-gegevens weer te geven. Informatie hierover vind je in het artikel NodeRed - Maak een gebruikersinterface met dashboardknooppunten.

Weergave van de UPS-statusindicator in het dashboard.
Overzicht van de NodeCode-configuratie in de NodeRed-configuratie-interface.
[{"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"}]

Een UPS lezen die is aangesloten op een Synology NAS

Als u een Synology NAS of een NAS in het algemeen heeft, is het probleem van gegevensverlies nog belangrijker. De familiefoto's (of een deel ervan) mogen immers bij een stroomstoring niet in het datanirvana verdwijnen. Daarom bieden veel fabrikanten de functie aan om je eigen NAS te beschermen tegen stroomstoringen met een UPS. De UPS wordt vervolgens via USB met de NAS verbonden om informatie te kunnen geven over een statuswijziging. Mocht er een stroomstoring optreden, dan detecteert de NAS dit en schakelt automatisch en gecontroleerd uit. Praktisch en goed voor de data opgeslagen op de NAS. Tegelijkertijd is het onpraktisch dat de andere netwerkdeelnemers niets van de situatie te weten komen (behalve dat de stroom is uitgevallen).

De NAS van Synology biedt daar in ieder geval uitkomst voor: via een geïntegreerde netwerk-UPS-server kunnen ook andere netwerkdeelnemers de status registreren van de op de NAS aangesloten UPS. Hierdoor kun je uiteindelijk de status op de RaspberryPi en dus ook in NodeRed vastleggen.

Om de UPS-netwerkserver te laten werken, moet deze eerst worden ingesteld. Om dit te doen, gaat u naar het Configuratiescherm van de DiskStationManager (DSM)-interface...
... en naar de categorie “Hardware & Energie”. Daar klikt u op het tabblad “UPS”.
De aangesloten UPS zou daar al geconfigureerd moeten zijn. In dit geval wordt de NAS automatisch uitgeschakeld na 3 minuten nadat er een stroomstoring is opgetreden. Om de netwerk-UPS-server te activeren, vinkt u “Activeer netwerk-UPS-server” aan en klikt u op de knop “Goedgekeurde DiskStation-apparaten”.
In het venster dat nu wordt geopend, kunt u verschillende IP-adressen invoeren van apparaten in uw netwerk die toegang hebben tot de informatie van de netwerk-UPS-server. Dit zogenaamde “whitelist”-proces zorgt ervoor dat alleen geautoriseerde netwerkdeelnemers deze informatie kunnen ontvangen. In dit veld vult u het IP-adres in van uw RaspberryPi waarvan u de UPS-status via NodeRed wilt uitlezen, zoals weergegeven. Hoe u het IP-adres van de apparaten in uw netwerk kunt achterhalen, vindt u in het artikel Toon/ontdek het IP-adres van de apparaten in het netwerk beschreven. Nadat u het IP-adres heeft ingevoerd, klikt u op “OK”…
...en klik in het volgende venster op “Toepassen”.

Installeer de NetworkUpsTools(NUT) op de RaspberryPi om UPS-gegevens op te halen van een UPS-server

Nu de server is ingesteld om de UPS-informatie te verstrekken, moet de clientzijde (dus uw RaspberryPi) uiteraard ook dienovereenkomstig worden geconfigureerd. Uiteraard moet deze ook contact kunnen maken met de netwerk-UPS-server op uw NAS. Een programma dat dit mogelijk maakt is de “NetworkUpsTool”, die als volgt kan worden geïnstalleerd.

Om de applicatie “NUT” te installeren, moet u de volgende opdracht invoeren.
sudo aptitude install nut

Een mededeling: Om “NUT” te installeren heeft u de “aptitude” extensie nodig voor het “APT” pakketbeheer. Dit kan – als het nog niet beschikbaar is – worden geïnstalleerd met de volgende opdracht.

sudo apt-get install aptitude

Mocht u tijdens de installatie vragen hebben, bevestig dan met “y” en “Enter”. Meestal (zoals in dit voorbeeld) hebben deze vragen betrekking op de vraag of er extra opslagruimte nodig is voor de te installeren tools en of er ook aanvullende (vereiste) pakketten kunnen worden geïnstalleerd.

Na installatie moet “NUT” nog worden geconfigureerd. Open hiervoor het configuratiebestand met de volgende opdracht.
sudo nano /etc/nut/nut.conf
Gebruik in het nu geopende configuratiebestand de pijltjestoetsen om naar de getoonde regel te navigeren.
Eenmaal daar wijzigt u de regel van “Mode=none” in “Mode=netclient”. Dit vertelt “NUT” om te fungeren als netwerkclient voor een UPS-netwerkserver.
mode=netclient
U slaat deze configuratie op door op “CTRL-X” en “J” te drukken…
…en klik ten slotte op “Enter”.
Nu moet u uiteraard nog het adres configureren waarop de netwerk-UPS-server bereikbaar is. Open hiervoor een ander configuratiebestand met de volgende opdracht.
sudo nano /etc/nut/upsmon.conf
Navigeer vervolgens met de pijltjestoetsen totdat u bij de opgegeven regel aankomt. De regel “MONITOR ups@*IP-ADDRESS-EURER-NAS* 1 monuser secret slave” moet daar worden ingevoegd. Uiteraard moet *IP-ADDRESS-EURER-NAS* worden vervangen door het IP-adres van uw netwerk-UPS-server, d.w.z. uw NAS. Dit is de enige manier waarop NUT weet waar de UPS-informatie vandaan moet komen.
MONITOR ups@*IP-ADRES-UW-NAS* 1 monuser geheime slaaf
U kunt deze configuratie vervolgens opnieuw opslaan door op “CTRL-X” en “J” te drukken…
…en klik ten slotte op “Enter”.
Om de wijzigingen in het configuratiebestand toe te passen, hoeft u alleen maar de NUT-client opnieuw op te starten. Dit kan gedaan worden met het commando “sudo service nut-client restart”.
sudo service nut-client opnieuw opstarten
Met behulp van het commando “sudo upsc ups@*IP-ADDRESS-EURER-NAS*” kunt u nu de huidige informatie over uw UPS ophalen van de UPS-netwerkserver. Uiteraard moet *IP-ADDRESS-EURER-NAS* worden vervangen door het IP-adres van uw netwerk-UPS-server, d.w.z. uw NAS.
sudo upsc ups@*IP-ADRES-UW-NAS*
De informatie wordt vervolgens volgens het opgegeven patroon aan u weergegeven. Zo worden bijvoorbeeld de laadtoestand, het model en verschillende spanningen weergegeven.

Knooppuntcode importeren

Met de volgende NodeCode kunt u enkele details weergeven van de huidige status van uw UPS die is aangesloten op uw Synology NAS. Hierdoor kun je individueel reageren op bepaalde kenmerken.

Zo zou het bijvoorbeeld mogelijk zijn om via een pushbullet bericht op de hoogte te worden gebracht van een stroomstoring of om de belangrijkste gegevens op het dashboard weer te geven zoals in onderstaand voorbeeld. Om ervoor te zorgen dat bij een stroomstoring pushbullet-berichten kunnen worden verzonden, moet u er uiteraard voor zorgen dat ook uw gehele netwerkinfrastructuur door de UPS wordt beschermd. Als de stroomstoring zich over een heel groot gebied afspeelt, helpt dit uiteraard niet meer. Bij een stroomstoring is de communicatie via internet dus uiteraard niet gegarandeerd.

Hoe u uw NodeCode in uw NodeRed-configuratie importeert, staat in het artikel NodeRed - importeer en exporteer knooppuntcode beschreven. Na het importeren moet u mogelijk ook het Pushbullet-knooppunt configureren. Informatie hierover vindt u in het artikel NodeRed – Stuur Pushbullet-berichten over evenementen. Dashboardknooppunten worden gebruikt om UPS-gegevens weer te geven. Informatie hierover vind je in het artikel NodeRed - Maak een gebruikersinterface met dashboardknooppunten.

Weergave van de UPS-statusindicator in het dashboard.
Overzicht van de NodeCode-configuratie in de NodeRed-configuratie-interface.
[{"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"}]

Meer informatie

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


Veel plezier met het project

Ik hoop dat alles werkte zoals beschreven. Zo niet, of als je vragen of suggesties hebt, laat het me weten in de commentaren. Ik zal dit dan zo nodig aan het artikel toevoegen.
Ideeën voor nieuwe projecten zijn altijd welkom. 🙂

PS Veel van deze projecten - vooral de hardwareprojecten - kosten veel tijd en geld. Natuurlijk doe ik dit omdat ik het leuk vind, maar als je het cool vindt dat ik de informatie met je deel, dan zou ik blij zijn met een kleine donatie aan het koffiefonds. 🙂

Koop Me a Coffee op ko-fi.com       

Kommentar hinterlassen

Het e-mailadres wordt niet gepubliceerd. Erforderliche Felder sind mit * markiert

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.