iMax B6 Integration into Home Assistant

142 views
Skip to first unread message

SERG

unread,
Mar 4, 2025, 1:13:21 AMMar 4
to cheali-charger
The code was written for the ESP32 DEV KIT

esphome:
name: imax-b6-esp32
friendly_name: iMax_B6_ESP32
on_boot:
priority: -100
then:
- lambda: |-
pinMode(16, INPUT);
pinMode(17, OUTPUT);
Serial2.begin(9600, SERIAL_8N1, 16, 17);

esp32:
board: esp32doit-devkit-v1
framework:
type: arduino

logger:
level: DEBUG
baud_rate: 9600

api:
encryption:
key: "O1vxEavGrdJOvAkv9hFiv2P9WbL9RGfgF5x7c4Srv0w="

ota:
password: "325a583b1df3db697032307ee610d00f"

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Imax-B6-ESP32 Fallback Hotspot"
password: "NcT7vepJkR5D"

captive_portal:

text_sensor:
- platform: template
name: "iMax B6 Raw Data"
id: imax_raw_data
update_interval: 10s
lambda: |-
static String last_data = "";
String data = "";
bool got_full_line = false;
while (Serial2.available() && !got_full_line) {
char c = Serial2.read();
if (c == '\n') {
if (data.length() > 0 && data.startsWith("$")) {
last_data = data;
ESP_LOGD("imax", "Received: %s", data.c_str());
got_full_line = true;
}
data = "";
} else {
data += c;
}
}
return std::string(last_data.c_str());
icon: "mdi:battery-charging" For configuration.yaml   # Основной вариант: Wi-Fi через ESP32 (ESPHome)
  # Используйте этот блок, если iMax B6 подключен к ESP32 через UART и передает данные по Wi-Fi
  - platform: template
    sensors:
      battery_voltage:
        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[3] | float / 1000 }}"
        unit_of_measurement: "V"
        friendly_name: "Battery Voltage"
      battery_current:
        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[4] | int }}"
        unit_of_measurement: "mA"
        friendly_name: "Battery Current"
      battery_capacity:
        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[5] | int }}"
        unit_of_measurement: "mAh"
        friendly_name: "Battery Capacity"
      battery_power:
        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[6] | float / 100 }}"
        unit_of_measurement: "W"
        friendly_name: "Power"
      battery_energy:
        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[7] | float / 100 }}"
        unit_of_measurement: "Wh"
        friendly_name: "Energy"
#      power_supply_voltage:
#        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[10] | float / 1000 }}"
#        unit_of_measurement: "V"
#        friendly_name: "Power Supply Voltage"
#      internal_resistance:
#        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[23] | int }}"
#        unit_of_measurement: "mΩ"
#        friendly_name: "Internal Resistance"
#      charge_percentage:
#        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[25] | int }}"
#        unit_of_measurement: "%"
#        friendly_name: "Charge Percentage"
#      eta:
#        value_template: "{{ states('sensor.imax_b6_esp32_imax_b6_raw_data').split(';')[26] | int }}"
#        unit_of_measurement: "s"
#        friendly_name: "ETA"

2025-03-04 11.05.56.JPG
Снимок экрана 2025-03-04 в 11.11.13.png
Снимок экрана 2025-03-04 в 11.11.38.png

Mijil Kawuri

unread,
Mar 4, 2025, 1:43:33 AMMar 4
to cheali-charger
Hi, great build, is any code change in the cheali charger? and how did you connect in to the charger board? please tell us 
Thanks.

SERG

unread,
Mar 4, 2025, 5:15:32 AMMar 4
to cheali-charger
Firmware without any changes.
Connection to the standard connector: TX, GND and +5V.
Only the TTL signal level is higher than 3.3V, but data is received and transmitted.2025-03-02 16.37.01.JPG

вторник, 4 марта 2025 г. в 11:43:33 UTC+5, miji...@gmail.com:

SERG

unread,
Mar 7, 2025, 1:28:10 PMMar 7
to cheali-charger
For ESP32-C3 Super Mini

esphome:
name: esphome-web-885bf0
friendly_name: ESP32 C3 for iMax B6
on_boot:
priority: -100
then:
- lambda: |-
gpio_pulldown_dis(GPIO_NUM_5); // Выключить pull-down
gpio_pullup_dis(GPIO_NUM_5); // Выключить pull-up
pinMode(5, INPUT); // RX без подтяжек
pinMode(6, OUTPUT); // TX
Serial1.begin(9600, SERIAL_8N1, 5, 6); // Используем Serial1

esp32:
board: esp32-c3-devkitm-1
framework:
type: arduino

# Enable logging
logger:
level: DEBUG
baud_rate: 0 # Отключаем стандартный UART, чтобы не мешал работе Serial1

# Enable Home Assistant API
api:
encryption:
key: "idlmY8N4hK1NE3Jv9E2kY5LxVxBV86EgqfZ7njGprIk="

ota:

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password

# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esphome-Web-885Bf0"
password: "RNBaIvBqLK1v"

captive_portal:

text_sensor:
- platform: template
name: "iMax B6 Raw Data"
id: imax_raw_data
update_interval: 10s
lambda: |-
static String last_data = "";
String data = "";
bool got_full_line = false;
unsigned long start_time = millis();

// Очищаем буфер перед чтением, чтобы начать с чистого листа
while (Serial1.available()) Serial1.read();

// Ждём одну целостную строку с таймаутом 1 секунда
while (!got_full_line && (millis() - start_time < 1000)) {
if (Serial1.available()) {
char c = Serial1.read();
if (c == '\n') {
if (data.length() > 0 && data.startsWith("$")) {
last_data = data;
ESP_LOGD("imax", "Received: %s", data.c_str());
got_full_line = true;
}
data = "";
} else {
data += c;
}
}
}

// Если не получили строку, логируем это
if (!got_full_line) {
ESP_LOGD("imax", "No full line received, keeping last data");
}

// Очищаем буфер, чтобы игнорировать данные до следующего цикла
while (Serial1.available()) Serial1.read();

return std::string(last_data.c_str());
icon: "mdi:battery-charging"


вторник, 4 марта 2025 г. в 15:15:32 UTC+5, SERG:

SERG

unread,
Jul 31, 2025, 1:44:47 PMJul 31
to cheali-charger
$1;1;3132.0;1898;61;77;11;14;0;0;12068;0;0;0;0;0;0;0;0;0;0;0;0;460;0;99;177;6

$1 — начало строки (индикатор протокола).
1 — номер канала или режим.
3132.0 — время работы (секунды).
1898 — напряжение батареи (мВ, 1.898 В).
61 — ток (мА, 0.061 А).
77 — емкость (мАч).
11 — мощность (0.01 Вт, 0.11 Вт).
14 — энергия (0.01 Вт·ч, 0.14 Вт·ч).
9–14. 0;0;0;0;0;0 — напряжения ячеек 1–6 (мВ, здесь 0).
12068 — напряжение блока питания (мВ, 12.068 В).
16–22. 0;0;0;0;0;0;0 — сопротивления ячеек 1–6 (мОм, здесь 0).
460 — внутреннее сопротивление (мОм).
0 — резервное поле.
99 — процент заряда (%).
177 — ETA (секунды, ≈2.95 минуты).
6 — контрольная сумма или статус.



Поля данных (values[0] — values[27])
values[0] и values[1]: Не используются в выводе. Возможно, это заголовок или служебные данные (например, идентификатор устройства или тип сообщения).

values[2]: Общее время работы в секундах.
Преобразуется в часы, минуты и секунды: hours = totalSeconds / 3600, minutes = (totalSeconds % 3600) / 60, seconds = totalSeconds % 60.

values[3]: Напряжение батареи (в милливольтах, делится на 1000 для перевода в вольты).

values[4]: Ток в миллиамперах (мА).

values[5]: Ёмкость в миллиампер-часах (мАч).

values[6]: Мощность (в единицах, делённых на 100, вероятно, в ваттах).

values[7]: Энергия (в единицах, делённых на 100, вероятно, в ватт-часах).

values[8] — values[13]: Напряжение по ячейкам батареи (6 значений).
Выводятся как вольты (делятся на 1000).

Особенность: values[10] интерпретируется как напряжение блока питания, а не ячейки, поэтому для ячейки на этой позиции явно выводится 0.000.

values[10]: Напряжение блока питания (в милливольтах, делится на 1000 для перевода в вольты).

values[15] — values[21]: Сопротивления ячеек (7 значений, в миллиомах, мОм).

values[23]: Внутреннее сопротивление батареи (в миллиомах, мОм).

values[25]: Процент заряда батареи (в процентах, %).

values[26]: Оставшееся время (ETA, estimated time of arrival) в секундах.
Также преобразуется в минуты для удобства.

values[27]: Контрольная сумма (вероятно, для проверки целостности данных).

Пропущенные индексы
values[14], values[22], values[24]: Не используются в выводе. Возможно, это зарезервированные или нерелевантные для данной реализации поля.



пятница, 28 февраля 2025 г. в 11:50:23 UTC+5, SERG:

пятница, 7 марта 2025 г. в 23:28:10 UTC+5, SERG:
Reply all
Reply to author
Forward
0 new messages