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"