syssi / esphome-jk-bms

ESPHome component to monitor and control a Jikong Battery Management System (JK-BMS) via UART-TTL or BLE
Apache License 2.0
442 stars 148 forks source link

Some improvements #301

Closed preussal closed 1 month ago

preussal commented 1 year ago

Some improvements

such as Total_charging_Cycle_capacity Ah -> kAh image

sensor:
  - platform: jk_bms_ble
    total_charging_cycle_capacity:
      name: "${name} total charging cycle capacity"
      # Convert Ah to kAh
      state_class: "total_increasing"
      unit_of_measurement: kAh
      icon: mdi:counter
      accuracy_decimals: 3
      filters:
        - multiply: 0.001

For home assistant the determination of how much kWh was charged and discharged image

sensor:
  - platform: jk_bms_ble
    charging_power:
      name: "${name} charging power"
      id: bms0_charging_power
      unit_of_measurement: W
      device_class: energy
      state_class: measurement
      entity_category: diagnostic

    discharging_power:
      name: "${name} discharging power"
      id: bms0_discharging_power
      unit_of_measurement: W
      device_class: energy
      state_class: measurement
      entity_category: diagnostic

  - platform: total_daily_energy
    name: "${name} Total Charging Energy Today"
    power_id: bms0_charging_power
    unit_of_measurement: kWh
    icon: mdi:counter
    accuracy_decimals: 3
    restore: true
    filters:
      - multiply: 0.001

  - platform: total_daily_energy
    name: "${name} Total Discharging Energy Today"
    power_id: bms0_discharging_power
    unit_of_measurement: kWh
    icon: mdi:counter
    accuracy_decimals: 3
    restore: true
    filters:
      - multiply: 0.001  

Restart Switch to reboot the ESP. And hiding the Bluetooth Switch.

switch:
  # Restart the ESP via Rebooting safely
  - platform: restart
    name: "${name} Restart / Reboot Device"
    icon: "mdi:restart"

  - platform: ble_client
    ble_client_id: client0
    name: "${name} enable bluetooth connection"
    # Hide the Switch
    internal: True

And finally a web portal on the ESP. This requires a separate component under ESP IDF image

external_components:
  # Syssi esphome-JK-BMS
  - source: github://syssi/esphome-jk-bms@main
    refresh: 0s
  # Captive_portal für esp-idf
  - source: github://pr#3500
    refresh: 0s
    components:
      # list all components modified by this Pull Request here
      - web_server
      - web_server_idf
      - web_server_base
      - captive_portal

web_server:
  port: 80
captive_portal:

And here my complete config file

substitutions:
  name: "jk-bms1-ble"
  device_description: "Monitor and control a JK-BMS via bluetooth"
  bms_mac_address: MAC-ADDRESS-OF-THE-BMS
  # Defaults to "JK02"
  # Please use "JK02_32S" if you own a JK-B2A8S20P >= hardware version 11+ (f.e. JK-B2A8S20P hw 11.XW, sw 11.26)
  # Please use "JK04" if you have some old JK-BMS <= hardware version 3 (f.e. JK-B2A16S hw 3.0, sw. 3.3.0)
  protocol_version: JK02

esphome:
  name: ${name}
  comment: ${device_description}
  project:
    name: "syssi.esphome-jk-bms"
    version: 1.4.0
  platformio_options:
    build_flags: 
      - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=32768

esp32:
  board: nodemcu-32s
  variant: esp32
  framework:
    type: esp-idf

external_components:
  # Syssi esphome-JK-BMS
  - source: github://syssi/esphome-jk-bms@main
    refresh: 0s
  # Captive_portal für esp-idf
  - source: github://pr#3500
    refresh: 0s
    components:
      # list all components modified by this Pull Request here
      - web_server
      - web_server_idf
      - web_server_base
      - captive_portal

web_server:
  port: 80
captive_portal:

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

  # Only works with arduino
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  #ap:
  #  ssid: ${name}
  #  password: ${name}

# Enable Home Assistant API
api:
  encryption:
    key: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

ota:
  password: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

logger:
  #level: INFO

mqtt:
  broker: !secret mqtt_host
  username: !secret mqtt_username
  password: !secret mqtt_password
  port: 1883
  id: mqtt_client

time:
  - platform: sntp
    id: sntp_time

esp32_ble_tracker:
  on_ble_advertise:
    - mac_address: ${bms_mac_address}
      then:
        - lambda: |-
            if (x.get_name().rfind("JK-", 0) == 0) {
              ESP_LOGI("ble_adv", "New JK-BMS found");
              ESP_LOGI("ble_adv", "  Name: %s", x.get_name().c_str());
              ESP_LOGI("ble_adv", "  MAC address: %s", x.address_str().c_str());
              ESP_LOGD("ble_adv", "  Advertised service UUIDs:");
              for (auto uuid : x.get_service_uuids()) {
                ESP_LOGD("ble_adv", "    - %s", uuid.to_string().c_str());
              }
            }

ble_client:
  - mac_address: ${bms_mac_address}
    id: client0

jk_bms_ble:
  - ble_client_id: client0
    protocol_version: ${protocol_version}
    throttle: 5s
    id: bms0

binary_sensor:
  - platform: jk_bms_ble
    balancing:
      name: "${name} balancing"
    online_status:
      name: "${name} online status"
    charging:
      name: "${name} charging"
    discharging:
      name: "${name} discharging"

button:
  - platform: jk_bms_ble
    #retrieve_settings:
    #  name: "${name} retrieve settings"
    #retrieve_device_info:
    #  name: "${name} retrieve device info"

number:
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
#    balance_trigger_voltage:
#      name: "${name} balance trigger voltage"
    cell_count:
      name: "${name} cell count"
    total_battery_capacity:
      name: "${name} total battery capacity"
#    cell_voltage_overvoltage_protection:
#      name: "${name} cell voltage overvoltage protection"
#    cell_voltage_overvoltage_recovery:
#      name: "${name} cell voltage overvoltage recovery"
#    cell_voltage_undervoltage_protection:
#      name: "${name} cell voltage undervoltage protection"
#    cell_voltage_undervoltage_recovery:
#      name: "${name} cell voltage undervoltage recovery"
#    balance_starting_voltage:
#      name: "${name} balance starting voltage"
#    voltage_calibration:
#      name: "${name} voltage calibration"
#    current_calibration:
#      name: "${name} current calibration"
#    power_off_voltage:
#      name: "${name} power off voltage"
#    max_balance_current:
#      name: "${name} max balance current"
#    max_charge_current:
#      name: "${name} max charge current"
#    max_discharge_current:
#      name: "${name} max discharge current"

sensor:
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
    min_cell_voltage:
      name: "${name} min cell voltage"
    max_cell_voltage:
      name: "${name} max cell voltage"
    min_voltage_cell:
      name: "${name} min voltage cell"
    max_voltage_cell:
      name: "${name} max voltage cell"
    delta_cell_voltage:
      name: "${name} delta cell voltage"
    average_cell_voltage:
      name: "${name} average cell voltage"

    cell_voltage_1:
      name: "${name} cell voltage 1"
    cell_voltage_2:
      name: "${name} cell voltage 2"
    cell_voltage_3:
      name: "${name} cell voltage 3"
    cell_voltage_4:
      name: "${name} cell voltage 4"
    cell_voltage_5:
      name: "${name} cell voltage 5"
    cell_voltage_6:
      name: "${name} cell voltage 6"
    cell_voltage_7:
      name: "${name} cell voltage 7"
    cell_voltage_8:
      name: "${name} cell voltage 8"
    cell_voltage_9:
      name: "${name} cell voltage 9"
    cell_voltage_10:
      name: "${name} cell voltage 10"
    cell_voltage_11:
      name: "${name} cell voltage 11"
    cell_voltage_12:
      name: "${name} cell voltage 12"
    cell_voltage_13:
      name: "${name} cell voltage 13"
    cell_voltage_14:
      name: "${name} cell voltage 14"
    cell_voltage_15:
      name: "${name} cell voltage 15"
    cell_voltage_16:
      name: "${name} cell voltage 16"
#    cell_voltage_17:
#      name: "${name} cell voltage 17"
#    cell_voltage_18:
#      name: "${name} cell voltage 18"
#    cell_voltage_19:
#      name: "${name} cell voltage 19"
#    cell_voltage_20:
#      name: "${name} cell voltage 20"
#    cell_voltage_21:
#      name: "${name} cell voltage 21"
#    cell_voltage_22:
#      name: "${name} cell voltage 22"
#    cell_voltage_23:
#      name: "${name} cell voltage 23"
#    cell_voltage_24:
#      name: "${name} cell voltage 24"

    cell_resistance_1:
      name: "${name} cell resistance 1"
    cell_resistance_2:
      name: "${name} cell resistance 2"
    cell_resistance_3:
      name: "${name} cell resistance 3"
    cell_resistance_4:
      name: "${name} cell resistance 4"
    cell_resistance_5:
      name: "${name} cell resistance 5"
    cell_resistance_6:
      name: "${name} cell resistance 6"
    cell_resistance_7:
      name: "${name} cell resistance 7"
    cell_resistance_8:
      name: "${name} cell resistance 8"
    cell_resistance_9:
      name: "${name} cell resistance 9"
    cell_resistance_10:
      name: "${name} cell resistance 10"
    cell_resistance_11:
      name: "${name} cell resistance 11"
    cell_resistance_12:
      name: "${name} cell resistance 12"
    cell_resistance_13:
      name: "${name} cell resistance 13"
    cell_resistance_14:
      name: "${name} cell resistance 14"
    cell_resistance_15:
      name: "${name} cell resistance 15"
    cell_resistance_16:
      name: "${name} cell resistance 16"
#    cell_resistance_17:
#      name: "${name} cell resistance 17"
#    cell_resistance_18:
#      name: "${name} cell resistance 18"
#    cell_resistance_19:
#      name: "${name} cell resistance 19"
#    cell_resistance_20:
#      name: "${name} cell resistance 20"
#    cell_resistance_21:
#      name: "${name} cell resistance 21"
#    cell_resistance_22:
#      name: "${name} cell resistance 22"
#    cell_resistance_23:
#      name: "${name} cell resistance 23"
#    cell_resistance_24:
#      name: "${name} cell resistance 24"

    total_voltage:
      name: "${name} total voltage"
    current:
      name: "${name} current"
    power:
      name: "${name} power"

    charging_power:
      name: "${name} charging power"
      id: bms0_charging_power
      unit_of_measurement: W
      device_class: energy
      state_class: measurement
      entity_category: diagnostic

    discharging_power:
      name: "${name} discharging power"
      id: bms0_discharging_power
      unit_of_measurement: W
      device_class: energy
      state_class: measurement
      entity_category: diagnostic

    temperature_sensor_1:
      name: "${name} temperature sensor 1"
    temperature_sensor_2:
      name: "${name} temperature sensor 2"
    power_tube_temperature:
      name: "${name} power tube temperature"

    state_of_charge:
      name: "${name} state of charge"
    capacity_remaining:
      name: "${name} capacity remaining"
    total_battery_capacity_setting:
      name: "${name} total battery capacity setting"
    charging_cycles:
      name: "${name} charging cycles"

    total_charging_cycle_capacity:
      name: "${name} total charging cycle capacity"
      # Convert Ah to kAh
      state_class: "total_increasing"
      unit_of_measurement: kAh
      icon: mdi:counter
      accuracy_decimals: 3
      filters:
        - multiply: 0.001

    total_runtime:
      name: "${name} total runtime"
    balancing_current:
      name: "${name} balancing current"
#    errors_bitmask:
#      name: "${name} errors bitmask"

  - platform: total_daily_energy
    name: "${name} Total Charging Energy Today"
    power_id: bms0_charging_power
    unit_of_measurement: kWh
    icon: mdi:counter
    accuracy_decimals: 3
    restore: true
    filters:
      - multiply: 0.001

  - platform: total_daily_energy
    name: "${name} Total Discharging Energy Today"
    power_id: bms0_discharging_power
    unit_of_measurement: kWh
    icon: mdi:counter
    accuracy_decimals: 3
    restore: true
    filters:
      - multiply: 0.001    

switch:
  # Restart the ESP via Rebooting safely
  - platform: restart
    name: "${name} Restart / Reboot Device"
    icon: "mdi:restart"

  - platform: jk_bms_ble
    charging:
      name: "${name} charging"
    discharging:
      name: "${name} discharging"
    balancer:
      name: "${name} balancer"

  - platform: ble_client
    ble_client_id: client0
    name: "${name} enable bluetooth connection"
    internal: True

text_sensor:
  - platform: jk_bms_ble
    #errors:
    #  name: "${name} errors"
    total_runtime_formatted:
      name: "${name} total runtime formatted"

image

syssi commented 1 year ago

Thanks for your support! One minor remark: Feel free to remove the enable bluetooth connection switch if you don't need them. Defining the entity as internal doesn't mark much sense if you don't want to use the entity by automations.

preussal commented 1 year ago

I've already tried that. But when building, he said that he couldn't find the component.

syssi commented 1 year ago

Try a clean build:

esphome clean yourconfig.yaml
esphome run yourconfig.yaml
strelok commented 11 months ago

@syssi maybe you know why I don't have balancing current and switch for example? it's available only via BLE? I'm using 'esp32-example.yaml' from you repo, UART-TTL (RS485).

syssi commented 10 months ago

@strelok The balancing current is available via BLE only. The balancer switch should be available via UART-TTL but doesn't work on new devices/hardware version probably.

See https://github.com/syssi/esphome-jk-bms/blob/main/components/jk_bms/switch/__init__.py#L20-L21