Nooit meer last van een stroomstoring: de X728 UPS

Gepubliceerd door Robot One op

Technologie bij kaarslicht

Een vakantiebestendig smarthome (deel 3)

Update 29 januari 2024

In eerdere artikelen lieten we al uitgebreid zien hoe een Domoticz systeem op een Raspberry Pi stabieler is te maken, door het aanpassen van de voeding, het inbouwen in een professionele kast en het opstarten van SSD (of harddisk) in plaats van SD-kaart. Nu gaan we voor de ‘laptop-optie’: laat de RPi bij een netstroom-onderbreking gewoon verder draaien op accu’s. En laad die accu’s weer op als de stroom terug is.

Op zich is het geen ‘rocket-science’ om een Raspberry Pi op accu’s of batterijen te laten draaien. Sommigen gebruiken daar zelfs een simpele power bank voor, maar die levert helaas net te weinig spanning of vermogen om een RPi 4B met SSD en randapparatuur betrouwbaar te laten draaien. Voor de duidelijkheid: een RPi 4B heeft een voeding nodig van 5,1V/3A. Een doorsnee powerbank levert 5V/2,4A.

Er zijn diverse boards beschikbaar die de batterijspanning netjes kunnen vertalen naar de 5,1 volt (of ietsje meer) die de RPi nodig heeft. Ik heb gekozen voor de X728 UPS (UPS staat voor Uninterruptable Power Supply) omdat deze naadloos samenwerkt met de hardware die ik al heb (zie aflevering 2) en zelfs tot 8A ineens kan leveren, mocht dat nodig zijn.

De X728 heeft bovendien een ingebouwde RTC (Real Time Clock) zodat gebeurtenissen die tijdsafhankelijk zijn binnen Domoticz gewoon zullen doorgaan, zelfs zonder internetverbinding om de juiste tijd op te halen.

X728 UPS: altijd stroom

Stroomuitval hoeft nu niet meer te betekenen dat je Raspberry Pi met Domoticz crasht, wat onvoorspelbare gevolgen zou kunnen hebben. Met dit X728 UPS board draait je RPi rustig verder op oplaadbare accu’s.

Koop op Amazon

Betrouwbare 18650 batterijen

Onmisbaar bij de X728 zijn 2 betrouwbare accu’s. Er zijn veel goedkope merken die een enorme capaciteit (bijvoorbeeld 9900mAh!) claimen, maar die belofte niet waarmaken. Ga liever voor merkbatterijen. Ik heb deze van Samsung getest (zie hieronder bij ‘Proef op de som’)

Koop op Bol.com

Hardware installeren

De X728 aansluiten op de RPi is een fluitje van een cent. Als je eerst de X735 hebt geïnstalleerd, verwijder deze dan eerst. Plaats de afstandsbussen die zijn meegeleverd met de X728. Die bevat ook een extra verhoogde GPIO-connector. Een kwestie van inpluggen en de schroefjes bovenop de afstandsbussen opnieuw vastdraaien.

LET OP:
Er zijn vanaf februari 2021 2 versies van de X728 in omloop. Afhankelijk van de versie moet je 2 of 3 jumpers installeren op de headers naast de usb-c aansluiting aan de bovenkant van de print.

Links X728 versie 1.2, rechts versie 1.3

Versie 1.2 heeft 3 jumpers die je het beste allemaal kunt aansluiten. De meest linkse jumper naast de usb-c aansluiting is voor automatisch afsluiten (ASD) als de batterijspanning te laag wordt. Die jumper mag je pas 3 seconden na het plaatsen van de batterijen aanbrengen. De middelste is voor het automatisch opstarten zodra de stroom (AON) wordt aangesloten en de rechter is voor detectie dat de netstroom uitvalt.

Bij versie 1.3 is de ASD-jumper vervallen en is het onderspannings-circuit vervangen door een overspanningsbeveiliging. Blijkbaar was het onmogelijk om beide functies in het nieuwe ontwerp te combineren. Wil je de X728 toch laten afsluiten bij onderspanning, dan kan dat door de spanning via de I2C aansluiting uit te lezen; als deze lager is dan 3.0V, maak dan de GPIO-uitgang op pin 13 dan hoog en de X728 zal afsluiten.

Improviseren

Maar nu het slechte nieuws: de X728 is te groot om in de metalen kast te passen uit aflevering 2 van de zomerproof-serie. Dat heeft enerzijds te maken met de omvang van de printplaat: hij is net zo groot als de RPi en moet dus in vergelijking met het eerder geplaatste X735 power management board een stukje hoger worden gezet. Ook nemen de twee batterijen bovenop vrij veel extra plaats in.

Je zult dus moeten improviseren: het deksel van de behuizing af laten, maar ook twee uitsparingen aan de zijkant van de kast uitzagen, omdat anders de jumper-pennen en de connector voor de aan/uit schakelaar in de weg zitten.

Ik heb gekozen voor een meer radicale oplossing: de onderste afstandsbussen (die langer zijn dan nodig om de SSD van de bodem af te houden) verwijderen. Je kunt ze ook vervangen door kortere types, waardoor het gehele pakket iets kan zakken in de kast.

Het is niet de meest briljante oplossing; dit zorgt er namelijk voor dat de aansluitingen van de RPi niet meer voor de uitsparingen in de kast vallen. Voor zover het gaat om de zij-aansluitingen van de RPi, is dat waarschijnlijk geen probleem, tenzij je een monitor of audio wilt aansluiten. Dat de driftig knipperende lampjes aan de voorkant niet meer precies achter de gaatjes zitten, is zelfs een voordeel, vind ik persoonlijk. Het maakt mijn huisgenoten in ieder geval minder nerveus. De aansluitingen aan de achterkant (USB-poorten en netwerk) zijn echter toch echt noodzakelijk.

Een Dremel-kloon met slijpschijfje brengt uitkomst. Daarmee heb ik wat extra gaten gezaagd aan de achterzijde, zodat de aansluitingen weer bereikbaar zijn. Ook de schroefbusjes voor de ventilator aan de binnenzijde van het deksel heb ik weggeslepen, zodat alles weer precies past.

Een extra ingreep die nodig is als je de kast wilt blijven gebruiken, is dat je de draden van de aan/uit schakelaar een centimeter of 2 zult moeten verlengen, want de aansluiting daarvoor zit aan de ‘verkeerde’ kant van de X728 printplaat, waardoor deze draden net te kort zijn. Met een een soldeerbout, wat draad en krimpkous om de verbindingen te isoleren, is dat wel te regelen.

Stroomstring heeft geen vat op je smarthome met deze onverstoorbare toren: een X825, een RPi 4B en een X728.

Software installeren

De X728 is uit te lezen via software op de Raspberry Pi en dus ook door Domoticz. Daarvoor moeten enkele stappen worden doorlopen.

Stap 1:
Allereerst moet I2C op de RPi worden geactiveerd, als dat nog niet het geval is. I2C is een serieel protocol dat werkt via de GPIO-aansluitingen van de RPi. Op het configuratieprogramma in Putty met:

sudo raspi-config

Stap 2:
Kies onder Interface options voor I2C en bevestig dat deze moet worden ingeschakeld. Sluit raspi-config en reboot de RPi:

sudo reboot

Stap 3:
Installeer nu de noodzakelijke software om de I2C bus te kunnen lezen. Bij mij stond die er al op, maar voor de zekerheid:

sudo apt-get install python-smbus
sudo apt-get install i2c-tools

Stap 4:
Download en installeer daarna de X728 besturingssoftware en reboot opnieuw:

git clone https://github.com/geekworm-com/x728.git
cd x728
sudo bash x728.sh
printf "%s\n" "alias x728off='sudo x728softsd.sh'" >> ~/.bashrc
sudo reboot

Als je RPi weer online is, bevat de thuismap 2 pythonbestanden waaraan je kunt zien hoe de X728 wordt uitgelezen. Die tonen de waarden in de Putty console, maar wij willen ze natuurlijk kunnen gebruiken in Domoticz.

Stap 5:
Wat we als eerste nodig hebben is het signaal: power okay of power loss (stroom oké of uitgevallen). Dat signaal staat op GPIO6 (een van de pinnen van de Raspberry Pi). Om dit te kunnen uitlezen, moet je als eerste GPIO6 softwarematig exporteren en dan instellen op ‘in’ ofwel input (we willen van die pin lezen, niet ernaar schrijven):

echo 6 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio6/direction

Stap 6:
Dit moet iedere keer als Domoticz start opnieuw worden ingesteld en kan dan ook het beste worden opgenomen in het /etc/rc.local bestand (zeg maar de autoexec.bat van Raspbian). Open dit in de editor:

sudo nano /etc/rc.local

Stap 7:
Je zult nu zien dat de installatieprocedure van de X728 al enkele regels aan /etc/rc.local heeft toegevoegd. Maak hiervan:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s
/etc/x728pwr.sh
echo 6 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio6/direction
sudo service domoticz restart
exit 0

De opdrachtregel sudo service domoticz restart heb ik niet voor niets hieraan toegevoegd. Domoticz heeft namelijk wel eens de neiging om niet te reageren op het ‘start’ commando na het opstarten van de RPi. Dit lijkt een random verschijnsel. Het commando ‘restart’ werkt vreemd genoeg wel altijd.

Stap 8:
Sluit de nano editor tot slot af met ^O (opslaan) en ^X (afsluiten).

Stap 9:
Maak nu de hardware aan via Instellingen > Hardware. Vul de velden in zoals op de foto hieronder. Zorg ervoor dat het vinkje aan straat bij de optie Auto configure devices.

Als je Generic sysfs GPIO al eerder hebt gemaakt, klik je hierop en op Aanpassen, dan wordt automatisch een bijpassend apparaat gemaakt voor GPIO6. Zet hem op gebruikt met het groene pijltje en geef er een begrijpelijke naam aan: Stroomuitval of zoiets.

Standaard, als alles normaal is, is de status van deze schakelaar ‘Dicht’. Trek je de stekker uit de X728, dan wordt de status ‘Open’. Dat klinkt op zich logisch, ook al lijkt wat tegenstrijdig, aangezien de status van GPIO6 volgens de documentatie bij de X728 ‘hoog’ is als de netstroom uitvalt en laag als de toestand normaal is.

Stap 10:
We maken nu een eenvoudig script om Domoticz een notificatie te laten sturen als de stroom uitvalt. Als het daarbij gaat om een storing die ervoor zorgt dat ook je netwerk uitvalt, zal die notificatie je helaas niet via internet kunnen bereiken. Een alternatief is het bijkoppelen van een SIM800L module die jou een SMS kan sturen. Daar komen we in een later project op terug. Als de modem en/of de router online blijft, bijvoorbeeld doordat er alleen een stop uit springt op de groep waar je RPi aan hangt, of als iemand bijvoorbeeld de stekker van je RPi eruit trekt, dan lukt het versturen van een notificatie echter wel.

Zo’n notificatie instellen kan ook via het ‘Klokje’ van het apparaat Stroomuitval (te vinden onder het tabblad Schakelaars), zie de schermafbeelding hieronder.

Wat eleganter is het om het onderstaande dzvents script te gebruiken (Intellingen > Meer opties > Gebeurtenissen > +):

-- Script voor X728 
-- 


return {
    on = {
        devices = {
            'Stroomuitval' -- als stroomuitval gedetecteerd (via GPIO6)
        }
    },

    execute = function(domoticz, device) 
        if device.state == 'Open' then
            bericht1 = 'WAARSCHUWING: STROOMSTORING!' 
            bericht2 = 'Overschakelen op accuspanning'
        else 
            bericht1 = 'Netstroom werkt weer normaal'
            bericht2 = 'Batterij wordt opgeladen'
        end
        domoticz.notify(bericht1, bericht2, PRIORITY_HIGH, nil, nil, domoticz.NSS_PUSHOVER) -- als je een ander notificatiesysteem gebruikt, vervang dan NSS_PUSHOVER in deze regel
    end
}

Stap 11:
Ook de laadtoestand van de batterijen is uit te lezen in Domoticz. Als eerste moeten we hiervoor twee ‘virtuele’ apparaten aanmaken (Instellingen > Hardware > Maak virtuele sensoren): noem het eerste Batterijspanning, van het type Spanning en het tweede Batterijlading, van het type Percentage. Die laatste is vooral belangrijk om in de gaten te houden hoe vol of leeg de batterijen zijn. Noteer de idx-nummers van beide apparaten. Bij mij respectievelijk 561 en 562.

Stap 12:
Vul je eigen idx-nummers in, in het onderstaande Python script:

#!/usr/bin/env python
import struct
import smbus
import sys
import time
import requests


def readVoltage(bus):

     address = 0x36
     read = bus.read_word_data(address, 2)
     swapped = struct.unpack("<H", struct.pack(">H", read))[0]
     voltage = swapped * 1.25 /1000/16
     return voltage


def readCapacity(bus):

     address = 0x36
     read = bus.read_word_data(address, 4)
     swapped = struct.unpack("<H", struct.pack(">H", read))[0]
     capacity = swapped/256
     if (capacity > 100):
          capacity = 100
     return capacity


bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)

voltage = "%.2f" % readVoltage(bus)
battery = "%i" % readCapacity(bus)
url = "http://127.0.0.1:8088/json.htm?type=command&param=udevice&idx=561&nvalue=0&svalue=" + voltage
r = requests.get(url)
print(r) # voor debuggen: resultaat moet 200 zijn = OK

url = "http://127.0.0.1:8088/json.htm?type=command&param=udevice&idx=562&nvalue=0&svalue=" + battery
r = requests.get(url)
print(r) # voor debuggen: resultaat moet 200 zijn = OK

Pas het script aan en kopieer het naar het klembord.

Stap 13:
Open de editor:

sudo nano /home/pi/domoticz/scripts/python/getx728data.py

Plak het script hierin, sla het op met ^O en sluit af met ^X.

Stap 14:
Maak vervolgens het script uitvoerbaar met:

chmod +x /home/pi/domoticz/scripts/python/getx728data.py

N.b. het script wordt alleen lokaal uitgevoerd, op adres 127.0.0.1 (ofwel localhost), zodat er geen internet wordt gebruikt. Om te voorkomen dat je een 401 (Unauthorized) melding terugkrijgt, moet 127.0.0.1 wel als lokaal adres zijn ingevulde in het Domoticz instellingen (Instellingen > Instellingen > Lokale netwerken, zie het screenshot hieronder. Als je dat niet eerder hebt gedaan, doe het dan nu en klik op Bewaar Instellingen.

Stap 15:
Test het script door het handmatig uit te voeren met:

sudo python /home/pi/domoticz/scripts/python/getx728data.py

Controleer in Domoticz de waarden van de apparaten Batterijspanning en Batterijlading. Deze moeten zijn bijgewerkt. Is dat het geval, dan krijg je de terugmelding (te zien in de console): 200, ofwel de http code voor OK. Dan werkt het script zoals het hoort.

Stap 16:
Dit script moet eens in de minuut automatisch worden uitgevoerd om de waarden in Domoticz bij te werken. Dat kan niet rechtstreeks binnen het Domoticz eventsysteem (omdat het daarbinnen niet mogelijk is om de noodzakelijke Python libraries te laden). We moeten het dus buiten Domoticz om uitvoeren en dat doen we door middel van een Crontab regel:

crontab -e

Hiermee open je een lijst met periodiek uit te voeren commando’s.

Stap 17:
Zet in deze lijst onderaan de volgende nieuwe regel (echt op 1 regel, al wordt deze hieronder afgebroken):

*/1 * * * * sudo python /home/pi/domoticz/scripts/python/getx728data.py >/dev/null 2>&1 &

Wat hier staat is dat 1x per minuut het bestand getx728data.py moet worden uitgevoerd dat in de map /scripts/python staat van Domoticz. Daarmee worden iedere minuut de actuele waarden ingevuld in de apparaten Batterijspanning en Batterijlading. Het stukje abracadabra aan het eind van de regel (/dev/null 2>&1 &) betekent: ga meteen verder, zonder op het resultaat te wachten.

Sla het bestand op met ^O en sluit af met ^X.

Stap 18:
Als je een notificatie wilt ontvangen voordat de Raspberry Pi automatisch wordt afgesloten (dat gebeurt als de batterijspanning daalt tot 3V), kun je dat doen via de instellingen van het apparaat Batterijspanning (dat is terug te vinden onder het tabblad Overige): klik op het klokje en vul de noodzakelijke velden in, zoals te zien op onderstaande schermafbeelding.

In een van de volgende artikelen op deze blog ga ik verder in op het verzenden van SMS’jes vanuit Domoticz. Zodat je smarthome je ook bij uitval van je netwerkverbinding nog steeds notificaties kan sturen over wat er allemaal in huis gebeurt.

Proef op de som

En dan nu de proef op de som: hoe lang werkt de RPi door bij gebruikmaking van de X728 en twee Samsung INR18650-25R accu’s zoals die hierboven staan genoemd? Het gaat om een systeem dat stroom verbruikt voor de Raspberry Pi 4B / 4GB met X825 drive controller, een 120GB Kingston SSD, een Aeon gen5 Zwave stick en een RFXCOM XL.

Startpunt is 100% lading. Dan gaat de stekker van de netvoeding eruit. De batterijlading blijft nog 5 minuten op 100% en daalt dan vrijwel lineair. Na 2 uur en 55 minuten wordt de 0% bereikt.

Opmerkelijk is echter dat de spanning die de batterijen leveren dan nog behoorlijk op peil is en het systeem nog nog zo’n 45 minuten lang actief zal blijven.

Pas na 3 uur en 35 minuten stuurt Domoticz de notificatie dat het systeem zichzelf gaat uitschakelen (batterijniveau 3,2V) en vijf minuten later gebeurt dat daadwerkelijk. Het betekent een totale gebruiksperiode van 3 uur en 40 minuten op twee accu’s met een gezamenlijke capaciteit van 5000mAh.

Het systeem is na het terug inschakelen weer volledig opgeladen (100%) na 2 uur en een paar minuten.

Hittestress?

Een gevoelige vraag: de kast met de Raspberry Pi heeft nu geen actieve ventilator meer. Wordt de RPi daardoor niet vreselijk warm? Het antwoord luidt: nee. Domoticz belast de RPi maar zo gering, dat koeling geen enkel probleem vormt. De standaardkoellichamen op de chips van de RPi 4B volstaan. Het geheel wordt hoogstens handwarm.

Maar: meten is weten. Je kunt de temperatuur van de RPi controleren met het volgende commando:

vcgencmd measure_temp

In mijn geval levert dat op: 52 graden Celsius. Ruim beneden de 85 graden die de Raspberry Pi Foundation als maximum aanraadt.

Wil je toch een ventilator, bijvoorbeeld omdat de de RPi ook als NAS of voor andere toepassingen gebruikt? Aan de zijkant van de kast (aan de kant van de grote drukknop) is voldoende ruimte om eventueel alsnog de bij de X825-set meegeleverde ventilator te monteren.

Druk maar op je knopje

Tot slot: zo werkt de aan/uit knop van de X728 nadat je de software op de Raspberry Pi hebt geïnstalleerd:

Kort indrukken en loslatenRaspberry Pi en X728 aan
1..2 seconden indrukkenReboot
3..7 seconden indrukkenVeilig uitschakelen
>8 seconden indrukkenGeforceerd uitschakelen (doe dit alleen in geval van nood
of als je de RPi via de console met ‘sudo shutdown’ hebt
afgesloten, anders kunnen er bestanden die niet netjes zijn
afgesloten beschadigd raken)

Lees ook:


7 reacties

Bert · 24 oktober 2020 op 17:11

Ik heb zojuist mijn domoticz RPI zomerproof gemaakt en vind het zonde om de X735 weer weg te halen. Is er geen andere oplossing?

Groet,
Bert

    Robot One · 28 oktober 2020 op 12:44

    De X735 is op zich overbodig als je de X728 UPS installeert, misschien op de ventilator na. Maar als ik naar het temperatuurverloop van mijn ventilatorloze RPi4B kijk sinds de installatie, dan is die ook niet echt nodig:
    Systeemtemperatuur RPi4B met Domoticz

Rob · 5 november 2020 op 16:26

stap 17

*/1 * * * * sudo python /home/pi/domoticz/scripts/python/getx728data.py /dev/null 2>&1 &

moet imho zijn

*/1 * * * * sudo python /home/pi/domoticz/scripts/python/getx728data.py >/dev/null 2>&1 &

> voor /dev/null

vr gr,
Rob

Stephan · 20 april 2021 op 15:18

Geweldige tutorial, waarvoor mijn dank. Echter loop ik vast bij stap 15. Bij het testen krijg ik onderstaande melding in terminal en geen waarden in Domoticz:

Traceback (most recent call last):
File “/home/pi/domoticz/scripts/python/getx728data.py”, line 34, in
r = requests.get(url)
File “/usr/lib/python2.7/dist-packages/requests/api.py”, line 75, in get
return request(‘get’, url, params=params, **kwargs)
File “/usr/lib/python2.7/dist-packages/requests/api.py”, line 60, in request
return session.request(method=method, url=url, **kwargs)
File “/usr/lib/python2.7/dist-packages/requests/sessions.py”, line 533, in request
resp = self.send(prep, **send_kwargs)
File “/usr/lib/python2.7/dist-packages/requests/sessions.py”, line 646, in send
r = adapter.send(request, **kwargs)
File “/usr/lib/python2.7/dist-packages/requests/adapters.py”, line 498, in send
raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: (‘Connection aborted.’, error(104, ‘Connection reset by peer’))

    Stephan · 20 april 2021 op 15:30

    Probleem reeds gevonden. De poort in het voorbeeld is 88 de mijne is 81.

Nick · 21 juli 2021 op 19:40

I’ve planning to add an x728 to my HomeAssistant server running on a Pi3b+. Is your setup still working? Have you had any issue with the batteries? Do you have concerns about the batteries failing spectacularly?

    Robot One · 7 augustus 2021 op 10:01

    Sorry for the late reply, I have been on holidays. Yes, my setup is still working. Due to carelessness however, I did shortcircuit my original x728 v1.2 board some months ago while tinkering, but I have replaced it with the X728 v1.3, which adds power surge protection. It has been working without interruptions again for about half a year now. On the Geekworms site, I read that there is again a new version: 2.0 with improved protection for battery overcharge and overdischarge. Sounds interesting for a future upgrade, but for now I am happy with my setup.

Geef een reactie

Avatar plaatshouder

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *