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)

EDIT: Neue Version
BLEBMS v2.json (21.6 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?

@abcklaus ich kann das hier von meiner Seite aus auch bestätigen.
Es scheint so als würden sich die Bluetooth-Abfragen gegenseitig ins Gehege kommen.

Problem: Mehrere BLE-Prozesse starten nach hartem Neustart gleichzeitig → BlueZ-Konflikt
Lösung: onceDelay im Inject-Node auf 30 Sekunden setzen, damit die BLE-Prozesse nacheinander starten

So zumindest bei mir - nun scheint es wieder zu gehen.

Hallo Wulle

Ich stehe leider was Node red betrifft noch IT technisch am unteren Ende der Nahrungskette, sozusagen IT Plankton.

Ich habe auch das 4S Daly BMS mit BT und würde das gene mit einbinden (Core pro).

Ich habe es nun geschafft den Flow zu importieren und in den core zu laden.

“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.”

Kannst du bitte nochmal (Node red für Dummies) sagen, wie löse ich ein Inject aus? Wo und wie genau trage ich die MAC Adresse und den BMS Typ ein?

Wir können das auch gerne per Mail machen. Ich denke der Rest hier ist nicht so doof wie ich, dann brauchen wir das hier nicht so zu zu müllen.

Grüße

Dirk

1 Like

Dafür ist das Forum ja da, hier ist sicher der ein oder andere “Stiller Mitleser” der das gleiche Problem hat. Gerade neue Forum Mitglieder haben die Probleme mit Node Red.

Ich kenne das Programm von Wulle nicht, aber irgendwo auf der linken Seite ist eine blaue Node da ist links eine Fläche dran, wenn du da drauf klickst hast du die Inject Node ausgelöst. Keine Angst, einfach machen. Zur Not eine SD-Karte klonen bevor du anfängst.

Ich mache immer wieder mal ein image von meiner Karte, dann habe ich den letzten oder vorletzten Stand, dann ist ein Absturz nicht so schlimm :wink:

Gruß Arno

Moin Dirk

ich hatte das Bild ganz oben zu spät gesehen, sieht aber sehr gut beschrieben aus.

Oben Install anklicken, und unten BMS typ und MAC eintragen

1 Like

Hallo Arno

Ich bin bzw. war nun ein Stück weiter.

Ich habe die 12 Stellig MAC Adresse, welche auf dem Daly BT steht eingetragen und bei BMS Type daly_ble. Dann denn Inject mit deinem Kringel gedrückt. Employ wurde nochmal rot - habe ich auch nochmal gemacht.

Im UI Info Reiter war dann kurzfristig das BMS Info zu sehen allerdings ohne Werte. Ich habe dann nochmal ein wenig rumgeklickt und nachdem ich das nächste mal das Info Feld geöffnet hatte war die Anzeige BMS Info auch wieder verschwunden.

Woran kann da jetzt liegen?

Grüße

Dirk

Hallo Dirk

Wie gesagt ich kenne das Programm nicht, ich habe auch kein Dali bms.

Aber so was ich gelesen habe hast du alles richtig gemacht

Wenn du die Leute mit z.B. @WulleOnTour ansprichst, dann bekommen die ne Mail und antworten schneller.

Gruß Arno

@WulleOnTour

Hallo Wulle

Ich bin bzw. war nun ein Stück weiter.

Ich habe die 12 Stellig MAC Adresse, welche auf dem Daly BT steht eingetragen und bei BMS Type daly_ble. Dann denn Inject mit deinem Kringel gedrückt. Employ wurde nochmal rot - habe ich auch nochmal gemacht.

Im UI Info Reiter war dann kurzfristig das BMS Info zu sehen allerdings ohne Werte. Ich habe dann nochmal ein wenig rumgeklickt und nachdem ich das nächste mal das Info Feld geöffnet hatte war die Anzeige BMS Info auch wieder verschwunden.

Woran kann da jetzt liegen?

Grüße

Dirk

@WulleOnTour

Eine Rückmeldung.

Ich habe beobachtet, dass wenn ich bei Install den inject auslöse erscheint darunter ein kleines blaues Kästchen mit einer 6 stelligen Zahl, die nach wenigen Sekunden rot wird mit der Meldung error 128 - also irgendein Fehler.

Was könnte nun der Fehler sein?

Bei update direkt darunter erscheint error 1.

Viele Grüße

Dirk

Moin Dirk

ich habe mir den Flow mal importiert, zusätzlich habe ich hinter der EXEC Node (das orange ding hinter Insstall ) noch eine Dibug node gehängt. und dann auf Install gedrückt. hier diue Ausgabe

Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bleak==2.0.0
  Downloading https://www.piwheels.org/simple/bleak/bleak-2.0.0-py3-none-any.whl (139 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 140.0/140.0 kB 157.6 kB/s eta 0:00:00
Collecting paho-mqtt==2.1.0
  Downloading https://www.piwheels.org/simple/paho-mqtt/paho_mqtt-2.1.0-py3-none-any.whl (67 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 67.2/67.2 kB 38.9 kB/s eta 0:00:00
Collecting backoff
  Downloading https://www.piwheels.org/simple/backoff/backoff-2.2.1-py3-none-any.whl (15 kB)
Collecting crcmod
  Downloading crcmod-1.7.tar.gz (89 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.7/89.7 kB 1.1 MB/s eta 0:00:00
  Preparing metadata (setup.py): started
  Preparing metadata (setup.py): finished with status 'done'
Collecting pyserial
  Downloading https://www.piwheels.org/simple/pyserial/pyserial-3.5-py2.py3-none-any.whl (90 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.6/90...


danach auf update geklickt, dann kommt das

21.1.2026, 19:39:54node: BleBMS_Update ausgabemsg.payload : string[20]
"Already up to date.↵"

Um die Texte in der Debug Ausgabe zu sehen, musst du bei dem Debug einmal auf die Schaltfläche klicken dazu brauchst du auch nicht auf deploy zu drücken,mit Strg+z bekommst du den blauen Punkt auch wieder weg.

Wenn du oben auch eine debug anhängen möchtest, kannst du den unteren kopieren Text ändern, oder du nimmst dir einen aus der linken Node Spalte.

wenn du auf Update klickst und da unten “Already up to date.“ steht, sollte das Programm auf jeden fall schon mal drauf sein.

  1. blöde Frage, hast du internet ???
  2. verbietet deine Firewall Zugriff auf Github???

Testen kann ich nix, hab nix :wink:

Gruß Arno

Hallo Arno

Wenn ich das also richtig verstehe wir bei install von der github Seite erstmal die entsprechenden Dateien runtergeladen und installiert.

Der Core ist in meinem Sprinter eingebaut. Er ist mit meinem Teltonikarouter verbunden. Ich weiß aber noch nicht, ob er er sich automatisch über den RUT955 mit dem Internet verbindet. Ich habe zunächst mal alle Schalter etc. angeschlosssen. Außerdem habe ich die LTE Bridge am laufen - aber das ist ja eben kein Router.

Ich sitze halt in der Kälte mit meinem ipad mit 5G und versuche das eben zum laufen zu bringen.

Blööde Frage: Braucht der Core dann eine eigene Internetverbindung oder lädt er, wenn ich auf install drücke über mein ipad mit 5 G die Dateien runter? Das ipad hat definitiv Internet.

Vielen Dank für deine Hilfe

Dirk

Nachtrag:

Weil als ich vor 3 Wochen ein update gemachte habe (über die updatefunktion in der UI) wurde alles über das Ipad in den Core geladen. von daher bin ich davon ausgegangen, das der Core mit dem Internet verbunden ist.

Normalerweise sollte dein Core wenn er mit dem RUT955 verbunden ist Internet haben, ich habe den gleichen Router, Relayboard via Kabel am RUT955.

Hab das aber mit meinem Testsystem getestet, im warmen Büro :wink:

Nochmal Nachtrag:

Ich habe ja noch meinen alten Core hier auf dem Schreibtisch liegen.

Strom angeschlossen, per WLAN meinem IMAC mit dem Core verbunden, den Flow geladen, BMS und MAC Adresse eingetragen. Inject. Genau das gleiche. Kurz kommt der Blaue Punkt und dann Error 128.

Dan habe ich den Core mit einem Kabel ins Netzwerk angeschlossen. Ein wenig gewartet, das gleich nochmal. Wieder blauer Punkt und irgendwann ist er ohne Error verschwunden. ich habe nun aber leider kein BMS hier rumliegen. Daher wird auch nichts angezeigt

Das verstehe ich nun nicht. Scheinbar muss ich den Corepro im Sprinter beibringen, das er sich über den Router Internet holt.

Warum werden aber dann bei dem Update die Daten über das Ipad geladen???

Grüße

DIrk

Hallo arno

Wie kann ich feststellen, ob der Core Internet über den Rut955 hat?

Grüße

Dirk

Wie hast du den verbunden, wifi oder Kabel??

Du kannst im Router nachschauen welche Geräte verbunden sind.

Ich habe den pi und Router mit Kabel verbunden, und wif ist im AP Modus