Hallo Zusammen,
nachdem die Pi USV+ immer wieder und gerne mal zickig ist habe ich mir mal Gedanken über ein besseres Monitoring gemacht. Heraus kam, dass man die internen Register der Pi USV+ mit Python auslesen kann. Damit das funktioniert muss die python-smbus Library installiert sein.
Also - falls die python-smbus Library noch nicht vorhanden ist:
Dann brauchen wir eine neue Datei 'piusv.py'
und bescheren ihr diesen Inhalt:
#!/usr/bin/python
import smbus
import sys
import time
import os
# Pi USV+ Adresse
address = 0x18
# StatusByte
data_0 = 1
# Version
data_1 = 12
# Parameter (I/U)
data_2 = 10
# Globale Variablen
par = [0,0,0,0,0,0,0,0,0,0]
par_2 = [0,0,0,0,0]
par_3 = [0,0,0,0,0]
par_name = ["U_Batt (V)","I_Rasp (A)","U_Rasp (V)","U_USB (V)","U_ext (V)"]
log = ""
version = ""
status = ""
stati = ""
optionen = "Moegliche Optionen:\n version \n status \n all \n log \n U_Batt \n I_Rasp \n U_Rasp \n U_USB \n U_ext"
# Handle
piusv = smbus.SMBus(1)
def main():
# Statusbyte auslesen
def get_status(piusv, address):
piusv.write_byte(address, 0x00)
try:
status = (piusv.read_byte(address))
except IOError, err:
print "Fehler beim Lesen von Device 0x%02X" % address
exit(-1)
return status
# Firmware Version auslesen und in eine lesbare Zeile umwandeln
def version(piusv, address, data_1):
version = ""
piusv.write_byte(address, 0x01)
for i in range (data_1):
try:
version = version + chr(piusv.read_byte(address))
except IOError, err:
print "Fehler beim Lesen von Device 0x%02X" % address
exit(-1)
return version
# Die Parameter der Pi USV+ byteweise auslesen
def get_parameter():
piusv.write_byte(address, 0x02)
for i in range (data_2):
try:
par[i] = piusv.read_byte(address)
except IOError, err:
print "Fehler beim Lesen von Device 0x%02X" % address
exit(-1)
return par
# Umwandlung der Parameter in lesbare Werte(V,A)
def word2float(par, data_2):
for i in range (data_2/2):
par_2[i] = (256*float(par[i*2])+(float(par[1+(i*2)])))/1000
return par_2
# Umwandlung der Parameter in lesbare Werte(mV,.A)
def word2int(par, data_2):
for i in range (data_2/2):
par_2[i] = int(256*float(par[i*2])+(float(par[1+(i*2)])))
return par_2
# Werte mit Namen versehen
def line(par_2, data_2):
log = ""
for i in range (data_2/2):
log = log+" |"+"% 2.3f"% (par_2[i])+" "+par_name[i]
log = ("%02s"% get_status(piusv, address))+log
return log
# Statusbyte auswerten, Mehrfachnennung moeglich
def status2sent():
stati = "StatusByte Bedeutung \n"
status = get_status(piusv, address)
if status&0x01==0x01:
stati = stati + " 0000.0001 Spannungsversorgung von Micro-USB-Buchse" + "\n"
if status&0x02==0x02:
stati = stati + " 0000.0010 Spannungsversorgung von Uext" + "\n"
if status&0x04==0x04:
stati = stati + " 0000.0100 (Zu?) niedrige Batteriespannung" + "\n"
if status&0x08==0x08:
stati = stati + " 0000.1000 Akku wird geladen" + "\n"
if status&0x10==0x10:
stati = stati + " 0001.0000 Akku ist voll" + "\n"
if status&0x20==0x20:
stati = stati + " 0010.0000 Taster S1 betaetigt" + "\n"
return (stati)
def U_Batt():
get_parameter()
word2int(par, data_2)
return par_2[0]
def I_Rasp():
get_parameter()
word2int(par, data_2)
return par_2[1]
def U_Rasp():
get_parameter()
word2int(par, data_2)
return par_2[2]
def U_USB():
get_parameter()
word2int(par, data_2)
return par_2[3]
def U_ext():
get_parameter()
word2int(par, data_2)
return par_2[4]
# Script mit diversen Optionen abarbeiten
# Ohne Option wird eine Hilfe-Seite ausgegeben
try:
option = sys.argv[1]
except:
print optionen
exit (0)
# Firmwareversion
if option == "version":
print version(piusv, address, data_1)
# Status und Bedeutung
elif option == "status":
print status2sent()
# Logdatei schreiben
elif option == "log":
get_parameter()
word2float(par, data_2)
log = time.strftime("%Y%m%d-%H%M%S")+" |"+line(par_2, data_2) + "\n"
fh = open('/var/log/PIUSV.log', 'a')
fh.write (log)
fh.close()
# Kommandozeilenausgabe komplett
elif option == "all":
get_parameter()
word2float(par, data_2)
all = line(par_2, data_2)
print all + "\n" + status2sent()
# Nur eine Zahl zur Weiterverarbeitung
elif option == "U_Batt":
print U_Batt()
elif option == "I_Rasp":
print I_Rasp()
elif option == "U_Rasp":
print U_Rasp()
elif option == "U_USB":
print U_USB()
elif option == "U_ext":
print U_ext()
# Falsche Option, Hilfeseite ausgeben
else:
print optionen
if __name__ == '__main__':
main()
Alles anzeigen
Nicht vergessen die Adresse eurer Pi USV+ zu prüfen und die Datei zu speichern!
Ein guter Aufenthaltsort für das Skript ist '/usr/local/bin', daher:
Ausgabebeispiele:
sudo python piusv.py all
9 | 4.178 U_Batt (V) | 0.261 I_Rasp (A) | 5.083 U_Rasp (V) | 5.089 U_USB (V) | 0.000 U_ext (V)
StatusByte Bedeutung
0000.0001 Spannungsversorgung von Micro-USB-Buchse
0000.1000 Akku wird geladen
Erklärung zur Ausgabe:
Bei dem ersten Wert handelt es sich um ein StatusByte, das man bitweise betrachten muss.
Bit 0 Spannungsversorgung von der Micro-USB-Buchse
Bit 1 Spannungsversorgung von Uext
Bit 2 (Zu?) niedrige Akkuspannung
Bit 3 Akku wird geladen
Bit 4 (?)
Bit 5 Taster S1 gedrückt
Bit 6 (?)
Bit 7 (?)
Die nachfolgenden Werte sind:
U_Batt (V) Akku-Spannung
I_Rasp (A) Strom, den der Raspberry braucht (Ohne USV)
U_Rasp (V) Spannung, mit der der Raspberry arbeitet
U_USB (V) Spannung, die an der Micro-USB Buchse anliegt
U_ext (V) Spannung, die an der externen Stromversorgung anliegt
Darunter ist nur die Übersetzung des Statusbytes.
Folgende Optionen werden ausgewertet:
python piusv.py all : Wie die Option sagt, alles was es gibt
python piusv.py status : Nur die Auswertung des Statusbyte
python piusv.py version : Die Firmwareversion
python piusv.py log : Schreibt bei jedem Aufruf (als root!) eine Zeile in /var/log/PIUSV.log
Für eine weitere Auswertung durch Scripte:
python piusv.py U_Batt : Spannung am Akku
python piusv.py I_Rasp : Stromaufnahme des Raspberrys
python piusv.py U_Rasp : Spannungsversorgung des Raspberrys
python piusv.py U_USB : Spannung an der USB-Buchse
python piusv.py U_ext : Spannung am externen Anschluss
Mir bekannte Fehler:
Mit dem StatusByte (bei Versorgung über den Widerange Power Input der Pi USV+) scheint es noch Probleme zu geben. Selbst wenn ich hier ein 12V Netzteil anstecke gibt die Pi USV+ als Status stur '0000.0001 - Spannungsversorgung von der Micro-USB-Buchse' zurück.
sudo python /usr/local/bin/piusv.py all
9 | 4.099 U_Batt (V) | 0.566 I_Rasp (A) | 5.003 U_Rasp (V) | 0.849 U_USB (V) | 12.199 U_ext (V)
StatusByte Bedeutung
0000.0001 Spannungsversorgung von Micro-USB-Buchse
0000.1000 Akku wird geladen
Viel Spass allen Pi USV+ Besitzern!