Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Request] Support for JBD BMS #467

Closed
futzicomp opened this issue Sep 26, 2023 · 6 comments · Fixed by #1218
Closed

[Request] Support for JBD BMS #467

futzicomp opened this issue Sep 26, 2023 · 6 comments · Fixed by #1218
Labels
enhancement New feature or request

Comments

@futzicomp
Copy link

Is your feature request related to a problem? Please describe.

No response

Describe the solution you'd like

Über ein Support für die gebräuchlichen und weit verbreiteten JBD und Darly BMS würde ich mich sehr, sehr freuen!

D A N K E ! Tolles Projekt

Describe alternatives you've considered

No response

Additional context

No response

@futzicomp futzicomp added the enhancement New feature or request label Sep 26, 2023
@schlimmchen
Copy link
Member

Dann lass doch mal ein paar Links da: zu Produktseiten, zu Dokumentation, etc. Am besten auch Hinweise darauf, welches Protokoll die sprechen (vermutlich proprietär) und welches Medium die nutzen (RS232, RS485, UART, CAN, Bluetooth). Und am besten überlegst du dir gleich zusätzlich, wie du ein solches BMS für die Entwicklung zur Verfügung stellen kannst...

@futzicomp
Copy link
Author

futzicomp commented Sep 26, 2023

Hilft dir das hier weiter?
https://github.com/syssi/esphome-jbd-bms
Wenn du es wert findest, kann ich gerne ein günstiges Modell bestellen, mit ein paar alten Zellen bestücken und es dir schenken.

@schlimmchen
Copy link
Member

Hm, jaaaaa, also copy'n'paste ist es leider nicht, aber es gibt ein gutes Dokument https://github.com/syssi/esphome-jbd-bms/blob/main/docs/Jiabaida.communication.protocol.pdf und der Code kann im Zweifel helfen, Unklarheiten zu beseitigen.

Ist halt Fleißarbeit... Der Überbau (Web UI, Abstraktion) ist fertig seit dem Support für JK BMS, es wäre "nur" ein Controller für genau dieses BMS zu entwickeln, der sich da einfügt.

Wenn du es wert findest, kann ich gerne ein günstiges Modell bestellen

Es ist sehr gut, dass du dazu grundsätzlich bereit wärst, das erhöht die Chancen dramatisch, dass sich dem jemand annehmen möchte. Ich fänds auch durchaus sehr spannend, aber leider kann ich nicht absehen, dass ich mir die Zeit nehmen kann.

Ich kann gerne Tipps geben und beim Implementieren helfen. Das war mit @philippsandhaus in #452 sehr fruchtbar 😉

@futzicomp
Copy link
Author

Sorry, das was ihr da zusammenprogrammiert ist reine Magie für mich ( ich bin nur ein Elektrotechnik und Software Sympatisant) Du müsstest dich mit einem DAU rumschlagen. Das mag ich Dir nicht zumuten, da du verm. schon viel zu viel von deiner Freizeit opferst - Aber Danke für das Angebot. Ich such was bei Ali und schicke es dir oder deinen Mitstreiter wenn es angekommen und verdrahtet ist.

Viel Erfolg beim weiteren Verbessern! Wirklich tolles Projekt!

@Artikel14
Copy link

Artikel14 commented Jan 31, 2024

Habe mal begonnen etwas zum JBD BMS in C++ zu erstellen.
Zur Nutzung von Bluetooth auf dem ESP32 könnte man beispielsweise hierauf aufsetzen:

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

Das nachfolgende sind aus der JBD-Dokumentation
https://cdn.shopifycdn.net/s/files/1/0606/5199/5298/files/JDB_RS485-RS232-UART-Bluetooth-Communication_Protocol.pdf?v=1682577935
https://blog.ja-ke.tech/2020/02/07/ltt-power-bms-chinese-protocol.html
die sogenannten Bluetooth UUIDs für das JBD BMS: Diese Abschnitte definieren eindeutige Identifikatoren für die Bluetooth-Services und Charakteristika, die vom JBD BMS bereitgestellt werden.

(1 bis 3): SERVICE_UUID, WRITE_CHARACTERISTIC_UUID, READ_CHARACTERISTIC_UUID:
Jede dieser UUIDs erfüllt eine spezifische Rolle im Bluetooth-Protokoll. Der Service UUID identifiziert den Gesamtservice, während die Charakteristik-UUIDs die Lese- und Schreib-Funktionen innerhalb des Services repräsentieren.

// Bluetooth UUIDs für das JBD BMS
#define SERVICE_UUID "0000ff00-0000-1000-8000-00805f9b34fb"
#define WRITE_CHARACTERISTIC_UUID "0000ff02-0000-1000-8000-00805f9b34fb"
#define READ_CHARACTERISTIC_UUID "0000ff01-0000-1000-8000-00805f9b34fb"

(4 bis 5) Control MOS BMS UUIDs: Diese Abschnitte könnten auf einen speziellen Service und ein Charakteristikum im JBD BMS hinweisen, die mit der Steuerung von MOS-Elementen im BMS verbunden sind (wahrscheinlich die Schalter, um das Laden und das Entladen per Software auch über das BMS nochmal ein- und ausschalten zu können.

// Control MOS BMS UUIDs
#define CONTROL_MOS_SERVICE_UUID "0000ff00-0000-1000-8000-00805f9b34fb"
#define CONTROL_MOS_CHARACTERISTIC_UUID "0000e100-0000-1000-8000-00805f9b34fb"

Und wie nachfolgend kodiert könnte man sehr wahrscheinlich SoC, Gesamtspannung, Strom, Zyklenzahl und bei Bedarf noch mehr Echtzeit-Daten über Funk aus dem Akku-BMS auslesen:

BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(BLEUUID(SERVICE_UUID))) {
BLEDevice::getScan()->stop();
advertisedDevice.getScan()->getScan()->clearResults();
BLEClient* pClient = BLEDevice::createClient();
pClient->connect(&advertisedDevice);

  auto pRemoteService = pClient->getService(BLEUUID(SERVICE_UUID));
  auto pReadCharacteristic = pRemoteService->getCharacteristic(BLEUUID(READ_CHARACTERISTIC_UUID));

  int choice;
  do {
    Serial.println("1. SoC abfragen");
    Serial.println("2. Leistung abfragen");
    Serial.println("3. Spannung der gesamten Batterie abfragen");
    Serial.println("4. Stromstärke abfragen");
    Serial.println("5. Zyklenanzahl abfragen");
    Serial.println("0. Beenden");
    Serial.print("Auswahl: ");
    while (!Serial.available()) {}
    choice = Serial.parseInt();
    Serial.println();

    switch (choice) {
      case 1:
        queryAndPrintSOC(pReadCharacteristic);
        break;
      case 2:
        queryAndPrintPower(pReadCharacteristic);
        break;
      case 3:
        queryAndPrintTotalVoltage(pReadCharacteristic);
        break;
      case 4:
        queryAndPrintCurrent(pReadCharacteristic);
        break;
      case 5:
        queryAndPrintCycleCount(pReadCharacteristic);
        break;
    }
  } while (choice != 0);

  pClient->disconnect();
}

}

void queryAndPrintSOC(BLERemoteCharacteristic* pReadCharacteristic) {
std::string readValue = pReadCharacteristic->readValue();
uint8_t rsoc = readValue[15];
Serial.println("SoC: " + String(rsoc) + "%");
}

void queryAndPrintPower(BLERemoteCharacteristic* pReadCharacteristic) {
std::string readValue = pReadCharacteristic->readValue();
uint16_t totalVoltage = (readValue[5] << 8) | readValue[6];
uint16_t totalCurrentRaw = (readValue[7] << 8) | readValue[8];
int16_t totalCurrent = (totalCurrentRaw & 0x8000) ? -(totalCurrentRaw & 0x7FFF) : totalCurrentRaw;
float power = totalVoltage * totalCurrent / 1000.0;
Serial.println("Leistung: " + String(power) + " W");
}

void queryAndPrintTotalVoltage(BLERemoteCharacteristic* pReadCharacteristic) {
std::string readValue = pReadCharacteristic->readValue();
uint16_t totalVoltage = (readValue[5] << 8) | readValue[6];
float totalVoltageFloat = totalVoltage / 100.0;
Serial.println("Spannung der gesamten Batterie: " + String(totalVoltageFloat) + " V");
}

void queryAndPrintCurrent(BLERemoteCharacteristic* pReadCharacteristic) {
std::string readValue = pReadCharacteristic->readValue();
uint16_t totalCurrentRaw = (readValue[7] << 8) | readValue[8];
int16_t totalCurrent = (totalCurrentRaw & 0x8000) ? -(totalCurrentRaw & 0x7FFF) : totalCurrentRaw;
float totalCurrentFloat = totalCurrent / 100.0;
Serial.println("Stromstärke: " + String(totalCurrentFloat) + " A");
}

void queryAndPrintCycleCount(BLERemoteCharacteristic* pReadCharacteristic) {
std::string readValue = pReadCharacteristic->readValue();
uint16_t cycleCount = (readValue[13] << 8) | readValue[14];
Serial.println("Zyklenanzahl: " + String(cycleCount));
}
};

void setup() {
Serial.begin(115200);
Serial.println("JBD BMS Bluetooth Steuerung");
BLEDevice::init("");
pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true);
pBLEScan->start(5);
}

void loop() {
pBLEScan->start(5);
delay(5000);
}

Meinungen? Wo muss sowas rein? Welche Dateien muss ich in diesem Projekt für den benötigten JBDBMS-Controller anpassen?

@schlimmchen schlimmchen changed the title Support for JBD BMS [Request] [Request] Support for JBD BMS Sep 7, 2024
@schlimmchen schlimmchen linked a pull request Sep 7, 2024 that will close this issue
Copy link

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new discussion or issue for related concerns.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Nov 30, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants