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

@sralus

Dieses Problem hatte ich heute auch und es ist schon auf einer früheren Seite dieser Unterhaltung zu finden. So wie ich es vertanden habe sind die neuen JK BMS statt für 24 Zellen sogar für 32 Zellen ausgelegt. Dadurch erweitert sich der Speicher-Ardessbereich, und die Adresswerte "xxx" bei receivedBytes_main[xxx] müssen nach den single Zell Spannungsabfragen alle um 32!!! erhöht werden.

Ich habe das schon mal realiesiert und es wäre für viele andere hilfreich, wenn Du das komplettte Flash-File hier zur Verfügung stellst :slight_smile:

Ich habe die "alten" Zeilen alle auskommentiert und Du siehst, dass die neuen Zahlen bei receivedBytes_main alle um 32 höher sind.

Aber es sind leider immer noch nicht alle Werte richtig. So zeigt z.B. die Delta_Cell_Voltage beim Handy 0,010V und über Mqtt 0,051V. Viele andere Werte sind aber ok :slight_smile:

Average_Cell_Voltage = (((int)receivedBytes_main[91] << 8 | receivedBytes_main[90])*0.001);
Delta_Cell_Voltage = (((int)receivedBytes_main[93] << 8 | receivedBytes_main[92])*0.001);
//Average_Cell_Voltage = (((int)receivedBytes_main[59] << 8 | receivedBytes_main[58])*0.001);
//Delta_Cell_Voltage = (((int)receivedBytes_main[61] << 8 | receivedBytes_main[60])*0.001);
Current_Balancer = (((int)receivedBytes_main[95] << 8 | receivedBytes_main[94])*0.001);
//Current_Balancer = (((int)receivedBytes_main[63] << 8 | receivedBytes_main[62])*0.001);
// +48 byte Resistance_Cell1
// +6 byte unbekant 2
//Battery_Voltage = (((int)receivedBytes_main[121] << 24 | receivedBytes_main[120] << 16 | receivedBytes_main[119] << 8 | receivedBytes_main[118])*0.001);
Battery_Voltage = (((int)receivedBytes_main[153] << 24 | receivedBytes_main[152] << 16 | receivedBytes_main[151] << 8 | receivedBytes_main[118])*0.001);
CAN_Battery_Voltage = (((int)receivedBytes_main[151] << 8 | receivedBytes_main[150])/10);
//CAN_Battery_Voltage = (((int)receivedBytes_main[119] << 8 | receivedBytes_main[118])/10);
Battery_Power = (((int)receivedBytes_main[157] << 24 | (int)receivedBytes_main[156] << 16 | (int)receivedBytes_main[155] << 8 | (int)receivedBytes_main[122])*0.001);
//Battery_Power = (((int)receivedBytes_main[125] << 24 | (int)receivedBytes_main[124] << 16 | (int)receivedBytes_main[123] << 8 | (int)receivedBytes_main[122])*0.001);
Charge_Current = (((int)receivedBytes_main[161] << 24 | receivedBytes_main[160] << 16 | receivedBytes_main[159] << 8 | receivedBytes_main[158])*0.001);
//Charge_Current = (((int)receivedBytes_main[129] << 24 | receivedBytes_main[128] << 16 | receivedBytes_main[127] << 8 | receivedBytes_main[126])*0.001);
//CAN_Charge_Current = ((int)receivedBytes_main[129] << 24 | receivedBytes_main[128] << 16 | receivedBytes_main[127] << 8 | receivedBytes_main[126] / 100);
CAN_Charge_Current = (int)(Charge_Current * 10);
//Battery_Power = (((int)receivedBytes_main[121] << 8 | receivedBytes_main[120])*0.001); unbekannt ?!
//Battery_Power = (((int)receivedBytes_main[123] << 8 | receivedBytes_main[122])*0.001);
// +6 byte unbekant 3
//Battery_T1 = (((int)receivedBytes_main[131] << 8 | receivedBytes_main[130])*0.1);
//CAN_Battery_T1 = ((int)receivedBytes_main[131] << 8 | receivedBytes_main[130]);
//if(receivedBytes_main[131] == 0xFF) {
// Battery_T1 = ((0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[131] << 8 | (int)receivedBytes_main[130])*0.1);
// CAN_Battery_T1 = (0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[131] << 8 | receivedBytes_main[130]);
//}
if(receivedBytes_main[163] == 0xFF) {
Battery_T1 = ((0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[163] << 8 | (int)receivedBytes_main[162])*0.1);
CAN_Battery_T1 = (0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[163] << 8 | receivedBytes_main[162]);
}
else {
Battery_T1 = (((int)receivedBytes_main[163] << 8 | (int)receivedBytes_main[162])*0.1);
CAN_Battery_T1 = ((int)receivedBytes_main[163] << 8 | receivedBytes_main[162]);
}
//Battery_T1 = (((int)receivedBytes_main[131] << 8 | (int)receivedBytes_main[130])*0.1);
//CAN_Battery_T1 = ((int)receivedBytes_main[131] << 8 | receivedBytes_main[130]);
//}
//Battery_T2 = (((int)receivedBytes_main[133] << 8 | (int)receivedBytes_main[132])*0.1);
if(receivedBytes_main[133] == 0xFF) {
Battery_T2 = ((0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[165] << 8 | (int)receivedBytes_main[164])*0.1);
}
else {
Battery_T2 = (((int)receivedBytes_main[165] << 8 | (int)receivedBytes_main[164])*0.1);
}
//if(receivedBytes_main[133] == 0xFF) {
// Battery_T2 = ((0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[133] << 8 | (int)receivedBytes_main[132])*0.1);
//}
//else {
//Battery_T2 = (((int)receivedBytes_main[133] << 8 | (int)receivedBytes_main[132])*0.1);
//}
//MOS_Temp = (((int)receivedBytes_main[135] << 8 | receivedBytes_main[134])*0.1);
if(receivedBytes_main[167] == 0xFF) {
MOS_Temp = ((0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[167] << 8 | (int)receivedBytes_main[166])*0.1);
}
else {
MOS_Temp = (((int)receivedBytes_main[167] << 8 | (int)receivedBytes_main[166])*0.1);
}
//if(receivedBytes_main[135] == 0xFF) {
// MOS_Temp = ((0xFF << 24 | 0xFF << 16 | (int)receivedBytes_main[135] << 8 | (int)receivedBytes_main[134])*0.1);
//}
//else {
//MOS_Temp = (((int)receivedBytes_main[135] << 8 | (int)receivedBytes_main[134])*0.1);
//}
if((receivedBytes_main[171] & 0xF0) == 0x0) {
Balance_Curr = (((int)receivedBytes_main[171] << 8 | receivedBytes_main[170])*0.001);
}
else if ((receivedBytes_main[171] & 0xF0) == 0xF0) {
Balance_Curr = ((((int)receivedBytes_main[171] & 0x0F) << 8 | receivedBytes_main[170])*-0.001);
}
//if((receivedBytes_main[139] & 0xF0) == 0x0) {
// Balance_Curr = (((int)receivedBytes_main[139] << 8 | receivedBytes_main[138])*0.001);
//}
//else if ((receivedBytes_main[139] & 0xF0) == 0xF0) {
// Balance_Curr = ((((int)receivedBytes_main[139] & 0x0F) << 8 | receivedBytes_main[138])*-0.001);
//}
// +2 byte unbekant 4
Percent_Remain = ((int)receivedBytes_main[173]);
Capacity_Remain = (((int)receivedBytes_main[177] << 24 | receivedBytes_main[176] << 16 | receivedBytes_main[175] << 8 | receivedBytes_main[174])*0.001);
Nominal_Capacity = (((int)receivedBytes_main[181] << 24 | receivedBytes_main[180] << 16 | receivedBytes_main[179] << 8 | receivedBytes_main[178])*0.001);
Cycle_Count = receivedBytes_main[185] + receivedBytes_main[184] + receivedBytes_main[183] + receivedBytes_main[182]; //((String)receivedBytes_main[153] << 24 | receivedBytes_main[152] << 16 | receivedBytes_main[151] << 8 | receivedBytes_main[150]));
// +6 byte unbekant 5
//Percent_Remain = ((int)receivedBytes_main[141]);
//Capacity_Remain = (((int)receivedBytes_main[145] << 24 | receivedBytes_main[144] << 16 | receivedBytes_main[143] << 8 | receivedBytes_main[142])*0.001);
//Nominal_Capacity = (((int)receivedBytes_main[149] << 24 | receivedBytes_main[148] << 16 | receivedBytes_main[147] << 8 | receivedBytes_main[146])*0.001);
//Cycle_Count = receivedBytes_main[153] + receivedBytes_main[152] + receivedBytes_main[151] + receivedBytes_main[150]; //((String)receivedBytes_main[153] << 24 | receivedBytes_main[152] << 16 | receivedBytes_main[151] << 8 | receivedBytes_main[150]));
// +6 byte unbekant 5
Capacity_Cycle = (((int)receivedBytes_main[193] << 8 | receivedBytes_main[192])*0.001);
Uptime = (((int)receivedBytes_main[196] << 16 | receivedBytes_main[195] << 8 | receivedBytes_main[194]));
//Capacity_Cycle = (((int)receivedBytes_main[161] << 8 | receivedBytes_main[160])*0.001);
//Uptime = (((int)receivedBytes_main[164] << 16 | receivedBytes_main[163] << 8 | receivedBytes_main[162]));
sec = Uptime % 60;
Uptime /= 60;
mi = Uptime % 60;
Uptime /= 60;
hr = Uptime % 24;
days = Uptime /= 24;
// +1 byte unbekannt
if(receivedBytes_main[198] > 0) {
//if(receivedBytes_main[166] > 0) {
charge = "on";
}
else if (receivedBytes_main[198] == 0) {
//else if (receivedBytes_main[166] == 0) {
charge = "off";
}
if(receivedBytes_main[199] > 0) {
//if(receivedBytes_main[167] > 0) {
discharge = "on";
}
else if (receivedBytes_main[199] == 0) {
//else if (receivedBytes_main[167] == 0) {
discharge = "off";
}
2 „Gefällt mir“