substitutions: name: jk-bms bms0: "${name} bms0" bms1: "${name} bms1" device_description: "Monitor and control a JK-BMS via bluetooth" external_components_source: github://syssi/esphome-jk-bms@main bms0_mac_address: C8:47:80:13:B4:A7 bms1_mac_address: 98:DA:20:09:E0:34 # Please use "JK02_24S" if you own a old JK-BMS < hardware version 11.0 (hardware version >= 6.0 and < 11.0) # Please use "JK02_32S" if you own a new JK-BMS >= hardware version 11.0 (f.e. JK-B2A8S20P hw 11.XW, sw 11.26) # Please use "JK04" if you have some old JK-BMS <= hardware version 3.0 (f.e. JK-B2A16S hw 3.0, sw. 3.3.0) bms0_protocol_version: JK02_32S bms1_protocol_version: JK02_32S esphome: name: ${name} comment: ${device_description} min_version: 2024.6.0 project: name: "syssi.esphome-jk-bms" version: 2.1.0 esp32: board: esp32-c3-devkitm-1 framework: type: arduino #esp32: # board: wemos_d1_mini32 # framework: # type: esp-idf external_components: - source: ${external_components_source} refresh: 0s wifi: ssid: !secret wifi_ssid password: !secret wifi_password ota: platform: esphome on_begin: then: - switch.turn_off: ble_client_switch0 - switch.turn_off: ble_client_switch1 - logger.log: "BLE connection suspended for OTA update" logger: level: DEBUG logs: esp32_ble_tracker: INFO esp32_ble_client: INFO # If you don't use Home Assistant please remove this `api` section and uncomment the `mqtt` component! api: captive_portal: # mqtt: # broker: !secret mqtt_host # username: !secret mqtt_username # password: !secret mqtt_password # id: mqtt_client esp32_ble_tracker: scan_parameters: active: false ble_client: - mac_address: ${bms0_mac_address} id: client0 - mac_address: ${bms1_mac_address} id: client1 jk_bms_ble: - ble_client_id: client0 protocol_version: ${bms0_protocol_version} throttle: 5s id: bms0 - ble_client_id: client1 protocol_version: ${bms1_protocol_version} throttle: 5s id: bms1 binary_sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 balancing: name: "${bms0} balancing" charging: name: "${bms0} charging" discharging: name: "${bms0} discharging" heating: name: "${bms0} heating" online_status: name: "${bms0} online status" - platform: jk_bms_ble jk_bms_ble_id: bms1 balancing: name: "${bms1} balancing" charging: name: "${bms1} charging" discharging: name: "${bms1} discharging" heating: name: "${bms1} heating" online_status: name: "${bms1} online status" button: - platform: jk_bms_ble jk_bms_ble_id: bms0 retrieve_settings: name: "${bms0} retrieve settings" retrieve_device_info: name: "${bms0} retrieve device info" - platform: jk_bms_ble jk_bms_ble_id: bms1 retrieve_settings: name: "${bms1} retrieve settings" retrieve_device_info: name: "${bms1} retrieve device info" number: - platform: jk_bms_ble jk_bms_ble_id: bms0 balance_trigger_voltage: name: "${bms0} balance trigger voltage" cell_count: name: "${bms0} cell count" total_battery_capacity: name: "${bms0} total battery capacity" cell_voltage_overvoltage_protection: name: "${bms0} cell voltage overvoltage protection" cell_voltage_overvoltage_recovery: name: "${bms0} cell voltage overvoltage recovery" cell_voltage_undervoltage_protection: name: "${bms0} cell voltage undervoltage protection" cell_voltage_undervoltage_recovery: name: "${bms0} cell voltage undervoltage recovery" balance_starting_voltage: name: "${bms0} balance starting voltage" voltage_calibration: name: "${bms0} voltage calibration" current_calibration: name: "${bms0} current calibration" power_off_voltage: name: "${bms0} power off voltage" max_balance_current: name: "${bms0} max balance current" max_charge_current: name: "${bms0} max charge current" max_discharge_current: name: "${bms0} max discharge current" smart_sleep_voltage: name: "${bms0} smart sleep voltage" cell_soc100_voltage: name: "${bms0} cell soc100 voltage" cell_soc0_voltage: name: "${bms0} cell soc0 voltage" cell_request_charge_voltage: name: "${bms0} cell request charge voltage" cell_request_float_voltage: name: "${bms0} cell request float voltage" cell_request_charge_voltage_time: name: "${bms0} cell request charge voltage time" cell_request_float_voltage_time: name: "${bms0} cell request float voltage time" charge_overcurrent_protection_delay: name: "${bms0} charge overcurrent protection delay" charge_overcurrent_protection_recovery_time: name: "${bms0} charge overcurrent protection recovery time" discharge_overcurrent_protection_delay: name: "${bms0} discharge overcurrent protection delay" discharge_overcurrent_protection_recovery_time: name: "${bms0} discharge overcurrent protection recovery time" short_circuit_protection_delay: name: "${bms0} short circuit protection delay" short_circuit_protection_recovery_time: name: "${bms0} short circuit protection recovery time" charge_overtemperature_protection: name: "${bms0} charge overtemperature protection" charge_overtemperature_protection_recovery: name: "${bms0} charge overtemperature protection recovery" discharge_overtemperature_protection: name: "${bms0} discharge overtemperature protection" discharge_overtemperature_protection_recovery: name: "${bms0} discharge overtemperature protection recovery" charge_undertemperature_protection: name: "${bms0} charge undertemperature protection" charge_undertemperature_protection_recovery: name: "${bms0} charge undertemperature protection recovery" power_tube_overtemperature_protection: name: "${bms0} power tube overtemperature protection" power_tube_overtemperature_protection_recovery: name: "${bms0} power tube overtemperature protection recovery" # ... - platform: jk_bms_ble jk_bms_ble_id: bms1 balance_trigger_voltage: name: "${bms1} balance trigger voltage" cell_count: name: "${bms1} cell count" total_battery_capacity: name: "${bms1} total battery capacity" cell_voltage_overvoltage_protection: name: "${bms1} cell voltage overvoltage protection" cell_voltage_overvoltage_recovery: name: "${bms1} cell voltage overvoltage recovery" cell_voltage_undervoltage_protection: name: "${bms1} cell voltage undervoltage protection" cell_voltage_undervoltage_recovery: name: "${bms1} cell voltage undervoltage recovery" balance_starting_voltage: name: "${bms1} balance starting voltage" voltage_calibration: name: "${bms1} voltage calibration" current_calibration: name: "${bms1} current calibration" power_off_voltage: name: "${bms1} power off voltage" max_balance_current: name: "${bms1} max balance current" max_charge_current: name: "${bms1} max charge current" max_discharge_current: name: "${bms1} max discharge current" smart_sleep_voltage: name: "${bms1} smart sleep voltage" cell_soc100_voltage: name: "${bms1} cell soc100 voltage" cell_soc0_voltage: name: "${bms1} cell soc0 voltage" cell_request_charge_voltage: name: "${bms1} cell request charge voltage" cell_request_float_voltage: name: "${bms1} cell request float voltage" cell_request_charge_voltage_time: name: "${bms1} cell request charge voltage time" cell_request_float_voltage_time: name: "${bms1} cell request float voltage time" charge_overcurrent_protection_delay: name: "${bms1} charge overcurrent protection delay" charge_overcurrent_protection_recovery_time: name: "${bms1} charge overcurrent protection recovery time" discharge_overcurrent_protection_delay: name: "${bms1} discharge overcurrent protection delay" discharge_overcurrent_protection_recovery_time: name: "${bms1} discharge overcurrent protection recovery time" short_circuit_protection_delay: name: "${bms1} short circuit protection delay" short_circuit_protection_recovery_time: name: "${bms1} short circuit protection recovery time" charge_overtemperature_protection: name: "${bms1} charge overtemperature protection" charge_overtemperature_protection_recovery: name: "${bms1} charge overtemperature protection recovery" discharge_overtemperature_protection: name: "${bms1} discharge overtemperature protection" discharge_overtemperature_protection_recovery: name: "${bms1} discharge overtemperature protection recovery" charge_undertemperature_protection: name: "${bms1} charge undertemperature protection" charge_undertemperature_protection_recovery: name: "${bms1} charge undertemperature protection recovery" power_tube_overtemperature_protection: name: "${bms1} power tube overtemperature protection" power_tube_overtemperature_protection_recovery: name: "${bms1} power tube overtemperature protection recovery" # ... sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 min_cell_voltage: name: "${bms0} min cell voltage" max_cell_voltage: name: "${bms0} max cell voltage" min_voltage_cell: name: "${bms0} min voltage cell" max_voltage_cell: name: "${bms0} max voltage cell" delta_cell_voltage: name: "${bms0} delta cell voltage" average_cell_voltage: name: "${bms0} average cell voltage" cell_voltage_1: name: "${bms0} cell voltage 1" cell_voltage_2: name: "${bms0} cell voltage 2" cell_voltage_3: name: "${bms0} cell voltage 3" cell_voltage_4: name: "${bms0} cell voltage 4" cell_voltage_5: name: "${bms0} cell voltage 5" cell_voltage_6: name: "${bms0} cell voltage 6" cell_voltage_7: name: "${bms0} cell voltage 7" cell_voltage_8: name: "${bms0} cell voltage 8" cell_voltage_9: name: "${bms0} cell voltage 9" cell_voltage_10: name: "${bms0} cell voltage 10" cell_voltage_11: name: "${bms0} cell voltage 11" cell_voltage_12: name: "${bms0} cell voltage 12" cell_voltage_13: name: "${bms0} cell voltage 13" cell_voltage_14: name: "${bms0} cell voltage 14" cell_voltage_15: name: "${bms0} cell voltage 15" cell_voltage_16: name: "${bms0} cell voltage 16" cell_voltage_17: name: "${bms0} cell voltage 17" cell_voltage_18: name: "${bms0} cell voltage 18" cell_voltage_19: name: "${bms0} cell voltage 19" cell_voltage_20: name: "${bms0} cell voltage 20" cell_voltage_21: name: "${bms0} cell voltage 21" cell_voltage_22: name: "${bms0} cell voltage 22" cell_voltage_23: name: "${bms0} cell voltage 23" cell_voltage_24: name: "${bms0} cell voltage 24" cell_resistance_1: name: "${bms0} cell resistance 1" cell_resistance_2: name: "${bms0} cell resistance 2" cell_resistance_3: name: "${bms0} cell resistance 3" cell_resistance_4: name: "${bms0} cell resistance 4" cell_resistance_5: name: "${bms0} cell resistance 5" cell_resistance_6: name: "${bms0} cell resistance 6" cell_resistance_7: name: "${bms0} cell resistance 7" cell_resistance_8: name: "${bms0} cell resistance 8" cell_resistance_9: name: "${bms0} cell resistance 9" cell_resistance_10: name: "${bms0} cell resistance 10" cell_resistance_11: name: "${bms0} cell resistance 11" cell_resistance_12: name: "${bms0} cell resistance 12" cell_resistance_13: name: "${bms0} cell resistance 13" cell_resistance_14: name: "${bms0} cell resistance 14" cell_resistance_15: name: "${bms0} cell resistance 15" cell_resistance_16: name: "${bms0} cell resistance 16" cell_resistance_17: name: "${bms0} cell resistance 17" cell_resistance_18: name: "${bms0} cell resistance 18" cell_resistance_19: name: "${bms0} cell resistance 19" cell_resistance_20: name: "${bms0} cell resistance 20" cell_resistance_21: name: "${bms0} cell resistance 21" cell_resistance_22: name: "${bms0} cell resistance 22" cell_resistance_23: name: "${bms0} cell resistance 23" cell_resistance_24: name: "${bms0} cell resistance 24" total_voltage: name: "${bms0} total voltage" current: name: "${bms0} current" heating_current: name: "${bms0} heating current" power: name: "${bms0} power" charging_power: name: "${bms0} charging power" discharging_power: name: "${bms0} discharging power" temperature_sensor_1: name: "${bms0} temperature sensor 1" temperature_sensor_2: name: "${bms0} temperature sensor 2" temperature_sensor_3: name: "${bms0} temperature sensor 3" temperature_sensor_4: name: "${bms0} temperature sensor 4" temperature_sensor_5: name: "${bms0} temperature sensor 5" power_tube_temperature: name: "${bms0} power tube temperature" balancing: name: "${bms0} balancing" state_of_charge: name: "${bms0} state of charge" capacity_remaining: name: "${bms0} capacity remaining" total_battery_capacity_setting: name: "${bms0} total battery capacity setting" charging_cycles: name: "${bms0} charging cycles" total_charging_cycle_capacity: name: "${bms0} total charging cycle capacity" total_runtime: name: "${bms0} total runtime" balancing_current: name: "${bms0} balancing current" errors_bitmask: name: "${bms0} errors bitmask" emergency_time_countdown: name: "${bms0} emergency time countdown" # ... - platform: jk_bms_ble jk_bms_ble_id: bms1 min_cell_voltage: name: "${bms1} min cell voltage" max_cell_voltage: name: "${bms1} max cell voltage" min_voltage_cell: name: "${bms1} min voltage cell" max_voltage_cell: name: "${bms1} max voltage cell" delta_cell_voltage: name: "${bms1} delta cell voltage" average_cell_voltage: name: "${bms1} average cell voltage" cell_voltage_1: name: "${bms1} cell voltage 1" cell_voltage_2: name: "${bms1} cell voltage 2" cell_voltage_3: name: "${bms1} cell voltage 3" cell_voltage_4: name: "${bms1} cell voltage 4" cell_voltage_5: name: "${bms1} cell voltage 5" cell_voltage_6: name: "${bms1} cell voltage 6" cell_voltage_7: name: "${bms1} cell voltage 7" cell_voltage_8: name: "${bms1} cell voltage 8" cell_voltage_9: name: "${bms1} cell voltage 9" cell_voltage_10: name: "${bms1} cell voltage 10" cell_voltage_11: name: "${bms1} cell voltage 11" cell_voltage_12: name: "${bms1} cell voltage 12" cell_voltage_13: name: "${bms1} cell voltage 13" cell_voltage_14: name: "${bms1} cell voltage 14" cell_voltage_15: name: "${bms1} cell voltage 15" cell_voltage_16: name: "${bms1} cell voltage 16" cell_voltage_17: name: "${bms1} cell voltage 17" cell_voltage_18: name: "${bms1} cell voltage 18" cell_voltage_19: name: "${bms1} cell voltage 19" cell_voltage_20: name: "${bms1} cell voltage 20" cell_voltage_21: name: "${bms1} cell voltage 21" cell_voltage_22: name: "${bms1} cell voltage 22" cell_voltage_23: name: "${bms1} cell voltage 23" cell_voltage_24: name: "${bms1} cell voltage 24" cell_resistance_1: name: "${bms1} cell resistance 1" cell_resistance_2: name: "${bms1} cell resistance 2" cell_resistance_3: name: "${bms1} cell resistance 3" cell_resistance_4: name: "${bms1} cell resistance 4" cell_resistance_5: name: "${bms1} cell resistance 5" cell_resistance_6: name: "${bms1} cell resistance 6" cell_resistance_7: name: "${bms1} cell resistance 7" cell_resistance_8: name: "${bms1} cell resistance 8" cell_resistance_9: name: "${bms1} cell resistance 9" cell_resistance_10: name: "${bms1} cell resistance 10" cell_resistance_11: name: "${bms1} cell resistance 11" cell_resistance_12: name: "${bms1} cell resistance 12" cell_resistance_13: name: "${bms1} cell resistance 13" cell_resistance_14: name: "${bms1} cell resistance 14" cell_resistance_15: name: "${bms1} cell resistance 15" cell_resistance_16: name: "${bms1} cell resistance 16" cell_resistance_17: name: "${bms1} cell resistance 17" cell_resistance_18: name: "${bms1} cell resistance 18" cell_resistance_19: name: "${bms1} cell resistance 19" cell_resistance_20: name: "${bms1} cell resistance 20" cell_resistance_21: name: "${bms1} cell resistance 21" cell_resistance_22: name: "${bms1} cell resistance 22" cell_resistance_23: name: "${bms1} cell resistance 23" cell_resistance_24: name: "${bms1} cell resistance 24" total_voltage: name: "${bms1} total voltage" current: name: "${bms1} current" heating_current: name: "${bms1} heating current" power: name: "${bms1} power" charging_power: name: "${bms1} charging power" discharging_power: name: "${bms1} discharging power" temperature_sensor_1: name: "${bms1} temperature sensor 1" temperature_sensor_2: name: "${bms1} temperature sensor 2" temperature_sensor_3: name: "${bms1} temperature sensor 3" temperature_sensor_4: name: "${bms1} temperature sensor 4" temperature_sensor_5: name: "${bms1} temperature sensor 5" power_tube_temperature: name: "${bms1} power tube temperature" balancing: name: "${bms1} balancing" state_of_charge: name: "${bms1} state of charge" capacity_remaining: name: "${bms1} capacity remaining" total_battery_capacity_setting: name: "${bms1} total battery capacity setting" charging_cycles: name: "${bms1} charging cycles" total_charging_cycle_capacity: name: "${bms1} total charging cycle capacity" total_runtime: name: "${bms1} total runtime" balancing_current: name: "${bms1} balancing current" errors_bitmask: name: "${bms1} errors bitmask" emergency_time_countdown: name: "${bms1} emergency time countdown" # ... switch: - platform: jk_bms_ble jk_bms_ble_id: bms0 charging: name: "${bms0} charging" discharging: name: "${bms0} discharging" balancer: name: "${bms0} balancer" emergency: name: "${bms0} emergency" heating: name: "${bms0} heating" disable_temperature_sensors: name: "${bms0} disable temperature sensors" display_always_on: name: "${bms0} display always on" smart_sleep: name: "${bms0} smart sleep" disable_pcl_module: name: "${bms0} disable pcl module" timed_stored_data: name: "${bms0} timed stored data" charging_float_mode: name: "${bms0} charging float mode" - platform: jk_bms_ble jk_bms_ble_id: bms1 charging: name: "${bms1} charging" discharging: name: "${bms1} discharging" balancer: name: "${bms1} balancer" emergency: name: "${bms1} emergency" heating: name: "${bms1} heating" disable_temperature_sensors: name: "${bms1} disable temperature sensors" display_always_on: name: "${bms1} display always on" smart_sleep: name: "${bms1} smart sleep" disable_pcl_module: name: "${bms1} disable pcl module" timed_stored_data: name: "${bms1} timed stored data" charging_float_mode: name: "${bms1} charging float mode" - platform: ble_client ble_client_id: client0 id: ble_client_switch0 name: "${bms0} enable bluetooth connection" - platform: ble_client ble_client_id: client1 id: ble_client_switch1 name: "${bms1} enable bluetooth connection" text_sensor: - platform: jk_bms_ble jk_bms_ble_id: bms0 errors: name: "${bms0} errors" total_runtime_formatted: name: "${bms0} total runtime formatted" - platform: jk_bms_ble jk_bms_ble_id: bms1 errors: name: "${bms1} errors" total_runtime_formatted: name: "${bms1} total runtime formatted"