Seite 14 von 32

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Mo Jun 03, 2024 3:17 pm
von wb-2020
Perfekt. Das war auch mein Plan.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Mo Jun 03, 2024 5:50 pm
von mattberlin
Ich gehe mal schwer davon aus, dass wir nicht auf das Release 2.1.4 updaten sollten.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Mo Jun 03, 2024 7:13 pm
von zut
Die Ankündigung spricht von der Integration von PR#1598 (" Der Pfad "others/" darf auf dem MQTT Broker von anderen Anwendungen verwendet werden."), aber vorgesehen ist der eigentlich erst zu einem späteren Zeitpunkt, und noch ist er nicht integriert. Die Release-Baseline scheint auch auf Master gezogen zu sein. Mal sehen, ob und was dann morgen in 2.1.4 drin ist. Aber bevor das nicht feststeht, lieber nicht auf 2.1.4 Release gehen. 2.1.4 Master geht.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Mo Jun 03, 2024 7:16 pm
von mattberlin
Alles klar, wir warten auf Deine Ansagen.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Di Jun 04, 2024 8:01 am
von zut
Wenn ich richtig sehe, ist PR#1598 jetzt in Release 2.1.4 drinnen. Ein Update sollte also mit soc_helper-2024-05-28 nach entsprechender WiCAN - Konfiguration funktionieren.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Di Jun 04, 2024 5:30 pm
von mattberlin
Alles klar, dann wechsel ich wieder auf Release. Die Bestellung bei Mouser ist schon gemacht.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Fr Jun 07, 2024 12:30 pm
von wb-2020
Ich bin gerade dabei, nach dem Update von 1.9 auf 2.1.4 auch den soc_helper umzustellen. Das Firmware-Update beim WiCAN hat funktioniert. Im MQTT-Explorer sehe ich die Topic-Meldung, dass er online ist.

Die configuration.py habe ich angepasst. Das war einfach, weil wir auch einen e-Up! haben und ich zudem noch in der alten Datei, die mit der Version 1.9 funktioniert hat, nachsehen konnte.
Ich habe dann auf dem pi folgende Dateien ersetzt:
configuration.py
ladevorgangclass.py
soc_helper.py
spritmonitor.py
test.py

Meine configuration.py sieht wie folgt aus:

Code: Alles auswählen

"""
Dies ist das Konfigurationsfile. Hier bitte nach eigenen Gegebenheiten eintragen. soc_helper
entdeckt Schreibzugriffe auf die Datei und liest sie neu ein. Bitte trotzdem die Ausgabe in
nohup.out oder auf der Konsole beachten, falls etwas Ungültiges abgespeichert wurde.
"""

"""
Spritmonitor-Konfiguration.
WICHTIG: Es muß eine gültige Umgebungsvariable SPRITMONITOR_BEARER_TOKEN geben. Diese kann
bei Spritmonitor.de auf der Passwort-Vergessen-Seite angefordert werden. Eine Umgebungs-
variable wird verwendet, damit nicht aus versehen der Zugang mit verschickt wird, wenn der
Code weitergegeben oder veröffentlicht wird. Sie wird vor Aufruf von soc_helper.py mittels
"export SPRITMONITOR_BEARER_TOKEN=<eigenerToken>" deklariert - idealerweise in der Datei
~/.profile schon bei der Anmeldung am System.
"""
USE_SPRITMONITOR = False               # Auf False setzen, falls Übertragung nicht erfolgen soll
SPRITMONITOR_VEHICLE_ID = '1370192'   # Bitte hier die eigene Fahrzeug-ID (In der App oder Webseite angezeigt) einfügen
SPRITMONITOR_FUELSORT = 24            # über die API sind die Nummern der Kraftstoffsorten abrufbar. Hier wichtig: 19 - Elektrizität, 24 - Ökostrom
SPRITMONITOR_FUELPRICE = 0.08         # Preis in €/kWh. Bei reinem PV-Laden die Einspeisevergütung plus evt. Umsatzsteuer auf Eigenverbrauch. 
# Folgende Attribute können der Betankung per default zugefügt werden (maximal je eines pro Zeile aussuchen):
# Reifen: summertires wintertires allyeartires
# Fahrweise: slow normal fast
# Mit Klima: ac
# Mit Anhänger: trailer
# Mit Standheizung: heating
SPRITMONITOR_ATTRIBUTES = 'summertires,slow'

"""
CAN. Siehe CAN-Datenbank VW: https://www.goingelectric.de/wiki/Liste-der-OBD2-Codes/
"""
# Die eigentliche Botschaft an den WiCAN im json-Format wird in soc_helper zusammengebaut. Beispiel für das eine Sendebotschaft (11-Bit-ID):
#     '{ "bus": "0", "type": "tx", "frame": [{ "id": 2021, "dlc": 8, "rtr": false, "extd": false, "data": [3, 34, 2, 140, 170, 170, 170, 170] }] }'
# Beispiel für das eine Sendebotschaft (29-Bit-ID):
#     '{ "bus": "0", "type": "tx", "frame": [{ "id": 2021, "dlc": 8, "rtr": false, "extd": true, "data": [3, 34, 2, 140, 170, 170, 170, 170] }] }'
# hier wird nur das Relevante angegeben: Die IDs der addressierten CAN-Teilnehmer (Sende-/EmpfangsID) und 8 Datenbytes in einer Liste, im Beispiel
#       SOC_REQUEST=[3, 34, 2, 140, 170, 170, 170, 170]  3 Kommando-Bytes, nämlich 34,2,140. Der Rest ist Füllung.
#	SOC_REQ_ID=2021		Dies ist die ID der Anforderung
#	SOC_RESP_ID=2029	Mit dieser ID kommt die Antwort aus dem Fahrzeug
# FIXME: Momentan wird automatisch genau dann eine 29-Bit-ID angenommen, wenn die ID >4095 ist, sonst eine 11-Bit-ID.
# Sobald ein Fahrzeug diese Annahme verletzt, muß der Code angepaßt werden.

# VW e-up
SOC_REQUEST = [3, 34, 2, 140, 170, 170, 170, 170]
SOC_REQ_ID = 2021     # 2021: Batterie-SG
SOC_RESP_ID = 2029   # 2029:  Batterie-SG
ODO_REQUEST = [3, 34, 2, 189, 170, 170, 170, 170]	# e-up - Antwort ist 2 CAN-Frames lang!
ODO_REQ_ID = 2021     # 2021: Batterie-SG
ODO_RESP_ID = 2029   # 2029:  Batterie-SG

# VW e-Golf
#SOC_REQUEST = [3, 34, 2, 140, 170, 170, 170, 170]
#SOC_REQ_ID = 2021     # 2021: Batterie-SG
#SOC_RESP_ID = 2029   # 2029:  Batterie-SG
#ODO_REQUEST = [3, 34, 2, 189, 170, 170, 170, 170]
#ODO_REQ_ID = 2021     # 2021: Batterie-SG
#ODO_RESP_ID = 2029   # 2029:  Batterie-SG

# Ora Funky Cat, Danke an Kitmgue
#SOC_REQUEST = [3, 34, 3, 8, 170, 170, 170, 170]
#SOC_REQ_ID = 1931
#SOC_RESP_ID = 1995
#ODO_REQUEST = [3, 34, 208, 4, 170, 170, 170, 170]
#ODO_REQ_ID = 1931
#ODO_RESP_ID = 1995

#VW MEB (laut id3esp32)
#SOC_REQUEST = [3, 34, 2, 140, 170, 170, 170, 170]
#SOC_REQ_ID = 0x17FC007B
#SOC_RESP_ID = 0x17FE007B
#ODO_REQUEST = [3, 34, 41, 90, 170, 170, 170, 170]
#ODO_REQ_ID = 0x17FC0076
#ODO_RESP_ID = 0x17FE0076

# Fiat 500e, siehe https://github.com/meatpiHQ/wican-fw/issues/95
#SOC_REQUEST = [3, 34, 160, 16, 170, 170, 170, 170]
#SOC_REQ_ID = 0x18DA44F1
#SOC_RESP_ID = 0x18DAF144
#ODO_REQUEST = [3, 34, 32, 1, 170, 170, 170, 170]
#ODO_REQ_ID = 0x18DA42F1
#ODO_RESP_ID = 0x18DAF142

"""
#OPENWB-Konfiguration
"""
OPENWB_IP = '192.168.1.60' # hier die Adresse der OpenWB einstellen - Lokaler Name könnte auch funktionieren, nicht ausprobiert

# Die folgenden Topics hängen von der Konfiguration der OpenWB ab. Wichtig ist, die Zahlen (IDs) richtig zu setzen. Sie sind in
# Firmware 2.0 auf der Statusseite zu finden.

#Für OpenWB 2.x:
OPENWB_SETSOC_TOPIC = 'openWB/set/vehicle/1/soc_module/calculated_soc_state/manual_soc' # Topic zum Setzen des manuellen SOC.
OPENWB_GETSOC_TOPIC = 'openWB/vehicle/1/get/soc' # Topic, um den SOC-Wert der Wallbox auszulesen
OPENWB_CHARGECOUNTER_TOPIC = 'openWB/chargepoint/3/get/imported' # Topic, um den Ladezähler auszulesen. Insbesondere die Nummer ist anzupassen
OPENWB_GETPLUGSTATE_TOPIC = 'openWB/chargepoint/3/get/plug_state' # Topic, um den Steckerzustand auszulesen. Nummer anpassen!
OPENWB_FACTORCOUNTER = 1000 # Faktor, um von der Einheit des Zählers (in 2.0 sind es Wh) auf kWh umzurechnen

#Für OpenWB 1.9:
#OPENWB_SETSOC_TOPIC='openWB/set/lp/1/manualSoc' #das Topic, auf das der ermittelte SOC geschrieben werden soll.
#OPENWB_GETSOC_TOPIC='openWB/lp/1/%Soc' #Topic, um den SOC-Wert der Wallbox auszulesen
#OPENWB_CHARGECOUNTER_TOPIC='openWB/lp/1/kWhCounter' #Topic, um den Ladezähler auszulesen. Bei 1.9 in kWh, bei 2.0 in Wh!
#OPENWB_GETPLUGSTATE_TOPIC='openWB/lp/1/boolPlugStat' #Topic, um den Steckerzustand auszulesen.
#OPENWB_FACTORCOUNTER=1 #Faktor, um von der Einheit des Zählers (in 1.9 sind es kWh) auf kWh umzurechnen

"""
WiCAN
"""
WICAN_NAME= 'eup'   # Eindeutiger Name des WiCAN, beispielsweise der Name des Fahrzeugs. Definiert einen Zweig unter others/ im MQTT-Broker.

"""
Sonstiges
"""
# Zum Loglevel:
# CRITICAL - momentan nur Versionsausgabe bei Start
# ERROR - Fehler
# WARNING - nur Dinge, die auffällig sind und wichtiger
# INFO - Überblick, was gerade so passiert
# DEBUG - Zur Entwicklung.
LOGLEVEL = 'INFO'
# In das Chargelog werden die Daten der Ladevorgänge geschrieben: Start-SOC, Kilometerstand, Energiemenge, End-SOC laut Wallbox
CHARGELOG_PATH = '/home/pi/soc_helper/energydata.csv'

# Berechnungsfunktion des SOC aus der Antwort des Fahrzeugs.

# Die Antwortbytes des Fahrzeuges auf die SOC-Abfrage werden in einer Liste "bytes" mit n Elementen
# gesammelt. Das erste Element hat den Index 0 und beinhaltet die Sender-ID. Die Funktion rechnet aus
# den Bytes den SOC als Ganzzahl aus und gibt ihn zurück.
# Das Ergebnis muß für die OpenWB-SW 1.9 eine Ganzzahl sein, die Software 2.x kann Nachkommastellen.

def getSoc(bytes):
    """
    Berechnen eines SOC aus den übergebenen Bytes. In der Regel entspricht der Rückgabewert des Batteriesteuergerätes dem echten
    SOC des Akkus. Die Anzeige zeigt aber schon früher 100% (z.B. bei echten 96%) und 0% (z.B. bei echten 4%). Es sollte der
    angezeigte Wert zurückgegeben werden, da sonst z.B. bei 96% echtem SOC die Ladungs seitens des Autos beendet wird.
    Des weiteren kann zumindest bei VW ein Wert größer umgerechneten 100% auf einen Fehler oder fehlende Bereitschaft des ange-
    fragten Steuergerätes deuten.
    """
    soc = round(bytes[4]/2.5*51/46-6.4)      # VW e-up [2029, 98, 2, 140, aa, xx, xx, xx, xx]. SOC=aa/2.5, Umrechung auf Anzeigewert
    #soc = round((bytes[4]/2.5-8)/0.88)       # e-Golf [2029, 98, 2, 140, aa, xx, xx, xx, xx]. SOC=aa/2.5, Umrechung auf Anzeigewert
    #soc = round((bytes[4]*256+bytes[5])/10)  # Ora Funky Cat [1995, 98, 3, 8, aa, bb, xx, xx]. SOC ist (aa*256+bb)/10
    #soc = round((bytes[4]/2.5*51/46-6.4)     # VW MEB [0x17FE007B, 98, 2, 140, aa, xx, xx, xx]. SOC ist aa/2.5, Umrechnung auf Anzeigewert
    #soc = round((bytes[6]/2.55)              # Fiat 500e [0x18DAF144, 98, 160, 16, xx, xx, aa, xx, xx, xx, ...]. SOC ist aa/2.55

    #ungültige Werte werden in soc_helper.py abgefangen und gelogged.
    return soc
    
# Funktionen für die Kilometerstand-Berechnung

# Die Antwortbytes des Fahrzeuges auf die km-Abfrage werden in einer Liste "bytes" mit n Elementen
# gesammelt. Das erste Element hat den Index 0 und beinhaltet die Sender-ID. Die Funktion rechnet
# aus den Bytes den Kilometerstand als Ganzzahl aus und gibt ihn zurück.

def getOdo(bytes):
    odo=bytes[5]*65536+bytes[6]*256+bytes[7]         # VW e-up. [2029, 98, 2, 189, xx, bb, cc, dd, xx, xx, xx, xx, xx, xx]
    #odo=bytes[5]*65536+bytes[6]*256+bytes[7]         # VW e-Golf, ungetestet. [2029, 98, 2, 189, xx, bb, cc, dd, xx, xx, xx, xx, xx, xx]
    #odo = bytes[4]*65536+bytes[5]*256+bytes[6]       # Ora Funky Cat. [1995, 98, 208, 4, aa, bb, cc, xx]
    #odo = bytes[4]*65536+bytes[5]*256+bytes[6]       # VW MEB. [0x17FE0076, 98, 41, 90, aa, bb, cc, xx]
    #odo = (bytes[4]*65536+bytes[5]*256+bytes[6])/10  # Fiat 500e [0x18DAF142, 98, 32, 1, aa, bb, cc, xx]
    return odo
Der Aufruf auf dem pi funktioniert jedoch nicht wie in Deiner Doku mit "./soc_helper" sondern ich musste "python3" voranstellen. Dann erhalte ich allerdings eine Fehlermeldung, die ich angehängt habe.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Fr Jun 07, 2024 12:44 pm
von wb-2020
Nachtrag: Ich habe die soc-helper Version vom 28.05. verwendet.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Fr Jun 07, 2024 12:47 pm
von zut
Erstmal zum Start von soc_helper:

Welche Distribution hast du?

Welche python-Version? (Kommando python3 -v) - die Zuweisung in einer if-Bedingung mit := funktioniert mit python ab Version 3.8 vom Oktober 2019 (https://www.digitalocean.com/community/ ... -in-python)

Wo liegt dein python3 (Kommando which python3)

Der Fehler vom Aufruf mag daher stammen, daß als Interpreter in der ersten Zeile von soc_helper.py

Code: Alles auswählen

#!/usr/bin/env python3
steht und die Datei /usr/bin/env nicht vorhanden ist. Gib mal which env ein.

(Dazu auch: https://unix.stackexchange.com/question ... name-as-my - möglicherweise muß ich die erste Zeile mal ändern in #!//usr/bin/python3, aber das setzt voraus, daß für jenden python3 genau dort installiert ist)

Bitte alle Ausgabe hier posten.

Re: Projekt: SOC von OBD2-Buchse in die Wallbox (ohne Cloud)

Verfasst: Fr Jun 07, 2024 12:59 pm
von wb-2020
Danke für die schnelle Rückmeldung!
Die Python-Version ist 3.7.3

Dann ist das Problem vermutlich gefunden. Ich werde dann eine neuere Version installieren. Nehme ich einfach die neueste Version oder gezielt nur die 3.8, weil es ist ein älterer pi ist. Du merkst, ich bin da relativ ahnungslos ...

Bei "which env" erhalte ich: /usr/bin/env
Und bei "which python3": /usr/bin/python3