Helpdesk

Hy,[nbsp]


bin langsam am Verzweifeln mit dem StromPi-Board, im Grunde läuft alles soweit so gut, ich möchte aber über ein Skript die Batteriewerte tracken, sammeln und dann tageweise versenden oder als JSON-File behandeln,quasi eine History-Funktion zur Batterieüberwachung damit abbilden.


In den ersten Tests funktioniert das Auslesen der Werte wie erwartet, wenn man das manuell eingibt und über minicom ausliest.


[gt]adc-output
****************************
Wide-Range-Inputvoltage: 12.797 V
LifePo4-Batteryvoltage: 3.437 V [100%] [charging]
microUSB-Inputvoltage: not connected
Output-Voltage: 5.003 V
****************************


Variante-1 Auslesen per Minicom-Skript:


Macht man das allerdings per Minicom-Skript mit einem entsprechenden Macro, wird der Befehl "adc-output" nie ganz übernommen. Mir sieht es so aus, als ob hier das "Minuszeichen" das Problem ist, das kann man so nicht wirklich übertragen. Somit scheidet Minicom wohl aus, wäre zwar schön, wenn man das hinbekommen könnte.


Variante-2 : Verwenden von "StromPi3_Status.py"


Im Forum wurde auch darauf verwiesen das Skript "StromPi3_Status.py" zu verwenden bzw. anzupassen. Aber dieses Skript funktioniert auch nicht.


Kommen dann folgende Fehlermeldungen:


#sudo python StromPi3_Status.py
Traceback (most recent call last):
[nbsp] File "StromPi3_Status.py", line 145, in [lt]module[gt]
[nbsp] [nbsp] sp3_ADC_Wide = float(serial_port.readline(9999))/1000;
ValueError: could not convert string to float:


[gt][gt] Auch das funktioniert also nicht wirklich zuverlässig.


Daher die konkrete Frage, wie kann man per Skript die Spannungswerte (und nur diese) auslesen, die anderen interessieren mich aktuell nicht wirklich. Was empfehlen hier die Entwickler dieses Boards?


Das Auslesen möchte ich im 5 Min. Takt machen.


Wenn jemand schon vor einem ähnlichen Problem stand und es gelöst hat, möge er mir helfen.....


[nbsp]


[nbsp]


[nbsp]


[nbsp]


[nbsp]


[nbsp]

Semmelini

10.08.21 13:42

Hallo Semmelini,


am Ende dieser Nachricht finden Sie ein Skript, das wir für interne Zwecke verwenden. Ihr Vorhaben sollte sich damit umsetzen lassen. Mithilfe dieses Skriptes können Sie die gewünschten Batteriewerte tracken und in einer .CSV-Datei abspeichern.


Für die korrekte Verwendung sollte in der Config GUI der Serialless Modus eingeschaltet sein, damit der StromPi keine Meldungen mehr sendet. Die serielle Schnittstelle muss jedoch trotzdem geöffnet bleiben, damit die Funktion gegeben ist.


Mit freundlichen Grüßen


Niklas Tritschler


Hier ist der Code für unseren battery_logger_v1.72.py:


import serial
from time import sleep


breakS = 0.1
breakL = 0.5

serial_port = serial.Serial()

serial_port.baudrate = 38400
serial_port.port = '/dev/serial0'
serial_port.timeout = 1
serial_port.bytesize = 8
serial_port.stopbits = 1
serial_port.parity = serial.PARITY_NONE

if serial_port.isOpen(): serial_port.close()
serial_port.open()


serial_port.write(str.encode('quit'))
sleep(breakS)
serial_port.write(str.encode('\x0D'))
sleep(breakL)

filename = input("Dateiname(ohne Dateiendung): ")


def fetchData():
sp3_ADC_BAT_temp = []
for i in range(3):
serial_port.write(str.encode('status-rpi'))
sleep(1)
serial_port.write(str.encode('\x0D'))
sp3_time = serial_port.readline(9999);
sp3_date = serial_port.readline(9999);
sp3_weekday = serial_port.readline(9999);
sp3_modus = serial_port.readline(9999);
sp3_alarm_enable = serial_port.readline(9999);
sp3_alarm_mode = serial_port.readline(9999);
sp3_alarm_hour = serial_port.readline(9999);
sp3_alarm_min = serial_port.readline(9999);
sp3_alarm_day = serial_port.readline(9999);
sp3_alarm_month = serial_port.readline(9999);
sp3_alarm_weekday = serial_port.readline(9999);
sp3_alarmPoweroff = serial_port.readline(9999);
sp3_alarm_hour_off = serial_port.readline(9999);
sp3_alarm_min_off = serial_port.readline(9999);
sp3_shutdown_enable = serial_port.readline(9999);
sp3_shutdown_time = serial_port.readline(9999);
sp3_warning_enable = serial_port.readline(9999);
sp3_serialLessMode = serial_port.readline(9999);
sp3_intervalAlarm = serial_port.readline(9999);
sp3_intervalAlarmOnTime = serial_port.readline(9999);
sp3_intervalAlarmOffTime = serial_port.readline(9999);
sp3_batLevel_shutdown = serial_port.readline(9999);
sp3_batLevel = serial_port.readline(9999);
sp3_charging = serial_port.readline(9999);
sp3_powerOnButton_enable = serial_port.readline(9999);
sp3_powerOnButton_time = serial_port.readline(9999);
sp3_powersave_enable = serial_port.readline(9999);
sp3_poweroffMode = serial_port.readline(9999);
sp3_poweroff_time_enable = serial_port.readline(9999);
sp3_poweroff_time = serial_port.readline(9999);
sp3_wakeupweekend_enable = serial_port.readline(9999);
sp3_ADC_Wide = float(serial_port.readline(9999))/1000;
sp3_ADC_BAT = float(serial_port.readline(9999))/1000;
sp3_ADC_USB = float(serial_port.readline(9999))/1000;
sp3_ADC_OUTPUT = float(serial_port.readline(9999))/1000;
sp3_output_status = serial_port.readline(9999);
sp3_powerfailure_counter = serial_port.readline(9999);
sp3_firmwareVersion = serial_port.readline(9999);

sp3_ADC_BAT_temp.append(sp3_ADC_BAT)

sp3_ADC_BAT_avg = (sp3_ADC_BAT_temp[0] + sp3_ADC_BAT_temp[1] + sp3_ADC_BAT_temp[2]) / 3
# print(sp3_ADC_BAT_temp)

return round(sp3_ADC_BAT_avg, 3)


try:
while True:
fetched_data = fetchData()
f = open(filename + ".csv", "a")
f.write(str(fetched_data) + "\n")
f.close()
print(fetched_data)
sleep(26.9)




except KeyboardInterrupt:
print('interrupted!')
serial_port.close()

13.08.21 15:35

Hy,


habe das Skript ausprobiert, allerdings bekomme ich nur für den Wert sp3_ADC_BAT Werte zurück, ich würde aber gerne die Werte der Spannungsversorgung, des Strompi und die Output Werte haben, analog dem "adc-output" Ergebnis; Diese sind aber leider immer "None". Ich habe hier eigentlich im Skript nur die anderen Werte als Variable genommen.


Ergebnis adc-ouput per minicom:


Wide-Range-Inputvoltage: 12.797 V
LifePo4-Batteryvoltage: 3.437 V [100%] [charging]
Output-Voltage: 5.003 V
****************************


Der sp3_ADC_BAT gibt mir wohl die Werte für LifePo4-Battery zurück, das ist alles o.k., fehlen noch die anderen 2 Werte.


Wäre wirklich super, wann das auch noch gangbar gemacht werden könnte.


VG


[nbsp]

Semmelini

18.08.21 16:43

Hallo Semmelini,


Wir haben die Funktion angepasst, sodass auch die Spannung am Wide-Eingang und die Ausgangsspannung zurückgegeben werden.


Mit freundlichen Grüßen[nbsp]


Tim (Joy-IT)


[nbsp]


[nbsp]


def fetchData():
sp3_ADC_BAT_temp = []
sp3_ADC_Wide_temp = []
sp3_ADC_OUTPUT_temp = []
for i in range(3):
serial_port.write(str.encode('status-rpi'))
sleep(1)
serial_port.write(str.encode('\x0D'))
sp3_time = serial_port.readline(9999);
sp3_date = serial_port.readline(9999);
sp3_weekday = serial_port.readline(9999);
sp3_modus = serial_port.readline(9999);
sp3_alarm_enable = serial_port.readline(9999);
sp3_alarm_mode = serial_port.readline(9999);
sp3_alarm_hour = serial_port.readline(9999);
sp3_alarm_min = serial_port.readline(9999);
sp3_alarm_day = serial_port.readline(9999);
sp3_alarm_month = serial_port.readline(9999);
sp3_alarm_weekday = serial_port.readline(9999);
sp3_alarmPoweroff = serial_port.readline(9999);
sp3_alarm_hour_off = serial_port.readline(9999);
sp3_alarm_min_off = serial_port.readline(9999);
sp3_shutdown_enable = serial_port.readline(9999);
sp3_shutdown_time = serial_port.readline(9999);
sp3_warning_enable = serial_port.readline(9999);
sp3_serialLessMode = serial_port.readline(9999);
sp3_intervalAlarm = serial_port.readline(9999);
sp3_intervalAlarmOnTime = serial_port.readline(9999);
sp3_intervalAlarmOffTime = serial_port.readline(9999);
sp3_batLevel_shutdown = serial_port.readline(9999);
sp3_batLevel = serial_port.readline(9999);
sp3_charging = serial_port.readline(9999);
sp3_powerOnButton_enable = serial_port.readline(9999);
sp3_powerOnButton_time = serial_port.readline(9999);
sp3_powersave_enable = serial_port.readline(9999);
sp3_poweroffMode = serial_port.readline(9999);
sp3_poweroff_time_enable = serial_port.readline(9999);
sp3_poweroff_time = serial_port.readline(9999);
sp3_wakeupweekend_enable = serial_port.readline(9999);
sp3_ADC_Wide = float(serial_port.readline(9999))/1000;
sp3_ADC_BAT = float(serial_port.readline(9999))/1000;
sp3_ADC_USB = float(serial_port.readline(9999))/1000;
sp3_ADC_OUTPUT = float(serial_port.readline(9999))/1000;
sp3_output_status = serial_port.readline(9999);
sp3_powerfailure_counter = serial_port.readline(9999);
sp3_firmwareVersion = serial_port.readline(9999);

sp3_ADC_BAT_temp.append(sp3_ADC_BAT)
sp3_ADC_Wide_temp.append(sp3_ADC_Wide)
sp3_ADC_OUTPUT_temp.append(sp3_ADC_OUTPUT)
sp3_ADC_BAT_avg = (sp3_ADC_BAT_temp[0] + sp3_ADC_BAT_temp[1] + sp3_ADC_BAT_temp[2]) / 3
sp3_ADC_Wide_avg = (sp3_ADC_Wide_temp[0] + sp3_ADC_Wide_temp[1] + sp3_ADC_Wide_temp[2]) / 3
sp3_ADC_OUTPUT_avg = (sp3_ADC_OUTPUT_temp[0] + sp3_ADC_OUTPUT_temp[1] + sp3_ADC_OUTPUT_temp[2]) / 3


return round(sp3_ADC_BAT_avg, 3), round (sp3_ADC_Wide_avg, 3), round (sp3_ADC_OUTPUT_avg, 3)

Tim

23.08.21 13:29