shining-man / bsc_fw

Firmware battery safety controller (BSC)
MIT License
82 stars 15 forks source link

Wunsch: Erweiterung Mqtt Meldungen um Balance Current #30

Closed testpaul999 closed 1 year ago

testpaul999 commented 1 year ago

Guten Tag, Bitte die mqtt Meldungen um den Wert Balance-current, Status Laden, Entladen, Balance und die Temperaturwerte mit Nachkommastellen erweitern.

Sprich mit wieviel Strom wird aktuell gebalanced. Die Werte sollten hier zu finden sein. Analyse aus https://www.akkudoktor.net/forum/open-source-software-projekte/jkbms-auslesen-ueber-ble-bluetooth-oder-rs485-adapter-mittels-eps-iobroker/#post-649

Current_Balancer = (((int)receivedBytes_main[63+offset] << 8 | receivedBytes_main[62+offset])*0.001);

if((receivedBytes_main[139+2offset] & 0xF0) == 0x0) { Balance_Curr = (((int)receivedBytes_main[139+2offset] << 8 | receivedBytes_main[138+2offset])0.001); } else if ((receivedBytes_main[139+2offset] & 0xF0) == 0xF0) { Balance_Curr = ((((int)receivedBytes_main[139+2offset] & 0x0F) << 8 | receivedBytes_main[138+2offset])-0.001); } Serial.print("Current Balancer = "); Serial.print(Current_Balancer, 3); Serial.println("V, ");

Und dann wäre es toll, wenn die Temperaturen ihren Sensoren zugeordnet werden. Aktuell sehe ich im mqtt 0,1,2 Schön wäre T1,T2 und MOS-Temp.

Danke für die tolle Arbeit.

testpaul999 commented 1 year ago

Guten Tag, Bitte die mqtt Meldungen um den Wert Balance-current, Status Laden, Entladen, Balance und die Temperaturwerte mit Nachkommastellen erweitern. danke

shining-man commented 1 year ago

Mit dem Code-Schnippsel kann ich nicht wirklich etwas anfangen. Wenn noch weitere Daten benötigt werden, dass ist die Basis dafür nicht irgend ein Code, sondern eine Spezifikation der Schnittstelle. Meines Wissens wird der Valance-Current nicht über dies RS485 Schnittstelle übertragen.

Die Nachkommastellen bei der Temperatur schaue ich mir einmal an. Die sollten eigentlich vorhanden sein.

Bei dem Status Laden, Entladen, Balance muss ich erst schauen ob die Info an der RS485 Schnittstelle übertragen wird.

testpaul999 commented 1 year ago

Guten Abend, doch die Werte werden übertragen. Das sieht man an dem Projekt, was ich hier auch verlinkt habe. Analyse aus https://www.akkudoktor.net/forum/open-source-software-projekte/jkbms-auslesen-ueber-ble-bluetooth-oder-rs485-adapter-mittels-eps-iobroker/#post-649 Hier werden die Werte auch an mqtt übergeben, daher frage ich ja. Wenn ich helfen kann…? danke

shining-man commented 1 year ago

Dort werden sie aber via Bluetooth gelesen und nicht über die Serielle-Schnittstelle. In der Spezifikation die ich zur RS485 Schnisttstelle von JK habe, ist da auch nichts erwähnt. Dein Code-Schnippsel bezieht sich auf das kopieren aus dem BT-Frame. Das RS485 Protokoll hat einen ganz anderen Aufbau.

testpaul999 commented 1 year ago

Mea culpa, das hatte ich so nicht auf dem Schirm. Schade, aber nicht zu ändern. Bleibt meine Bitte: Status Laden, on/off Status Entladen, on/off Stautest Balance, on/off und die Temperaturwerte mit Nachkommastellen erweitern.

shining-man commented 1 year ago

Den Issue am besten so lange offen lassen, bis es erledigt ist.

gropi75 commented 1 year ago

Ich habe viele Rückmeldungen vom JK-BMS (über RS485) bei mir umgesetzt, u.a. auch die Statusnachrichten. (die Variable Decoded ist eigentlich eine Struktur, darunter ist char sBatteryStatus[40] was ist hier auffülle. Bei mir wird auf der Weboberfläche das dann als Text angezeigt) Sieht dann so aus:

grafik

` case 0x8c: // Battery status information / JKBMS Bit 0: charging on Bit 1: discharge on Bit 2: equilization on Bit 3: battery down Bit 4..15: reserved /

  Decoded.BatteryStatus = ((uint16_t)data2decode[i + 1] << 8 | data2decode[i + 2]);
  i += 3;
  strcpy(Decoded.sBatteryStatus, "undefined");
  strcpy(Decoded.charge, "off");
  strcpy(Decoded.discharge, "off");
  strcpy(Decoded.balance, "off");

  if ((Decoded.BatteryStatus >> 3) & 0x01)
  { // looking for bit 3
    strcpy(Decoded.sBatteryStatus, "Battery Down");
  }
  else
  {
    if (Decoded.BatteryStatus & 0x01)
    { // looking for bit 0
      strcpy(Decoded.charge, "on ");
    }
    else
      strcpy(Decoded.charge, "off");

    strcpy(Decoded.sBatteryStatus, "Charge:");
    strncat(Decoded.sBatteryStatus, Decoded.charge, 3);

    if ((Decoded.BatteryStatus >> 1) & 0x01)
    { // looking for bit 1
      strcpy(Decoded.discharge, "on ");
    }
    else
      strcpy(Decoded.discharge, "off");

    strncat(Decoded.sBatteryStatus, " Discharge:", 12);
    strncat(Decoded.sBatteryStatus, Decoded.discharge, 3);

    if ((Decoded.BatteryStatus >> 2) & 0x01)
    { // looking for bit 2
      strcpy(Decoded.balance, "on ");
    }
    else
      strcpy(Decoded.charge, "off");

    strncat(Decoded.sBatteryStatus, " Balance:", 10);
    strncat(Decoded.sBatteryStatus, Decoded.balance, 3);
  }

  break;`
testpaul999 commented 1 year ago

Danke für den Tipp. Grüße

shining-man commented 1 year ago

@gropi75 Ich habe folgendes Protokoll, das hoffentlich stimmt. So ganz sicher bin ich mir da nicht immer... http://www.jk-bms.com/Upload/2022-05-19/1621104621.pdf

gropi75 commented 1 year ago

Ich habe das gleiche Dokument bei mir bzw. habe mpp-solar verwendet. Inhaltlich passen sie zueinander. Ich hatte Probleme mit dem 0xB6 - System Working hours. Sonst passt die Beschreibung ganz gut.

shining-man commented 1 year ago

Is implemented in the current master branch