JKBMS auslesen über BLE (Bluetooth) oder RS485 Adapter mittels EPS, ioBroker

Hey,

ich weiß, dass das Problem bereits mehrfach beschrieben wurde.
Also, ich betreibe einen ESP32 mit der aktuellen Version 3.6. Dieser sendet die MQTT Protokolle brav an meinen MQTT Server (Docker auf Unraid) von welchem mein Homeassistant die Werte abruft.
Ich hab mir in Homeassistant eine schöne Übersicht gebastelt, worin ich alle relevanten Werte sehen kann. So schön so gut.

Aber, der ESP32 läuft maximal 2 Tage, dann steigt er aus.

Heißt, keine LED auf diesem blinkt mehr. Nur ein Stromlosschalten erweckt ihn wieder zum Leben. Ich habe ihn jetzt per Shelly angeschlossen um nicht immer in den Keller zu müssen oder von Unterwegs neu starten zu können.
Wie lange rennt er bei euch? Sollte ich auf ne andere Version downgraden, welche evtl. stabiler läuft?

Danke für eine evtl. Hilfe

Grüße

Thomas

Das Problem hat Scotty89 schon am 10. Juli gemeldet. Ich verzichte inzwischen auf den CAN-BUS und gebe ein JSON-File als Webserver auf dem ESP32 aus. Auf dem Raspberry läuft dann eine “Batterie” die das JSON File über WLAN ausliest und damit das BMS bekannt macht und den Ladevorgang steuert. Dort manage ich dann auch die Ladeströme und Spannung in Abhängigkeit vom SoC.
Ah danke. Das hatte ich überlesen. Bzw eim ersten Mal Komplettlesen des Threads noch ignoriert, da ich CAN-BUS noch nicht im Visier hatte.
Kannst du zu deinem Vorgehen zum Ladevorgang ein wenig präzesieren? Die Daten habe ich über BT alle in HomeAssistant vorliegen, kann sie also auch entsprechend umformen denke ich. Idealerweise würde ich die Ladelogik dem Multiplus gerne vorgeben, also mit wieviel Ampere er bei welchen Zellspannungen ent/laden soll etc. Ist sowas möglich?

Ich habe im Prinzip das Verfahren von dbus-serialbattery übernommen (bis auf ein paar kleine Änderungen. Ladestrom in Abhängigkeit vom SoC


if 98 < self.soc <= 100:
self.control_charge_current = 5
elif 95 < self.soc <= 98:
self.control_charge_current = self.max_charge_current/4
elif 91 < self.soc <= 95:
self.control_charge_current = self.max_charge_current/2
else:
self.control_charge_current = self.max_charge_current

Viele Grüße
Markus

Ich habe im Prinzip das Verfahren von dbus-serialbattery übernommen (bis auf ein paar kleine Änderungen. Ladestrom in Abhängigkeit vom SoC


if 98 < self.soc <= 100:
self.control_charge_current = 5
elif 95 < self.soc <= 98:
self.control_charge_current = self.max_charge_current/4
elif 91 < self.soc <= 95:
self.control_charge_current = self.max_charge_current/2
else:
self.control_charge_current = self.max_charge_current

Viele Grüße
Markus
Thx. War das jetzt die Antwort auf meinen Beitrag? Ist mir nämlich ein bisschen zu wenig, da ich nicht weiss wie hier was zusammenspielt.
Wo läuft da was genau? Ich hab auch keinen Raspberry. Meinst du das System wo venusos drauf läuft? Das ist bei mir ja direkt am Multiplus-GX.

Ok ist jetzt nicht so einfach. Es gibt den Treiber dbus serialbattery (https://github.com/Louisvdw/dbus-serialbattery) damit können verschiedene BMS (auch das JK BMS) über den RS485 Anschluss an den Cerbo/Raspberry angebunden werden. Nun gefällt mir der RS485 Anschluss nicht und einige hatten Probleme, allerdings war dies die Grundidee für meinen Treiber. Nun habe ich die Software aus diesem Thread benutzt und kein CAN Bus genommen sondern über den ESP32 ein JSON-File rausgeschrieben. Für mich gehört der ESP32 einfach zur Batterie. Er erweitert einfach die Kommunikationsschnittstellen des BMS. MQTT und JSON.
Auf der dem Cerbo/Raspberry läuft jetzt für mich die Steuersoftware (Basis serialbattery). Der „Treiber“ meldet sich als Batterie bei Victron an (https://github.com/victronenergy/venus/wiki/dbus#battery) und benutzt als Input das JSON file des ESP32. Aktuell wird dann auf Basis des SoCs der Lade/Entladestrom und die Spannung geregelt. (Den Teil habe ich dir rauskopiert um zu zeigen wie mein Ladestrom gesteuert wird). Allerdings hast du recht, ich will wenn ich mal Zeit habe auch die Zellspannungen berücksichtigen. Bei großen Differenzen könnte man ein langsames, vorsichtiges topbalancing machen, nachdem im Winter es vielleicht nie eine Vollladung gegeben hat. Aber dazu brauch ich mal Zeit. Hier 2 Bilder. Ich habe nur 8s Deswegen auch nur 8 Zellen. Ich hoffe das erklärt nun was ich gemacht habe und wie ich auf den CAN Bus verzichtet habe. Im Prinzip ist es jetzt völlig egal ob hinter dem JSON File ein JK, Daly oder sonst etwas steckt.

Ok ist jetzt nicht so einfach. Es gibt den Treiber dbus serialbattery (https://github.com/Louisvdw/dbus-serialbattery) damit können verschiedene BMS (auch das JK BMS) über den RS485 Anschluss an den Cerbo/Raspberry angebunden werden. Nun gefällt mir der RS485 Anschluss nicht und einige hatten Probleme, allerdings war dies die Grundidee für meinen Treiber. Nun habe ich die Software aus diesem Thread benutzt und kein CAN Bus genommen sondern über den ESP32 ein JSON-File rausgeschrieben. Für mich gehört der ESP32 einfach zur Batterie. Er erweitert einfach die Kommunikationsschnittstellen des BMS. MQTT und JSON.
Auf der dem Cerbo/Raspberry läuft jetzt für mich die Steuersoftware (Basis serialbattery). Der „Treiber“ meldet sich als Batterie bei Victron an (https://github.com/victronenergy/venus/wiki/dbus#battery) und benutzt als Input das JSON file des ESP32. Aktuell wird dann auf Basis des SoCs der Lade/Entladestrom und die Spannung geregelt. (Den Teil habe ich dir rauskopiert um zu zeigen wie mein Ladestrom gesteuert wird). Allerdings hast du recht, ich will wenn ich mal Zeit habe auch die Zellspannungen berücksichtigen. Bei großen Differenzen könnte man ein langsames, vorsichtiges topbalancing machen, nachdem im Winter es vielleicht nie eine Vollladung gegeben hat. Aber dazu brauch ich mal Zeit. Hier 2 Bilder. Ich habe nur 8s Deswegen auch nur 8 Zellen. Ich hoffe das erklärt nun was ich gemacht habe und wie ich auf den CAN Bus verzichtet habe. Im Prinzip ist es jetzt völlig egal ob hinter dem JSON File ein JK, Daly oder sonst etwas steckt.

Das klingt ziemlich genau nach dem was der ein oder andere hier sucht. Könntest du etwas genauer beschreiben wie du das installiert hast und eingerichtet? Dann könnte ich und bestimmt noch einige andere das nachmachen. Der ESP32 erhält ebenfalls via Bluetooth die Daten des BMS oder?

Gruß
Klas

@mascheihei tolle Lösung was du da beschreibst. Aber Ladestrom sinkt doch eh bei vollen Zellen von alleine ab. Außer man hat viele unterschiedliche Zellen (aus China??) im Pack drin. Dann würde ich aber wohl eher einen zusätzlichen Balacher mit möglichst hohem Strom dazu bringen um den Ausgleich schneller zu machen.
Übergang vom Winter zum Frühjahr, da sollten die Ströme auch erst mal nicht so stark ansteigen bis das Pack dann mal wieder voll ist. So viel zu meiner Überlegung dazu.

Übergang vom Winter zum Frühjahr, da sollten die Ströme auch erst mal nicht so stark ansteigen bis das Pack dann mal wieder voll ist. So viel zu meiner Überlegung dazu.
Du hast wahrscheinlich recht. Ich habe mir auch dazu noch keine Gedanken gemacht, aber du machst hier einen validen Punkt. Ich weiß sowieso nicht, ob diese Charge Current Control des BMS notwendig ist. Wenn ich das BMS nicht integriere und keine extremen Spannungen vorgebe, sinkt der Strom auch zuverlässig bei der Ladeendspannung ohne Probleme ab. Und mit ordentlichen Zellen passiert auch nichts. Wahrscheinlich macht es bei Entladen mehr Sinn.

Bisher ist quasi nur 1:1 die Lösung aus dbus serialbattery benutzt und die berücksichtigt für den charge current nur den SoC Level. Jetzt ist der SoC Level bei täglichem synchronisieren noch recht zuverlässig, aber über längere Zeit kein wirklicher Maßstab. Deswegen wollte ich eigentlich auch noch berücksichtigen ob eine Zelle wegläuft oder ähnliches. Halte ich zwar bisher noch nicht für so wahrscheinlich, aber es wäre so eine Art Sicherungsmaßnahme. Möchte verhindern, dass das BMS abschaltet. Aber wie gesagt noch keine Gedanken dazu gemacht und bin jetzt erstmal unterwegs und vielleicht bleibt es auch pure Theorie.

Damit das BMS nicht abschaltet, einfach die Werte beim Multiplus/Soyo entsprechend höher wählen wo er abschaltet. Entladestrom zu begrenzen, macht aus meiner Sicht auch wenig Sinn.
Da wäre es sicher sinnvoller wenn ab einem bestimmten SOC die max. abgegebene Leistung verringert wird, damit es ggf. länger hält, was aber auch egal ist, alle ist alle ob in 10min oder in 20min. Da aber dann das Netz eh einspringt, egal.

Moin,
Das ist ja mal ein ganz tolles Projekt :clap: . Inzwischen läuft es auch bei mir sehr, sehr gut. Ich habe allerdings eine Weile gesucht, welche Stellen im Code geändert werden müssen, um alle Zellenspannungen übermittelt zu bekommen. Bei meinen 48V-LTO-Block sind das 22 Zellen. Es werden aber normal "nur" 16 übertragen. Das reicht ja bei LiFePo's im Normalfall auch aus. Vielleicht ist es keine schlechte Idee die Zellenanzahl mit in den UserConfig-Bereich aufzunehmen. Oder generell auf die maximal mögliche Zellenanzahl eines JKBMS (24) einstellen.
Mit freundlichen Grüßen
Sascha

... Nun habe ich die Software aus diesem Thread benutzt und kein CAN Bus genommen sondern über den ESP32 ein JSON-File rausgeschrieben. Für mich gehört der ESP32 einfach zur Batterie. Er erweitert einfach die Kommunikationsschnittstellen des BMS. MQTT und JSON...
Danke. Hättest du dazu vielleicht den source code des ESP32? Würde das gerne mal ausprobieren. Wäre super.
Aber, der ESP32 läuft maximal 2 Tage, dann steigt er aus.
Das Problem habe ich auch. Weiss nicht warum, aber bei mir läuft es tlw nicht mal 24h ohne dass BT abbricht. Ich kann mich, wenn die Verbindung weg ist, über das Handy verbinden, daher meine Vermutung dass BT getrennt wurde.
Danke. Hättest du dazu vielleicht den source code des ESP32? Würde das gerne mal ausprobieren. Wäre super.
Bin gerade im Urlaub. Stelle ich zur Verfügung wenn ich wieder zurück bin. Ist aber auch noch im Testmodus. Während der Urlaubszeit habe ich es sicherheitshalber abgeschaltet.

Hallo und guten Abend.
Vielen Dank, @Scotty69 für dieses grandiose Tool. Ist mit einem NodeMCU (BLEClient V3.6.rar) per BLE mit dem JK-BMS (B2A20S20P) vebunden und sendet per MQTT ins WLAN. Ausgewertet wird per HomeAssistant und Grafana (InfluxDB), was bei den Werten auch bestens funktioniert.
Hätte dazu nur zwei Fragen:

1.) Ich habe mit mal die YAML für ESPHome angesehen und festgestellt, dass hier viel mehr Daten vom BMS abgerufen werden als über Arduino-Kompilation. HAbe ich was übersehen? Werte wie "min cell voltage" sind nur bei ESPHome verfügbar und weitere Unterschiede.

2.) Ich bekomme die Binary-Sensor zum ein-/ausschalten der Charge- und Discharge - Funktionen im BMS nicht zum laufen. Gibt es hierzu ein YAML-Beispiel für diese Schalter?

Vielen Dank schon mal.

Viele Grüße

Kann man per RS485 die gleichen Werte im BMS ändern wie per App?
Ich komme in meine Settings nicht mehr rein, weil mein geändertes Passwort nicht akzeptiert wird. Der Support von JKBMS.com ist tot, per Mail kommt auch nix.

Hallo,
ich habe jetzt die letzten zwei Tage den kompletten Thread durchgelesen. Erst einmal ein herzliches Dankeschön an Scotty89 und alle Helfer die mitgewirkt haben.
Gestern habe ich mich also auch daran gemacht die Version 3.6 auf einen ESP32 zu flashen. Dazu habe ich die Arduino-IDE 2.0 installiert.
Beim ersten Kompilierungsversuch hat die IDE nun aber Warnings bezüglich der Datei can.h ausgegeben. Diese sei veraltet und man solle doch bitte stattdessen die twai.h benutzen.
Gesagt, getan - Jetzt kamen jede Menge Fehler zurück aus der Victron_CAN.ino. Lange Rede kurzer Sinn, ich habe die Victron_CAN.ino jetzt so angepasst das sie mit der twai.h läuft.
Es kompiliert und ich kann es flashen. WLAN-Verbindung funktioniert. Wer diese Version also einmal Testen möchte kann sich gerne bei mir melden.
Ich kann es leider nicht, da ich zur Zeit noch keine PV-Anlage habe (kommt im April). 16 Zellen LiFePO4 habe ich in China bestellt (Gobelpower), die werden im November geliefert.
Außerdem habe ich noch ein Mason 20Ah DIY Kit (Gehäuse) bestellt.
Das einzige was ich bis jetzt habe ist ein JK-BMS Typ JK-B2A20S20P-H-C. Da ich dafür aber auch kein passendes Netzteil zur Zeit habe (ist im Zulauf) sind meine Testmöglichkeiten natürlich sehr eingeschränkt.
Trotzdem habe ich schon mal die Software auf den ESP32 geflashed und habe jetzt folgendes Problem: Ich habe HomeAssistant in meinem lokalen Netzt laufen und dort läuft auch der Mosquitto-Broker der auch einwandfrei funktioniert.
Zusätzlich läuft auch noch Zigbee2MQTT damit meine Zigbee Geräte sich mit dem Mosquitto-Broker unterhalten können.
Das Problem das ich habe ist, das ich keine Verbindung zum Mosquitto-Broker bekomme.
Vielleicht kann mir jemand helfen warum das nicht funktioniert.

Das ist was im Protokoll des Mosquitto Brokers ausgegeben wird.

2022-10-09 12:07:07: New connection from 192.168.178.32:57650 on port 1883.
2022-10-09 12:07:07: Client <unknown> disconnected, not authorised.
2022-10-09 12:07:12: New connection from 192.168.178.32:57651 on port 1883.
2022-10-09 12:07:12: Client <unknown> disconnected, not authorised.
2022-10-09 12:07:22: New connection from 192.168.178.32:57652 on port 1883.
2022-10-09 12:07:22: Client <unknown> disconnected, not authorised.
2022-10-09 12:07:28: New connection from 192.168.178.32:57653 on port 1883.
2022-10-09 12:07:28: Client <unknown> disconnected, not authorised.

Ich verstehe ja, das er den Client nicht kennt, aber wie sage ich dem Mosquitto-Broker in HomeAssistant das er den Client akzeptieren soll

Vielen dank im Voraus für eure Hilfe.

Gruß, PixelStorm

Ich stelle hier mal meine User-Settings aus der BLE_BMS_Connection.ino rein.

//OTA Setting
#define OTA_Hostname "JKBMS_ESP32" // -> hier ändern wenn OTA Name anders sein soll
#define OTA_Passwort "" // -> hier ändern wenn OTA Passwort anders sein soll
// MQTT Setting
const char* mqtt_server = "192.168.178.102"; // -> hier die IP des MQTT Server eingeben
const int mqtt_port = 1883; // -> hier den Port einstellen für den MQTT Server
const char* mqtt_username = "JKBMS-01"; // -> hier MQTT Benutzername eintragen
const char* mqtt_passwort = "Test1234"; // -> hier MQTT Passwort eingeben
String mqttname = "JKBMS_1_Watchdog"; // -> hier wird der MQTT Gerätename festgelegt
const int mqttpublishtime_offset = 1000; // -> hier einstellen wie oft Daten gesendet werden sollen. 1000 = jede Sekunde.
// CAN Settings
bool CAN_use = false; // -> true wenn ein CAN MOdul vorhanden und verwendet wird für die Pylontech simulation
const int CAN_Cylcetime = 1000;
//W-LAN Setting
const char* ssid = "Meine SSID";
const char* password = "Mein Passwort";
//BMS-BLE Settings
const char* Geraetename = "JK-B2A20S20P"; //JK-B2A20S20P JK-B2A24S15P
//########### Ende der "User" Settings #########

Vielen Dank an Scotty89 für die viele Arbeit. !!!! Ein Problem habe ich bei dem Er oder Ihr mir helfen könnt. Als ESP32 habe ich einen NMCU-ESP32 von Berrybase. Egal mit welcher Boardwahl ich es bei Arduino auch versuche, es geht nicht. Weder im Netz noch auf meinem MQTT Server erscheint das Board. ( Wlan, IP und Pin sind natürlich angepasst.) Flashen kann ich nicht mit der Einstellung NodeMCU-32s denn da meldet Arduino" Speicher zu klein", (keine Einstellung Partition möglich) also nehme ich das ESP-32DEV Board. Kann das die Ursache sein?
Für eure Hilfe Danke im voraus.
Gruß
Wolfgang

Vielen Dank an Scotty89 für die viele Arbeit. !!!! Ein Problem habe ich bei dem Er oder Ihr mir helfen könnt. Als ESP32 habe ich einen NMCU-ESP32 von Berrybase. Egal mit welcher Boardwahl ich es bei Arduino auch versuche, es geht nicht. Weder im Netz noch auf meinem MQTT Server erscheint das Board. ( Wlan, IP und Pin sind natürlich angepasst.) Flashen kann ich nicht mit der Einstellung NodeMCU-32s denn da meldet Arduino" Speicher zu klein", (keine Einstellung Partition möglich) also nehme ich das ESP-32DEV Board. Kann das die Ursache sein?
Für eure Hilfe Danke im voraus.
Gruß
Wolfgang
Hallo Wolfgang,
das ESP-32DEV Board habe ich auch genommen. Hast du auch das "Partition Scheme" im Menu Punkt "Tools" auf "Huge APP(3MB No OTA/!MB SPIFFS) eingestellt?
Ich benutze allerdings die Arduino-IDE 2.0. Für die ältere IDE hat Scotty89 die Einstellung hier gepostet: https://forum.drbacke.de/viewtopic.php?p=9682#p9682

Gruß, PixelStorm

Ja, das Board habe ich auch genommen weil ja nur da die Partitionseinstellung möglich ist. Das Board was ich habe ist aber ein NMCU-ESP32, und diese Wahl gibt es in der Arduino 2.0 IDE nicht.
Gruß
Wolfgang

Ja, das Board habe ich auch genommen weil ja nur da die Partitionseinstellung möglich ist. Das Board was ich habe ist aber ein NMCU-ESP32, und diese Wahl gibt es in der Arduino 2.0 IDE nicht.
Gruß
Wolfgang
Hallo Wolfgang,
sorry, da bin ich dann leider raus da ich nicht weiß was die NMCU-ESP32 bedeutet.
Ich hoffe jemand anderes kann dir mit dem Problem helfen.

Gruß, PixelStorm