USV für den Raspberry Pi mit Raspi UPS HAT

Ich habe leider öfter das Problem gehabt, dass sich das Image auf der SD-Karte zerstört hat, sobald eine Spannungsspitze oder ein Stromausfall war. Damit ich dies verhindern kann habe ich mir die Raspi UPS HAT bestellt.

Hier Beschreibe ich kurz wo ich sie bestellt habe und wie man sie richtig anschließt und installiert.


Bestellung

 

Bestellt habe ich mir die Raspi UPS HAT bei AliExpress und folgendem Händer:

https://www.aliexpress.com/item/UGEEK-UPS-HAT-with-Battery-for-Raspberry-Pi-3-Model-B-2B-B-Raspberry-Pi-Battery/32786176030.html?spm=2114.13010608.0.0.8xht7t

Lieferzeit betrug 1 Monat und kam per Einschreiben.


Bilder

 

 

 

 

 

 

 

 

 

 

 


In Betrieb nehmen

Die Batterie wie auf den Bildern zu sehen mit Hilfe des Klebestreifens auf der Platine befestigen und mit dem Stecker verbinden. Dann das Board auf den Raspberry stecken und die Micro-USB Stromversorgung in die Buchse des Raspi UPS HAT stecken.

Nun sollten die LED´s Anfangen zu leuchten, aber der Raspberry bleibt dunkel.

Damit der Raspberry startet muss man den Knopf über der SD-Karte, an der UPS HAT drücken.


Installation und Einstellung

 

Software aktualisieren

user@computer:$ sudo apt-get update
sudo apt-get upgrade

Danach mittels raspi-config die I2C-Funktion aktivieren

user@computer:$ sudo raspi-config

Nun installieren wir python-smbus

user@computer:$ sudo apt-get install python-smbus

Danach wiringPi

user@computer:$ sudo apt-get install git
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
cd wiringPi
./build

Danach laden wir uns UPS-HAT-sample-code-via-i2c-by-Joachim herunter

user@computer:$ wget http://www.linuxblognf.de/wp-content/uploads/2017/03/UPS-HAT-sample-code-via-i2c-by-Joachim.zip
unzip UPS-HAT-sample-code-via-i2c-by-Joachim.zip

Und probieren ob wir die Batterieladung und Spannung auslesen können

user@computer:$ sudo python UPS-HAT-sample-code-via-i2c-by-Joachim.py

Angezeigt werden dann folgendes

Voltage: 4.15V
Battery: 95%
-----------
|######### |+
-----------

Eigenes Script in Python was die Batterie überwacht und ab 10% das System herunter fährt

 

import struct
import smbus
import sys
import time

#Pfad zum Log-File
logfile = '/var/log/Raspi_UPS_HAT.log'

#Funktion zum Auslesen der Spannung
def readVoltage(bus):
 address = 0x36
 read = bus.read_word_data(address, 2)
 swapped = struct.unpack("<H", struct.pack(">H", read))[0]
 voltage = swapped * 78.125 /1000000
 return voltage

#Funktion zum Auslesen der Kapazitaet
def readCapacity(bus):
 address = 0x36
 read = bus.read_word_data(address, 4)
 swapped = struct.unpack("<H", struct.pack(">H", read))[0]
 capacity = swapped/256
 return capacity

#Aufzeichnen von Ereignissen
def log(msg):

 file = open(logfile,"a")
 file.write("%s: %s\n" % (time.strftime("%d.%m.%Y %H:%M:%S"), msg))
 file.close

bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
while 0<1:
 if readCapacity(bus) <= 10:
 log("Batterie nur noch bei 10%. Fahre das System runter")
 os.system('shutdown now -h') 
 elif readCapacity(bus) <= 90:
 log("Stromausfall")
 log("Spannung:%5.2fV" % readVoltage(bus))
 log("Battery:%5i%%" % readCapacity(bus))
 time.sleep(60)
 else :
 time.sleep(600)

Ich habe das Script bei mir “ UPS-HAT-checked-and-shutdown.py“ genannt.

[Edit:26.03.2017 19:26]

Habe das Script noch einmal überarbeitet. Wenn Strom da ist wird es nur alle 10 Minuten abgefragt und sobald er Weg ist aktualisiert er jede Minute.

Des Weiteren habe ich die Reihenfolge der If-Anweisung korrigiert, damit er auch wirklich runter fährt.

Damit das Script automatisch startet müsst ihr eine Bash-Datei für die /etc/init.d schreiben und das Script anmelden.

 

C.Frahm

C.Frahm

Christian ist 1987 in Erfurt geboren, hat dort sein Abitur und seine Ausbildung zum Mikrotechnologen abgeschlossen. 2010 lernte er seine Frau kennen und ist 2012 nach Nordfriesland gezogen. Seine Hobby sind die Informatik, Elektrotechnik, Mechatronik und Handwerkliche Sachen.
C.Frahm
Average Rating
0 out of 5 stars. 0 votes.

Flattr this!

16 Gedanken zu „USV für den Raspberry Pi mit Raspi UPS HAT

  1. Halli Hallo,
    ich wollte grad mal dein Script ausprobieren und stoße schon im zweiten Schritt auf das Problem:
    Paket python-smbus ist nicht verfügbar, wird aber von einem anderen Paket
    referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
    wurde oder nur aus einer anderen Quelle verfügbar ist.
    Gibts dafür eine Lösung?

      1. Problem gelöst… War ein frisches Debian Stretch und da fehlten noch die ganzen Paketquellen… In deinem Script fehlt allerdings der „import os“ Eintrag…

  2. Bitte auf die Formatierung achten.

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

    # Pfad zum Log-File

    logfile = ‚/var/log/Raspi_UPS_HAT.log‘

    # Funktion zum Auslesen der Spannung

    def readVoltage(bus):
    address = 0x36
    read = bus.read_word_data(address, 2)
    swapped = struct.unpack(‚H‘, read))[0]
    voltage = swapped * 78.125 / 1000000
    return voltage

    # Funktion zum Auslesen der Kapazitaet

    def readCapacity(bus):
    address = 0x36
    read = bus.read_word_data(address, 4)
    swapped = struct.unpack(‚H‘, read))[0]
    capacity = swapped / 256
    return capacity

    # Aufzeichnen von Ereignissen

    def log(msg):

    file = open(logfile, ‚a‘)
    file.write(‚%s: %s\n‘ % (time.strftime(‚%d.%m.%Y %H:%M:%S‘), msg))
    file.close

    bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
    while 0 < 1:
    if readCapacity(bus) <= 10:
    log('Batterie nur noch bei 10%. Fahre das System runter')
    os.system('shutdown now -h')
    elif readCapacity(bus) <= 90:
    log('Stromausfall')
    log('Spannung:%5.2fV' % readVoltage(bus))
    log('Battery:%5i%%' % readCapacity(bus))
    time.sleep(60)
    else:
    time.sleep(600)

    Unter putty kann man es testen. Unter /var/log steht dann auch die log file. Sobald putty geschlossen wird, bricht auch die usv.py ab.

    Unter autostart einbinden:

    sudo chmod +x /home/pi/wiringPi/usv.py
    sudo nano /etc/rc.local

    /home/pi/wiringPi/usv.py &
    exit 0
    sudo reboot

    zum testen:
    ps -ef | grep python

    Ausgabe:
    root 772 1 0 13:23 ? 00:00:00 /usr/bin/python /home/pi/wiringPi/usv.py <<== siehe da – läuft
    pi 841 828 0 13:24 pts/0 00:00:00 grep –color=auto python

    … sollte so ungefähr aussehen. Kontrolle im log file.

    Vielleicht hilft es. Ich habe ewig gesucht, bis ich es zum laufen bekommen habe.

  3. Hallo Christian,
    ich habe dienen Beitrag gelesen zu der UPS Hat.
    Das Ding läuft.
    Nur bräuchte ich etwas Hilfe, wie ich dein Script zum laufen bringe.
    Könntest du mir da etwas unter die Arme greifen?

    Vielen Dank

      1. Hallo,
        ja, ich habe dein script mit sudo nano … angelegt.

        Pfad: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py (Standard)

        Wie soll ich es nun unter /ettc/init.d startfähig machen?
        Ich habe eine bash Datei angelegt.
        >>

        #! /bin/sh
        ### BEGIN INIT INFO
        # Provides: usv.py
        # Required-Start: $syslog
        # Required-Stop: $syslog
        # Default-Start: 2 3 4 5
        # Default-Stop: 0 1 6
        # Short-Description: UPS HAT
        # Description:
        ### END INIT INFO

        case „$1“ in
        start)
        echo „usv.py wird gestartet“
        # Starte Programm
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py
        ;;
        stop)
        echo „usv.py wird beendet“
        # Beende Programm
        killall usv.py
        ;;
        *)
        echo „Benutzt: /etc/init.d/usv {start|stop}“
        exit 1
        ;;
        esac

        exit 0

        Leider funktioniert das nicht.
        Mit sudo /etc/init.d/usv start bekomme ich:

        pi@raspberrypi:/etc/init.d $ sudo /etc/init.d/usv start
        usv.py wird gestartet
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: 1: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: import: not found
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: 2: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: import: not found
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: 3: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: import: not found
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: 4: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: import: not found
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: 7: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: logfile: not found
        /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: 10: /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py: Syntax error: „(“ unexpected
        Ich weiß da nicht mehr weiter.
        Die USV läuft ansonsten gut.

        Danke

        1. Hallo Tilo,

          das klingt für mich so als würde das Script selbst nicht laufen. Hattest du es vorher mal aufgerufen mit :
          python /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py ?

          Wenn ja, waren dort keine Fehler?

          Ansonsten probiere auf jedenfall mal das:
          #! /bin/sh
          ### BEGIN INIT INFO
          # Provides: usv.py
          # Required-Start: $syslog
          # Required-Stop: $syslog
          # Default-Start: 2 3 4 5
          # Default-Stop: 0 1 6
          # Short-Description: UPS HAT
          # Description:
          ### END INIT INFO

          case „$1“ in
          start)
          echo „usv.py wird gestartet“
          # Starte Programm
          python /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py &
          ;;
          stop)
          echo „usv.py wird beendet“
          # Beende Programm
          killall python
          ;;
          *)
          echo „Benutzt: /etc/init.d/usv {start|stop}“
          exit 1
          ;;
          esac

          exit 0

          Denn du sagst zwar wo das Script liegt aber nicht mit was er starten soll.

          Gruß
          Christian

          1. Hi,

            hier die Fehlermeldung beim Start:

            pi@raspberrypi:~ $ python /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py
            File „/home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py“, line 35
            log(„Batterie nur noch bei 10% Fahre das System runter“)
            ^
            IndentationError: expected an indented block

            Dort hatte ich dann 3 Leerzeichen vor dem log eingesetzt.
            Dann kam die nächste Fehlermeldung.
            pi@raspberrypi:~/wiringPi/wiringPi/rpi-ups-hat $ sudo python /home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py
            sudo: /etc/sudoers.d/README is world writable
            File „/home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py“, line 37
            elif readCapacity(bus) <= 90:
            ^
            SyntaxError: invalid syntax
            Dann weiß ich nicht mehr weiter.

            Wenn ich in der init.d den Pfad ändere, wird das script gestratet.
            pi@raspberrypi:/etc/init.d $ sudo /etc/init.d/usv start
            sudo: /etc/sudoers.d/README is world writable
            usv.py wird gestartet
            pi@raspberrypi:/etc/init.d $ File "/home/pi/wiringPi/wiringPi/rpi-ups-hat/usv.py", line 37
            elif readCapacity(bus) <= 90:
            ^
            SyntaxError: invalid syntax

            Aber eben mit Fehlermeldung.

            Grüße

              1. import struct
                import smbus
                import sys
                import time

                #Pfad zum Log-File
                logfile = ‚/var/log/Raspi_UPS_HAT.log‘

                #Funktion zum Auslesen der Spannung
                def readVoltage(bus):
                address = 0x36
                read = bus.read_word_data(address, 2)
                swapped = struct.unpack(„H“, read))[0]
                voltage = swapped * 78.125 /1000000
                return voltage

                #Funktion zum Auslesen der Kapazitaet
                def readCapacity(bus):
                address = 0x36
                read = bus.read_word_data(address, 4)
                swapped = struct.unpack(„H“, read))[0]
                capacity = swapped/256
                return capacity

                #Aufzeichnen von Ereignissen
                def log(msg):

                file = open(logfile,“a“)
                file.write(„%s: %s\n“ % (time.strftime(„%d.%m.%Y %H:%M:%S“), msg))
                file.close

                bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
                while 0<1:
                if readCapacity(bus) <= 10:
                log("Batterie nur noch bei 10% Fahre das System runter")
                os.system('shutdown now -h')
                elif readCapacity(bus) <= 90:
                log("Stromausfall")
                log("Spannung:%5.2fV" % readVoltage(bus))
                log("Battery:%5i%%" % readCapacity(bus))
                time.sleep(60)
                else :
                time.sleep(600)

                Reicht dir das? Ich kann die Datei leider nicht anhängen.
                Er legt auch keine log File unter /var/log/ an.

                Danke für deine Geduld.

                1. Hallo Tilo,

                  wenn du deinen Quellcode mit meinem vergleichst, wirst du feststellen das bei dir die hälfte fehlt. Bitte kontrolliere nochmal Zeile für Zeile und teste es dann nochmal.

                  Gruß
                  Christian

                  1. Hallo Christian,
                    ich wünsche dir ein gesundes neues Jashr 2018.

                    Ich habe den Code überprüft. Zeile für Zeile.
                    In deinem Artikel ist bei time.sleep(600) Schluss.
                    Bis auf die Schreibweise von bestimmten Zeichen ist es 1:1 wie in deinem Artikel. sh. oben.

                    Was fehlt?
                    Oder steht noch irgendwo anders code? Vielleicht hinter [edit…].
                    Kein Link.
                    Ich finde keinen Fehler.

                    Grüße

                    1. Guten Morgen Tilo,

                      ich wünsche dir auch ein gesundes Neues Jahr 🙂

                      Ich habe dir eben mal eine Mail geschrieben unter deiner hier hinterlegten Adresse. Vielleich liegt ein Darstellungsfehler vor.

                      Gruß
                      Christian

                    2. Guten Morgen Tilo,

                      ich hab eben mal kurz gestöbert und bin dabei auf eine mögliche Lösung gestoßen.
                      Der Fehler mit den „IndentationError: expected an indented block“ kann durch Copy&Past kommen, heißt nichts anderes als das sich dort durch formatierungsfehler kleine Syntaxfehler eingeschlichen haben.
                      Lösche nochmal deine Datei und mach dir die Arbeit mal und tippe sie ab. Da wo ich eingerückt habe mit einem Tab einrücken und am Ende der Zeile direkt mit Enter in die nächste. Kannst auch gern erstmal so schauen, ob sich ein Zeichen an das Ende geschlichen hat.

                      Bin auf deine Rückmeldung gespannt. Wenn das der Fehler noch nicht war suchen wir noch weiter.

                      Gruß
                      Christian

Schreibe einen Kommentar

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