Diskussion, Hilfe und Weiterentwicklung zum vorgestellten IR/SOH Tool
https://github.com/Akkudoktor-EOS/OBDJuicIR
Ich selbst kann leider nur sehr eingeschränkt weiterentwickeln und bin daher auf eure Mithilfe angewiesen.
Viele Grüße
Andreas
Hallo,
ich habe ein paar Änderungen zur installation der Python-Abhängigkeiten ergänzt. Siehe Pull-Request bei Github.
In einem weiteren Beitrag hier im Forum wird auch schon nach Möglichkeiten gefragt, wie man andere Daten in das Skript importiert kann. Sobald dort Daten von Nutzern vorliegen könnte man einen Importer erstellen, der die Daten entsprechen aufbereitet.
Etwas Zeit daran mitzuwirken könnte ich aufbringen.
...bin daher auf eure Mithilfe angewiesen.Ich werde in absehbarer Zeit gerne testen und ggf. Fixes / Verbesserungen beitragen.
Danke euch und die Ideen klingen sehr gut👍
Richtig geil wäre auch eine Erfahrung/Testdatenbank. Dann könnte man die Ergebnisse besser beurteilen.
Viele Grüße
Andreas
Ah, hier geht es weiter. HIer bin ich ja im richtigen Faden. Ich kann Euch gerne die Daten vom 82kWh Akku 96S3P der MEB Plattform (ID.3, ID.4, Enyaq) zur Verfügung stellen inklusive einer umfangreichen Testfahrt von 100% auf, ich glaube 6% inkl. einmal kurzes Zwischenladen. Ich hatte vor 2 Wochen nämlich die gleiche Idee mal den Innenwiderstand zu berechen. Meine Aufzeichnung lässt sich in den Python Scripten aber nicht verarbeiten, auch wenn Pandas funktioniert (Die Pre-Requisites von @Fortrieb haben funktioniert). Ich habe dann noch die PIDs im Programm auf die Namen meiner Datei angepasst, aber an irgendetwas scheitert es. Evtl. Sonderzeichen oder so.
Die MEB Plattform hat sicher eine gewisse Bedeutung. Nur kann kann ich hier nichts hochladen.
Hallo zusammen,
habe heute aus meinem Kona die Daten ausgelesen, die sehen leider etwas anders aus. Könnt ihr mir sagen, wie ihr die Daten aufgezeichnet habt und mit was für einem Endgerät und Dongle?
Mein Setup: Hyundai Kona 2021 FL 39.2 kWh, Car Scanner (free, nicht pro), Android 14, OBDLink CX
Ich gehe im Hauptmenü oben rechts auf "Sensoren" und er fängt sofort mit dem Logging an, es wird aber je Datenpunkt eine Zeile geschrieben, ähnlich wie eine plain data db:
(habe die Daten entfernt, das zerschießt meinen Beitrag, hier ein Beispiel, wie meine PIDs heißen:
[BMS] Battery Current
[BMS] CALC Average Battery Module Temperature
[BMS] State of Health)
Ich vermute, ihr geht über die Live Daten oder das Dashboard?
Bereite die jetzt mal schnell händisch auf, damit ich das testen kann. Allerdings habe ich noch Probleme bei der Zellenrecherche ... es gibt seltsamerweise nur sehr spärliche Daten über den Akku...
Melde mich gleich mit aufbereiteten Daten!
Edit: Anbei die aufbereiteten Daten, ich gehe jetzt auf Jagd nach den Akku / Zellen Daten. Da das BMS auch die Einzelzellspannungen ausgibt, gehe ich von 90 Zellen in Reihe aus. Allerdings ergab meine Recherche bisher 88s2p als Konfiguration... sehr seltsam.
Jetzt lade ich hier mal meine Daten hoch. Es hat wirklich geklappt. Ich konnte das Tool nutzen und die Daten von meinem Auto auswerten.
Es handelt sich um einen Enyaq iV 80 aus der VW-MEB Plattform mit 82 kWh Akku von LG. Es ist der Akku mit weniger Leistung, soll heißen die Allradvarianten haben einen anderen Akku (CATL). Der Akku hat eine Bruttoenergie bei 96s3p basierend auf den Zellen von 82.44 kWh. Die Nettoenergie wird vom VW-Konzern mit 77 kWh angegeben. Wobei die Anzeige von 0 bis 100% nur 72 kWh aktiv nutzt. Das kann man sehr deutlich an den SoC Werten vom BMS (interner Wert) und der Anzeige sehen.
Mein km-Stand liegt bei fast 50.000 km nach 13 Monaten. Der SoH liegt bei ausgerechneten 98,8%. Das ist ein so extrem guter Wert, dass ich dies nochmal gesondert überprüfen muss. Das kann eigentlich kaum sein. Sei es drum, die Messfahrt waren 368 km über 4,75h. War eine elende Streckte auf der A1 zum Ferienstart in NRW mit echt viel Stau und auch etwas Standzeit bei Osnabrück. Zwischendrin habe ich kurz 20% nachgeladen. Ich bin mit 100% (Anzeige) und 95,6% (BMS) gestartet und 6% (Anzeige) und 11,2% (BMS) angekommen.
Da die MEB Plattform andere PID ausgiebt habe ich das Script angepasst. Ich habe es zusammen mit meinen Messdaten hier abgelegt. Beides gezippt, wegen Größe und Dateibeschränkung im Forum
Das Ergebnis ist dann meine "test_data.csv". Hier habe ich die Überschriften noch angepasst, damit das ir.py Skript läuft. Wegen Größe gezippt abgelegt
Wenn ich das dann durch den ir.py schicke (cell = 96 und shreshhold 1.48) dann kriege ich die netten Diagramme. Alle Innenwiderstände liegen übrigens unter dem Grenzwert.
Wenn ich etwas falsch gemacht habe, dann gerne kommentieren. Ansonsten bin ich erstmal zufrieden mit dem Ergebnis und bin extrem positiv von meinem Enyaq überrascht. Ich hatte deutlich schlechteres erwartet.
Danke an @drbacke. Andreas, Dein Tool ist echt Spitze. Vor allem die Datenbearbeitung mit Pandas. Hatte ich vorher nie genutzt (ich bin wahrscheinlich zu alt, um das zu kennen). Ich muss mich da mal etwas mehr einlesen.
Hallo zusammen,
ich habe meine Daten nun so aufbereitet, dass es funktioniert. Das ganze habe ich mit Hilfe eines python Skripts gemacht, bei dem ChatGPT tatkräftig unterstützt hat (95% O:) ).
Damit ist es nun möglich, in der Free Version vom Car Scanner oder irgend einem anderen Logger, der die Daten im gleichen Format schreibt, die Daten so aufzubereiten, dass diese in Andreas Tool "passen".
Dazu bin ich im Car Scanner auf "Sensoren" gegangen und habe dort unter Filter den Haken bei "Nur sichtbare Sensoren aktualisieren" entfernt. Damit hat er bei mir sofort das Logging begonnen. Wichtig ist, dass man beim Beenden des Loggings die Verbindung zum Dongle trennt, dann schreibt er wohl erst die Record-Datei.
Die CSV habe ich dann über Langdruck auf den Dateinamen in das CSV #1 Format exportiert und lege diese in den Ordner mit meinem python Skript. Beim ersten Mal solltet ihr nur einen Auszug aus dem recording nehmen, denn er scannt jetzt erst einmal nach Unique vorkommenden PIDs:
Jede gefundene PID bekommt anschließend eine Nummer und er fragt euch, welche Nummer die Bezeichner aus Andreas Tabellenkopf sind. Diese muss man leider händisch suchen und verknüpfen - das muss man aber nur einmal machen, dann hatte ich keinen Bock mehr, das jedes Mal einzugeben und Chat GPT hat die Teile in einer JSON gespeichert... Anschließend fragt er euch nach der Log-CSV vom Car Scanner:
Er legt dann zwei neue CSV im Verzeichnis ab: Einmal eine gefilterte Version eures Inputs und einmal die dormatgewandelte CSV, die wir für Andreas Skript brauchen. Feddisch ist
Soviel zum Log-Daten Wandeln / Erstellen mit der Freeware der Car Scanner Software. Leider habe ich immer noch keine Ahnung, wie mein Kona Akku aufgebaut ist :-/
Viele Grüße,
Andreas
Irgendwie ist hier ja nicht so richtig etwas los. Das IR/SOH Tool ist wohl doch für viele nicht so interessant oder vielleicht eher zu kompliziert? Schade eigentlich. Hätte gerne weiter dran gearbeitet.
Hallo zusammen,
ich kann auch ein paar Daten und Auswertungen beitragen. Folgende Eckdaten:
- Audi E-tron 55 Bj 2020 70tkm
- Zellen LG Chem E66A (leider konnte ich bisher kein Datenblatt mit IR finden)
- Verschaltung in Modulen zu 4p3s in Summe 108 Zellen in Reihe
Jetzt zu meinen Arbeitsannahmen, da ich kein passendes Datenblatt gefunden habe, habe ich versucht über "ähnliche" Zellen auf einen Innenwiderstand zu kommen. Was ich gefunden habe sind ca. 1mOhm, in meiner 4p Verschaltung ergibt ergibt sich somit 0,25mOhm auf Zellebene.
Die Fahrstrecke bei mir waren 80km wobei ich auf der Autobahn mehrmals voll beschleunigen konnte und somit hohe Stromwerte erreichen konnte (meine Meinung nach sind vor allen diese aussagekräftig). Werte ich die Plot "händisch" aus, d.h. schaue ich mir den Spannungseinbruch bei hohen Strömen an, errechnet sich ein recht passender Innenwiderstand zu den theoretischen 108*0,25mOhm = 27mOhm. Bei einen Strom von knapp 1000A beträgt der Spannungseinbruch ca. 30V was ca. 30mOhm entspricht.
Anbei die Plots vom Skript.
Leider habe ich immer noch keine Ahnung, wie mein Kona Akku aufgebaut ist :-/
Link entfernt
Hilft das vllt weiter?
Hallo,
ich würde das Tool auch gerne nutzen, da bei uns auch die Anschaffung eines gebrauchten EV ansteht. Es ist allerdings für mich zu kompliziert, ich brauche eure Hilfe.
Ich hab die neuste Version von Python installiert, bei Windows PowerShell "python -m venv venv" eingegeben, anschließend ".\venv\Scripts\activate.ps1" (Execution_Policies geändert) und nun wenn ich "pip install -r requirements.txt" eingebe, kommt "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'".
Also habe ich die requirements alle mit "pip install" installiert. Hat funktioniert.
Wenn ich nun " python .\ir.py --data_path="test_data.csv" --threshold=0.99 --cells=96" eingebe, kommt "C:\Users\ACDC\AppData\Local\Programs\Python\Python312\python.exe: can't open file 'C:\\Users\\ACDC\\ir.py': [Errno 2] No such file or directory".
Ich bin kein Informatiker und habe so etwas noch nie gemacht. Was mache ich falsch? Muss ich die Daten woanders abspeichern, dass das Programm die findet? Muss ich die umwandeln? Ich weiß nicht weiter...
Danke jetzt schon für eure Hilfe!!!
@stan161 Versuche mal den Pfad der Python Datei direkt anzugeben oder aus dem Ordner heraus starten. Am einfachsten: Im Windows Explorer zu dem Ordner navigieren, in dem die ir.py Datei liegt. Dann gibst du oben in der Adressleiste (wo "C:\Pfad\zum\Ordner" steht) einfach "cmd" ein, das öffnet die Konsole in diesem Ordner. Am besten dann noch deine CSV Datei in den gleichen Ordner kopieren und dann in der CMD folgendes eingeben:
python ir.py --data_path="test_data.csv" --threshold=0.99 --cells=96
Das sagt Python, dass in dem Ordner die ir.py ausgeführt werden soll, erwartet dann aber auch, dass die "test_data.csv" ebenfalls dort liegt.
@dadeppa Super, vielen Dank! Das hat geklappt!
Ich habe heute von einem bekannten einen e-Up! testgefahren und über OBD Werte gesammelt. Die Werte habe ich dann so wie die test_data von Andreas aufbereitet. Leider hat mir das Programm nur einen Fehler geschmissen. Irgendwann habe ich herausgefunden, dass das Programm mindestens rund 2600 Werte haben möchte. Also habe ich meine ca 800 Werte markiert und mit Excel in die länge gezogen. Jetzt spuckt er mir auch die ersten beiden Diagramme aus, aber leider nicht alle 5.... Das zeigt CMD an (steht unten in kursiv). Könnt ihr mir da weiterhelfen? Muss ich einfach eine längere Testfahrt machen, dass er vernünftige Werte bekommt?
Mit den test_data von Andreas hat es problemlos funktioniert, auch mit den aufbereitet_daten von DaDeppa.
Meine Daten füge ich mal mit bei.
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:127: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
load_data['Resting voltage'] = np.interp(load_data['Battery State of Charge'], soc_vs_resting_voltage.index, soc_vs_resting_voltage_smoothed)
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:128: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
load_data['Internal resistance'] = (load_data['Resting voltage'] - load_data['Battery voltage']) / load_data['Battery current']
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:129: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
load_data['Internal resistance (mOhm)'] = np.abs(load_data['Internal resistance']) / args.cells * 1000 # Umrechnung in mOhm und Normalisierung auf die Zellenzahl
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:130: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
load_data['Internal resistance (mOhm)'] -=cable_bms_ir
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:134: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
load_data['Discharge rate'] = np.abs(load_data['Battery current'])
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:136: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
load_data['Discharge rate bin'] = discharge_rate_bins
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:139: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
probabilities = load_data.groupby('Discharge rate bin')['Internal resistance (mOhm)'].apply(lambda x: np.sum(x < threshold) / len(x))
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:139: RuntimeWarning: invalid value encountered in scalar divide
probabilities = load_data.groupby('Discharge rate bin')['Internal resistance (mOhm)'].apply(lambda x: np.sum(x < threshold) / len(x))
C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py:156: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
for name, group in load_data.groupby('Discharge rate bin'):
Traceback (most recent call last):
File "C:\Users\ACDC\Downloads\OBDJuicIR-main\ir.py", line 159, in <module>
threshold_value = sorted_resistances[threshold_index]
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
IndexError: index 0 is out of bounds for axis 0 with size 0
Irgendwie ist hier ja nicht so richtig etwas los. Das IR/SOH Tool ist wohl doch für viele nicht so interessant oder vielleicht eher zu kompliziert? Schade eigentlich. Hätte gerne weiter dran gearbeitet.
Ich bin an der Entwicklung weiterhin interessiert, nur stehen mir dafür nur einige Stunden im Monat zur Verfügung. Bin aktuell dabei den Quellcode etwas besser zu strukturieren, so dass die Weiterentwicklung einfacher wird.