Bluetooth BMS auslesen Daly, JBD, Ective,renogy,jk und mehr

Moin zusammen,

ich habe mal etwas gebaut, das bei mir sehr zuverlässig läuft. Ich habe dafür das Projekt batmon-ha auf GitHub angepasst und einen Flow erstellt, der alle Daten an die entsprechenden Stellen für das VanPi OS schreibt.

Getestet habe ich verschiedene BMS von JBD, Daly, JK und TDT. Für mein DALY 4s (12V) BMS musste ich den Typ daly_ble verwenden, der ganz neu im GitHub-Projekt ist. Das ist das erste Skript, das endlich auch 4s-Daly-BMS korrekt ausliest. Bei 6s oder mehr war es bisher nie ein Problem, die Daten auszulesen – verschiedene Skripte hatte ich ausprobiert.

Leider liefert das Skript nicht immer exakt die gleichen Werte. Manchmal muss nur das Vorzeichen beim Laden bzw. Entladen angepasst werden – dafür ist aber bereits eine Bsp. in der Function hinterlegt.

Die Daten werden in der App, auf dem Display und im Webinterface angezeigt. Ihr könnt den Flow einfach importieren und dann das Inject auslösen, um die Installation zu starten. Anschließend nur noch in der Function die MAC-Adresse und den BMS-Typ eintragen – zum Test einmal Starten.

Es kann manchmal etwas dauern, bis die Daten kommen, da das Skript je nach BMS-Typ unterschiedliche Anfragen ausprobiert. Sobald es einmal korrekte Daten erhält, werden diese mehr oder weniger sekündlich aktualisiert (BMS-abhängig).

Wenn alles im Test läuft, könnt ihr das Skript über das Webinterface (Frontend) aktivieren:
Devices → BMS → BleBMS Userflow


Im Backend habe ich das Wichtiges beschrieben:

Wenn das Skript über das Webinterface aktiv geschaltet wird, wird auch ein BLE-Neustart berücksichtigt. Folgendes Verhalten ist implementiert:

  • Wenn über 2 Minuten keine Daten eingehen, werden BLE und das Skript neu gestartet.

  • Bei mehr als 3 Minuten ohne Daten werden die Werte auf 0 gesetzt.

  • Bei über 10 Minuten ohne Daten wird die BMS Info im Webinterface ausgeblendet.

  • Nach 20 Minuten erfolgt automatisch der System-Bluetooth-Neustart vom VanPI OS, wodurch auch das Skript wieder gestartet wird.

  • Sobald dann wieder Daten empfangen werden, wird die BMS Info erneut eingeblendet.

Diese Logik ist bewusst so umgesetzt, weil es BMS gibt, die bei keinem Stromfluss Bluetooth abschalten und somit zunächst nicht erreichbar sind. Dadurch würde sonst ein dauerhafter BLE-Neustart alle 2 Minuten stattfinden.

Das Skript kann außerdem mehrere BMS auslesen. Es kann eine Gruppe erstellt werden, sodass das System die Daten als eine Batterie bereitstellen kann.
Genau infos aus dem Github Projekt entnehmen, ist aber selbst erklärend. Wichtig ist nur das dann der Alias Name in die Gruppe wandert

BleBMS.json (21,2 KB)

Hier noch die Liste welche BMS mit v1.9 alles unterstützt werden:
jk JK BMS / jikong with JK02 protocol
daly, daly2, daly_ble Daly BMS
jbd JBD / Jiabaida/ Xiaoxiang / Overkill Solar BMS
ant ANT BMS
cbtpwr CBT Power / Creabest BMS
seplos, seplos_v2 Seplos BMS
supervolt Supervolt BMS supervolt
sok SOK BMS
tianpwr Tian-Power BMS
litime LiTime BMS
tdt
ej
abc
dpwrcore
ecoworthy
ective
felicity
ogt
redodo
roypow
braunpwr
neey
pro
renogy, renogy_pro

Es kann sein, das je nach Hersteller mehrere Skript/Typen aus wählbar sind, hier muss man Test welche funktioniert.

Gruß Wulle

5 Likes

Moin Wulle

Hatte auch schon nach einer “Universellen” Lösung gesucht ich werde gleich mal testen.

Wie wählt ma dort denn die Gruppierung aus ? Hätte 2 Ective und 2 LiTime hier rumstehen.

Steht in dem Github.

Du musst nur das Alias von der Gruppe auf “blebms” stellen, damit die Endpunkte passen.
Und den Alias der ersten Batterie ändern, damit diese nicht auch blebms heißt. Den Namen dann in der Gruppe anpassen.

Gruß Wulle

@WulleOnTour Danke! :slight_smile:

Prima Einbindung von …

Hat etwas gedauert - funktioniert! :heart_eyes:

Grüße Kai

Zunächst mal herzlichen Dank an Wulle für die Bereitstellung dieses Flows.

Ich habe das Python Programm zunächst auf der Konsole gestartet. Grundsätzlich funktioniert alles. Meine Supervolt Akkus werden gefunden und ausgelesen. Mich wundert aber, dass das Programm extrem viele Exceptions wirft. Hier mal ein Auszug:

14:19:03 INFO \[main\] Batmon ver 1.92, aiobmsble ver , Bleak ver 2.0.0, BtBackend ver bluez-v5.66
14:19:03 INFO \[main\] connecting mqtt @127.0.0.1:1883
14:19:03 INFO \[main\] Fetching 2 BMS + 1 virtual + 0 others serially, period=1.00s, keep_alive=True
14:19:03 ERROR \[scan\] (<class ‘bleak.exc.BleakDBusError’>, BleakDBusError(‘org.bluez.Error.InProgress’, ‘Operation already in progress’), <traceback object at 0x7ffee2aa8f40>)
Traceback (most recent call last):
File “/home/pi/batmon-ha/bmslib/scan.py”, line 35, in get_shared_scanner
await sc.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/**init**.py”, line 179, in start
await self.\_backend.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/scanner.py”, line 139, in start
self.\_stop = await manager.active_scan(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/manager.py”, line 478, in active_scan
assert_reply(reply)
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/utils.py”, line 27, in assert_reply
raise BleakDBusError(reply.error_name, reply.body)
bleak.exc.BleakDBusError: \[org.bluez.Error.InProgress\] Operation already in progress

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/home/pi/batmon-ha/bmslib/scan.py”, line 77, in resolve_address
sc = await get_shared_scanner(adapter) # TODO try..catch
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/bmslib/scan.py”, line 38, in get_shared_scanner
await sc.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/**init**.py”, line 179, in start
await self.\_backend.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/scanner.py”, line 139, in start
self.\_stop = await manager.active_scan(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/manager.py”, line 478, in active_scan
assert_reply(reply)
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/utils.py”, line 27, in assert_reply
raise BleakDBusError(reply.error_name, reply.body)
bleak.exc.BleakDBusError: \[org.bluez.Error.InProgress\] Operation already in progress
14:19:03 WARNING \[bt\] blebms1: device 84:28:08:A3:16:0C not discovered from adapter ‘default’, trying to connect anyway
14:19:03 ERROR \[sampling\] blebms1 error (#1): \[org.bluez.Error.InProgress\] Operation already in progress
Traceback (most recent call last):
File “/home/pi/batmon-ha/bmslib/scan.py”, line 35, in get_shared_scanner
await sc.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/**init**.py”, line 179, in start
await self.\_backend.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/scanner.py”, line 139, in start
self.\_stop = await manager.active_scan(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/manager.py”, line 478, in active_scan
assert_reply(reply)
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/utils.py”, line 27, in assert_reply
raise BleakDBusError(reply.error_name, reply.body)
bleak.exc.BleakDBusError: \[org.bluez.Error.InProgress\] Operation already in progress

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/home/pi/batmon-ha/bmslib/sampling.py”, line 155, in **call**
s = await self.\_sample_inner()
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/bmslib/sampling.py”, line 231, in \_sample_inner
async with bms:
File “/home/pi/batmon-ha/bmslib/bt.py”, line 449, in **aenter**
await self.connect()
File “/home/pi/batmon-ha/bmslib/models/supervolt.py”, line 80, in connect
await super().connect(\*\*kwargs)
File “/home/pi/batmon-ha/bmslib/bt.py”, line 345, in connect
await self.\_connect_client(timeout=timeout)
File “/home/pi/batmon-ha/bmslib/bt.py”, line 283, in \_connect_client
await (await get_shared_scanner(self.\_adapter)).stop()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/bmslib/scan.py”, line 38, in get_shared_scanner
await sc.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/**init**.py”, line 179, in start
await self.\_backend.start()
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/scanner.py”, line 139, in start
self.\_stop = await manager.active_scan(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/manager.py”, line 478, in active_scan
assert_reply(reply)
File “/home/pi/batmon-ha/venv/lib/python3.11/site-packages/bleak/backends/bluezdbus/utils.py”, line 27, in assert_reply
raise BleakDBusError(reply.error_name, reply.body)
bleak.exc.BleakDBusError: \[org.bluez.Error.InProgress\] Operation already in progress
^C^C^C^C^C14:19:05 INFO \[main\] Disconnecting SuperVoltBt(84:28:08:A3:16:0C,blebms1)
14:19:05 INFO \[main\] Disconnecting SuperVoltBt(84:28:08:A3:16:1A,blebms2)
14:19:05 INFO \[main\] Disconnecting VirtualGroupBms(blebms,\[blebms1,blebms2\])

Auslöser scheint dieser Fehler zu sein:

bleak.exc.BleakDBusError: \[org.bluez.Error.InProgress\] Operation already in progress

Treten diese Fehler bei Euch auch auf?