Code ESP32 đọc hai mạch JK cùng một lúc đầy đủ setting

Chia sẻ với các bạn code yaml nạp vào ESP32 đọc đồng thời 2 mạch JK cùng một lúc với giãn cách mỗi lần đọc là 3s kèm theo khá đầy đủ setting cho các BMS JK mới sau này.

Dưới đây là đoạn mã YAML để nạp vào ESP32

YAML
substitutions:
  name: bms
  bms0: P1
  bms1: P2
  device_description: Monitor and control 2x JK-BMS via Bluetooth
  external_components_source: github://syssi/esphome-jk-bms@main
  bms0_mac_address: C8:47:80:38:7F:87
  bms1_mac_address: A4:C1:38:00:4B:FD
  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: wemos_d1_mini32
  framework:
    type: esp-idf

external_components:
  - source: ${external_components_source}
    refresh: 0s

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  #manual_ip: 
  #  static_ip: 192.168.3.14
  #  gateway: 192.168.3.1
  #  subnet: 255.255.255.0
  ap:
    ssid: BMS Controller AP
    password: password123


ota:
  platform: esphome
  password: "462ed2339a3d7aeb69dd7d2aa546648d"
  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

api:
  encryption:
    key: "TlIponmGa1N1YO/1g3kRGF2SZePLBK9/RgEziZ5w4yU="

esp32_ble_tracker:
  scan_parameters:
    active: true
    interval: 1600ms
    window: 1200ms

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: 3s
    id: bms0
  - ble_client_id: client1
    protocol_version: ${bms1_protocol_version}
    throttle: 3s
    id: bms1

binary_sensor:
  - platform: status
    name: ESP Device Status
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
    balancing:
      name: ${bms0} Balancing
    charging:
      name: ${bms0} Charging
    discharging:
      name: ${bms0} Discharging
    online_status:
      name: ${bms0} Online Status
    heating:
      name: ${bms0} Heating
  - platform: jk_bms_ble
    jk_bms_ble_id: bms1
    balancing:
      name: ${bms1} Balancing
    charging:
      name: ${bms1} Charging
    discharging:
      name: ${bms1} Discharging
    online_status:
      name: ${bms1} Online Status
    heating:
      name: ${bms1} Heating

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
  - platform: restart
    name: ${name} restart

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"
    discharge_precharge_time:
      name: ${bms0} discharge precharge time"
      
  - 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"
    discharge_precharge_time:
      name: ${bms1} discharge precharge time"


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
    total_voltage:
      name: ${bms0} Total Voltage
      id: device0_voltage
    current:
      name: ${bms0} Current
      id: device0_current
    power:
      name: ${bms0} Power
      id: device0_power
    charging_power:
      name: ${bms0} Charging Power
    discharging_power:
      name: ${bms0} Discharging Power
    heating_current:
      name: ${bms0} Heating Current
    power_tube_temperature:
      name: ${bms0} Power Tube Temperature
    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
    state_of_charge:
      name: ${bms0} State of Charge
      id: device0_soc
    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
    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_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
  - 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
    total_voltage:
      name: ${bms1} Total Voltage
      id: device1_voltage
    current:
      name: ${bms1} Current
      id: device1_current
    power:
      name: ${bms1} Power
      id: device1_power
    charging_power:
      name: ${bms1} Charging Power
    discharging_power:
      name: ${bms1} Discharging Power
    heating_current:
      name: ${bms1} Heating Current
    power_tube_temperature:
      name: ${bms1} Power Tube Temperature
    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
    state_of_charge:
      name: ${bms1} State of Charge
      id: device1_soc
    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
    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_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
  - platform: template
    name: Total Power
    id: total_power
    unit_of_measurement: W
    device_class: power
    state_class: measurement
    accuracy_decimals: 2
    lambda: |-
      if (id(device0_power).has_state() && id(device1_power).has_state()) {
        return id(device0_power).state + id(device1_power).state;
      } else {
        return NAN;
      }
    update_interval: 3s
  - platform: template
    name: Total Current
    id: total_current
    unit_of_measurement: A
    device_class: current
    state_class: measurement
    accuracy_decimals: 2
    lambda: |-
      if (id(device0_current).has_state() && id(device1_current).has_state()) {
        return id(device0_current).state + id(device1_current).state;
      } else {
        return NAN;
      }
    update_interval: 3s
  - platform: wifi_signal
    name: WiFi Signal Strength
    update_interval: 60s
  - platform: uptime
    name: ESP Uptime
  - platform: internal_temperature
    name: ESP Internal Temperature

switch:
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
    charging:
      name: ${bms0} Charging
    discharging:
      name: ${bms0} Discharging
    balancer:
      name: ${bms0} Balancer
    heating:
      name: ${bms0} Heating
    emergency:
      name: ${bms0} Emergency
  - platform: jk_bms_ble
    jk_bms_ble_id: bms1
    charging:
      name: ${bms1} Charging
    discharging:
      name: ${bms1} Discharging
    balancer:
      name: ${bms1} Balancer
    heating:
      name: ${bms1} Heating
    emergency:
      name: ${bms1} Emergency
  - platform: ble_client
    ble_client_id: client0
    id: ble_client_switch0
    name: ${bms0} Bluetooth Connection
  - platform: ble_client
    ble_client_id: client1
    id: ble_client_switch1
    name: ${bms1} 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
  - platform: wifi_info
    ip_address:
      name: ESP IP Address
    ssid:
      name: Connected WiFi SSID

Dashboard chứa setting và hiển thị gộp 2 khối pin đã được Việt hóa. Lưu ý, đây không phải là 1 card đơn mà là một màn hình nhé, hãy tạo màn hình hiển thị mới và edit yaml để dán code bên dưới vào.

Ngoài ra mình có chia sẻ giao diện pin tại bài viết bên dưới

Nếu bạn thấy hữu ích đừng quên ủng hộ cho tôi tại đây để giúp thêm động lực phát triển những món khác. Cám ơn !

YAML
type: sections
max_columns: 3
title: Setting BMS
path: setting-bms
icon: mdi:cog-outline
sections:
  - type: grid
    cards:
      - type: heading
        heading: THÔNG SỐ CHUNG 2 Pack
        heading_style: title
        icon: mdi:battery-80-bluetooth
      - type: vertical-stack
        cards:
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                name: Lệch cell
                size: 25%
                entity: sensor.bms_p1_delta_cell_voltage
                show_icon: true
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[
                    return 'eve: ' + 
                           (states['sensor.bms_p1_delta_cell_voltage'] ? Number.parseFloat(states['sensor.bms_p1_delta_cell_voltage'].state).toFixed(3) + ' V' : 'N/A') + 
                           '<br>' + // Sử dụng <br> để xuống dòng
                           'battech: ' + 
                           (states['sensor.bms_p2_delta_cell_voltage'] ? Number.parseFloat(states['sensor.bms_p2_delta_cell_voltage'].state).toFixed(3) + ' V' : 'N/A');
                  ]]]
                icon: mdi:delta
                styles:
                  icon:
                    - color: |
                        [[[
                          if (entity.state < 0.010) return 'darkgreen';
                          if (entity.state < 0.020) return 'darkorange';
                          else return 'red';
                        ]]]
                  card:
                    - font-size: 12px
                    - height: 100px
                    - padding: 10px
                    - white-space: normal;
                    - text-align: left;
              - type: custom:button-card
                name: Pack Voltage
                size: 25%
                entity: sensor.bms_p1_total_voltage
                show_icon: true
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[ 
                    return 'eve: ' + 
                           (states['sensor.bms_p1_total_voltage'] ? Number.parseFloat(states['sensor.bms_p1_total_voltage'].state).toFixed(2) + ' V' : 'N/A') + 
                           '<br>' + // Sử dụng <br> để xuống dòng
                           'battech: ' + 
                           (states['sensor.bms_p2_total_voltage'] ? Number.parseFloat(states['sensor.bms_p2_total_voltage'].state).toFixed(2) + ' V' : 'N/A'); 
                  ]]]
                icon: mdi:server
                styles:
                  icon:
                    - color: |
                        [[[
                          if (entity.state > 48) return 'darkgreen';
                          if (entity.state > 52) return 'darkorange';
                          else return 'red';
                        ]]]
                  card:
                    - font-size: 12px
                    - height: 100px
                    - padding: 10px
                    - white-space: normal;
                    - text-align: left;
              - type: custom:button-card
                name: |
                  [[[
                    if (entity.state < 0) return "Discharging";
                    else
                      return "Charging";
                  ]]]
                size: 25%
                entity: sensor.bms_p1_power
                show_icon: true
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[ 
                    return 'eve: ' + 
                           (states['sensor.bms_p1_power'] ? Number.parseFloat(states['sensor.bms_p1_power'].state).toFixed(1) + ' W' : 'N/A') + 
                           '<br>' + // Sử dụng <br> để xuống dòng
                           'battech: ' + 
                           (states['sensor.bms_p2_power'] ? Number.parseFloat(states['sensor.bms_p2_power'].state).toFixed(1) + ' W' : 'N/A'); 
                  ]]]
                icon: |
                  [[[
                    if (entity.state < 0) return "mdi:battery-arrow-down-outline";
                    else
                      return "mdi:battery-arrow-up-outline";
                  ]]]
                styles:
                  icon:
                    - color: |
                        [[[
                          if (entity.state > 5000) return 'darkred';
                          if (entity.state > 1000) return 'darkorange';
                          if (entity.state < -5000) return 'darkred';
                          if (entity.state < -1000) return 'darkorange';
                          else return 'darkgreen';
                        ]]]
                  card:
                    - font-size: 12px
                    - height: 100px
                    - padding: 10px
                    - white-space: normal;
                    - text-align: left;
          - type: horizontal-stack
            cards:
              - type: custom:button-card
                name: SOC
                size: 25%
                entity: sensor.bms_p1_state_of_charge
                show_icon: true
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[ 
                    return 'eve: ' + 
                           (states['sensor.bms_p1_state_of_charge'] ? Number.parseFloat(states['sensor.bms_p1_state_of_charge'].state).toFixed(1) + ' %' : 'N/A') + 
                           '<br>' + // Sử dụng <br> để xuống dòng
                           'battech: ' + 
                           (states['sensor.bms_p2_state_of_charge'] ? Number.parseFloat(states['sensor.bms_p2_state_of_charge'].state).toFixed(1) + ' %' : 'N/A'); 
                  ]]]
                icon: |
                  [[[
                    if (entity.state > 90) return "mdi:battery";
                    if (entity.state > 80) return "mdi:battery-90";
                    if (entity.state > 70) return "mdi:battery-80";
                    if (entity.state > 60) return "mdi:battery-70";
                    if (entity.state > 50) return "mdi:battery-60";
                    if (entity.state > 40) return "mdi:battery-50";
                    if (entity.state > 30) return "mdi:battery-40";
                    if (entity.state > 20) return "mdi:battery-30";
                    if (entity.state > 10) return "mdi:battery-20";
                    else return "mdi:battery-alert-variant-outline";
                  ]]]
                styles:
                  icon:
                    - color: |
                        [[[
                          if (entity.state > 30 ) return 'darkgreen';
                          if (entity.state > 15 ) return 'yellow';
                          else return 'red';
                        ]]]
                  card:
                    - font-size: 12px
                    - height: 100px
                    - padding: 10px
                    - white-space: normal;
                    - text-align: left;
              - type: custom:button-card
                name: Dung Lượng
                size: 25Ah
                entity: sensor.bms_p1_capacity_remaining
                show_icon: true
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[ 
                    return 'eve: ' + 
                           (states['sensor.bms_p1_capacity_remaining'] ? Number.parseFloat(states['sensor.bms_p1_capacity_remaining'].state).toFixed(0) + ' Ah' : 'N/A') + 
                           '<br>' + // Sử dụng <br> để xuống dòng
                           'battech: ' + 
                           (states['sensor.bms_p2_capacity_remaining'] ? Number.parseFloat(states['sensor.bms_p2_capacity_remaining'].state).toFixed(0) + ' Ah' : 'N/A'); 
                  ]]]
                icon: |
                  [[[
                    if (entity.state > 99) return "mdi:check-circle";
                    if (entity.state > 95) return "mdi:alert-circle";
                    else return "mdi:cancel";
                  ]]]
                styles:
                  icon:
                    - color: |
                        [[[
                          if (entity.state > 99) return 'darkgreen';
                          if (entity.state > 95) return 'darkorange';
                          else return 'red';
                        ]]]
                  card:
                    - font-size: 12px
                    - height: 100px
                    - padding: 10px
                    - white-space: normal;
                    - text-align: left;
              - type: custom:button-card
                name: |
                  [[[
                    if (entity.state < 0) return "Discharging";
                    else
                      return "Charging";
                  ]]]
                size: 25%
                entity: sensor.bms_p1_current
                show_icon: true
                show_name: true
                show_state: false
                show_label: true
                label: |
                  [[[ 
                    return 'eve: ' + 
                           (states['sensor.bms_p1_current'] ? Number.parseFloat(states['sensor.bms_p1_current'].state).toFixed(1) + ' A' : 'N/A') + 
                           '<br>' + // Sử dụng <br> để xuống dòng
                           'battech: ' + 
                           (states['sensor.bms_p2_current'] ? Number.parseFloat(states['sensor.bms_p2_current'].state).toFixed(1) + ' A' : 'N/A'); 
                  ]]]
                icon: |
                  [[[
                    if (entity.state < 0) return "mdi:battery-arrow-down-outline";
                    else
                      return "mdi:battery-arrow-up-outline";
                  ]]]
                styles:
                  icon:
                    - color: |
                        [[[
                          if (entity.state > 5000) return 'darkred';
                          if (entity.state > 1000) return 'darkorange';
                          if (entity.state < -5000) return 'darkred';
                          if (entity.state < -1000) return 'darkorange';
                          else return 'darkgreen';
                        ]]]
                  card:
                    - font-size: 12px
                    - height: 100px
                    - padding: 10px
                    - white-space: normal;
                    - text-align: left;
          - type: custom:bar-card
            direction: up
            columns: 8
            decimal: 3
            max: 3.45
            min: 3
            height: 80px
            severity:
              - color: darkred
                from: 3.45
                to: 4
              - color: darkorange
                from: 3.4
                to: 3.45
              - color: rgb(189, 164, 66)
                from: 3.1
                to: 3.4
              - color: darkred
                from: 2.5
                to: 3.1
            positions:
              icon: "off"
              indicator: inside
              name: outside
            card_mod:
              style: |-
                bar-card-value {
                  margin-right: auto;
                  margin-left: auto;
                  margin-bottom: 35px;
                  font-size: 10px;
                  font-weight: normal;
                  text-shadow: 1px 1px #0005;
                }
                bar-card-name {
                  margin-right: auto;
                  margin-left: auto;
                  margin-bottom: 0px;
                  font-size: 10px;
                  font-weight: normal;
                  text-shadow: 1px 1px #0005;
                }
            entities:
              - entity: sensor.bms_p1_cell_voltage_1
                name: Cell 01
              - entity: sensor.bms_p1_cell_voltage_2
                name: Cell 02
              - entity: sensor.bms_p1_cell_voltage_3
                name: Cell 03
              - entity: sensor.bms_p1_cell_voltage_4
                name: Cell 04
              - entity: sensor.bms_p1_cell_voltage_5
                name: Cell 05
              - entity: sensor.bms_p1_cell_voltage_6
                name: Cell 06
              - entity: sensor.bms_p1_cell_voltage_7
                name: Cell 07
              - entity: sensor.bms_p1_cell_voltage_8
                name: Cell 08
              - entity: sensor.bms_p1_cell_voltage_9
                name: Cell 09
              - entity: sensor.bms_p1_cell_voltage_10
                name: Cell 10
              - entity: sensor.bms_p1_cell_voltage_11
                name: Cell 11
              - entity: sensor.bms_p1_cell_voltage_12
                name: Cell 12
              - entity: sensor.bms_p1_cell_voltage_13
                name: Cell 13
              - entity: sensor.bms_p1_cell_voltage_14
                name: Cell 14
              - entity: sensor.bms_p1_cell_voltage_15
                name: Cell 15
              - entity: sensor.bms_p1_cell_voltage_16
                name: Cell 16
          - type: custom:bar-card
            direction: up
            columns: 8
            decimal: 3
            max: 3.45
            min: 3
            height: 80px
            severity:
              - color: darkred
                from: 3.45
                to: 4
              - color: darkorange
                from: 3.4
                to: 3.45
              - color: rgb(9, 122, 214)
                from: 3.1
                to: 3.4
              - color: darkred
                from: 2.5
                to: 3.1
            positions:
              icon: "off"
              indicator: inside
              name: outside
            card_mod:
              style: |-
                bar-card-value {
                  margin-right: auto;
                  margin-left: auto;
                  margin-bottom: 35px;
                  font-size: 10px;
                  font-weight: normal;
                  text-shadow: 1px 1px #0005;
                }
                bar-card-name {
                  margin-right: auto;
                  margin-left: auto;
                  margin-bottom: 0px;
                  font-size: 10px;
                  font-weight: normal;
                  text-shadow: 1px 1px #0005;
                }
            entities:
              - entity: sensor.bms_p2_cell_voltage_1
                name: Cell 01
              - entity: sensor.bms_p2_cell_voltage_2
                name: Cell 02
              - entity: sensor.bms_p2_cell_voltage_3
                name: Cell 03
              - entity: sensor.bms_p2_cell_voltage_4
                name: Cell 04
              - entity: sensor.bms_p2_cell_voltage_5
                name: Cell 05
              - entity: sensor.bms_p2_cell_voltage_6
                name: Cell 06
              - entity: sensor.bms_p2_cell_voltage_7
                name: Cell 07
              - entity: sensor.bms_p2_cell_voltage_8
                name: Cell 08
              - entity: sensor.bms_p2_cell_voltage_9
                name: Cell 09
              - entity: sensor.bms_p2_cell_voltage_10
                name: Cell 10
              - entity: sensor.bms_p2_cell_voltage_11
                name: Cell 11
              - entity: sensor.bms_p2_cell_voltage_12
                name: Cell 12
              - entity: sensor.bms_p2_cell_voltage_13
                name: Cell 13
              - entity: sensor.bms_p2_cell_voltage_14
                name: Cell 14
              - entity: sensor.bms_p2_cell_voltage_15
                name: Cell 15
              - entity: sensor.bms_p2_cell_voltage_16
                name: Cell 16
  - type: grid
    cards:
      - type: heading
        heading: SETTING BATTECH 🔋
        heading_style: title
        icon: mdi:battery-80-bluetooth
      - type: entities
        title: Cài đặt chi tiết BMS P2
        state_color: true
        entities:
          - type: section
            label: Cài đặt chung & Dung lượng
          - entity: number.bms_p2_cell_count
            name: Số lượng cell
          - entity: number.bms_p2_total_battery_capacity
            name: Tổng dung lượng pin (Ah)
          - entity: number.bms_p2_power_off_voltage
            name: Điện áp tắt nguồn (V)
          - entity: number.bms_p2_smart_sleep_voltage
            name: Điện áp ngủ thông minh (V)
          - type: section
            label: Bảo vệ Điện áp Cell
          - entity: number.bms_p2_cell_voltage_overvoltage_protection
            name: "Cell: Bảo vệ quá áp (V)"
          - entity: number.bms_p2_cell_voltage_overvoltage_recovery
            name: "Cell: Phục hồi quá áp (V)"
          - entity: number.bms_p2_cell_voltage_undervoltage_protection
            name: "Cell: Bảo vệ dưới áp (V)"
          - entity: number.bms_p2_cell_voltage_undervoltage_recovery
            name: "Cell: Phục hồi dưới áp (V)"
          - type: section
            label: Cân bằng Cell
          - entity: number.bms_p2_balance_starting_voltage
            name: "Cân bằng: Điện áp bắt đầu (V)"
          - entity: number.bms_p2_balance_trigger_voltage
            name: "Cân bằng: Chênh lệch kích hoạt (V)"
          - entity: number.bms_p2_max_balance_current
            name: "Cân bằng: Dòng tối đa (A)"
          - type: section
            label: Cài đặt Sạc
          - entity: number.bms_p2_max_charge_current
            name: "Sạc: Dòng tối đa (A)"
          - entity: number.bms_p2_charge_overcurrent_protection_delay
            name: "Sạc - Quá dòng: Độ trễ (s)"
          - entity: number.bms_p2_charge_overcurrent_protection_recovery_time
            name: "Sạc - Quá dòng: Phục hồi (s)"
          - entity: number.bms_p2_charge_overtemperature_protection
            name: "Sạc - Quá nhiệt: Ngưỡng (°C)"
          - entity: number.bms_p2_charge_overtemperature_protection_recovery
            name: "Sạc - Quá nhiệt: Phục hồi (°C)"
          - entity: number.bms_p2_charge_undertemperature_protection
            name: "Sạc - Dưới nhiệt: Ngưỡng (°C)"
          - entity: number.bms_p2_charge_undertemperature_protection_recovery
            name: "Sạc - Dưới nhiệt: Phục hồi (°C)"
          - type: section
            label: Cài đặt Xả
          - entity: number.bms_p2_max_discharge_current
            name: "Xả: Dòng tối đa (A)"
          - entity: number.bms_p2_discharge_precharge_time
            name: "Xả: Thời gian sạc mồi (ms)"
          - entity: number.bms_p2_discharge_overcurrent_protection_delay
            name: "Xả - Quá dòng: Độ trễ (s)"
          - entity: number.bms_p2_discharge_overcurrent_protection_recovery_time
            name: "Xả - Quá dòng: Phục hồi (s)"
          - entity: number.bms_p2_discharge_overtemperature_protection
            name: "Xả - Quá nhiệt: Ngưỡng (°C)"
          - entity: number.bms_p2_discharge_overtemperature_protection_recovery
            name: "Xả - Quá nhiệt: Phục hồi (°C)"
          - type: section
            label: Bảo vệ Khác
          - entity: number.bms_p2_power_tube_overtemperature_protection
            name: Bảo vệ quá nhiệt Mosfet (°C)
          - entity: number.bms_p2_power_tube_overtemperature_protection_recovery
            name: Phục hồi quá nhiệt Mosfet (°C)
          - entity: number.bms_p2_short_circuit_protection_delay
            name: "Ngắn mạch: Độ trễ (µs)"
          - entity: number.bms_p2_short_circuit_protection_recovery_time
            name: "Ngắn mạch: Thời gian phục hồi (s)"
          - type: section
            label: Hiệu chỉnh & Nâng cao
          - entity: number.bms_p2_voltage_calibration
            name: "Hiệu chỉnh: Điện áp"
          - entity: number.bms_p2_current_calibration
            name: "Hiệu chỉnh: Dòng điện"
          - entity: number.bms_p2_cell_soc0_voltage
            name: "Hiệu chỉnh: Điện áp SOC 0% (V)"
          - entity: number.bms_p2_cell_soc100_voltage
            name: "Hiệu chỉnh: Điện áp SOC 100% (V)"
          - entity: number.bms_p2_cell_request_charge_voltage
            name: "Yêu cầu: Điện áp sạc (V)"
          - entity: number.bms_p2_cell_request_charge_voltage_time
            name: "Yêu cầu: Thời gian giữ áp sạc (s)"
          - entity: number.bms_p2_cell_request_float_voltage
            name: "Yêu cầu: Điện áp thả nổi (V)"
          - entity: number.bms_p2_cell_request_float_voltage_time
            name: "Yêu cầu: Thời gian giữ áp thả nổi (s)"
  - type: grid
    cards:
      - type: heading
        heading: SETTING EVE
        heading_style: title
        icon: mdi:battery-80-bluetooth
      - type: entities
        title: Cài đặt chi tiết BMS P1
        state_color: true
        entities:
          - type: section
            label: Cài đặt chung & Dung lượng
          - entity: number.bms_p1_cell_count
            name: Số lượng cell
          - entity: number.bms_p1_total_battery_capacity
            name: Tổng dung lượng pin (Ah)
          - entity: number.bms_p1_power_off_voltage
            name: Điện áp tắt nguồn (V)
          - entity: number.bms_p1_smart_sleep_voltage
            name: Điện áp ngủ thông minh (V)
          - type: section
            label: Bảo vệ Điện áp Cell
          - entity: number.bms_p1_cell_voltage_overvoltage_protection
            name: "Cell: Bảo vệ quá áp (V)"
          - entity: number.bms_p1_cell_voltage_overvoltage_recovery
            name: "Cell: Phục hồi quá áp (V)"
          - entity: number.bms_p1_cell_voltage_undervoltage_protection
            name: "Cell: Bảo vệ dưới áp (V)"
          - entity: number.bms_p1_cell_voltage_undervoltage_recovery
            name: "Cell: Phục hồi dưới áp (V)"
          - type: section
            label: Cân bằng Cell
          - entity: number.bms_p1_balance_starting_voltage
            name: "Cân bằng: Điện áp bắt đầu (V)"
          - entity: number.bms_p1_balance_trigger_voltage
            name: "Cân bằng: Chênh lệch kích hoạt (V)"
          - entity: number.bms_p1_max_balance_current
            name: "Cân bằng: Dòng tối đa (A)"
          - type: section
            label: Cài đặt Sạc
          - entity: number.bms_p1_max_charge_current
            name: "Sạc: Dòng tối đa (A)"
          - entity: number.bms_p1_charge_overcurrent_protection_delay
            name: "Sạc - Quá dòng: Độ trễ (s)"
          - entity: number.bms_p1_charge_overcurrent_protection_recovery_time
            name: "Sạc - Quá dòng: Phục hồi (s)"
          - entity: number.bms_p1_charge_overtemperature_protection
            name: "Sạc - Quá nhiệt: Ngưỡng (°C)"
          - entity: number.bms_p1_charge_overtemperature_protection_recovery
            name: "Sạc - Quá nhiệt: Phục hồi (°C)"
          - entity: number.bms_p1_charge_undertemperature_protection
            name: "Sạc - Dưới nhiệt: Ngưỡng (°C)"
          - entity: number.bms_p1_charge_undertemperature_protection_recovery
            name: "Sạc - Dưới nhiệt: Phục hồi (°C)"
          - type: section
            label: Cài đặt Xả
          - entity: number.bms_p1_max_discharge_current
            name: "Xả: Dòng tối đa (A)"
          - entity: number.bms_p1_discharge_precharge_time
            name: "Xả: Thời gian sạc mồi (ms)"
          - entity: number.bms_p1_discharge_overcurrent_protection_delay
            name: "Xả - Quá dòng: Độ trễ (s)"
          - entity: number.bms_p1_discharge_overcurrent_protection_recovery_time
            name: "Xả - Quá dòng: Phục hồi (s)"
          - entity: number.bms_p1_discharge_overtemperature_protection
            name: "Xả - Quá nhiệt: Ngưỡng (°C)"
          - entity: number.bms_p1_discharge_overtemperature_protection_recovery
            name: "Xả - Quá nhiệt: Phục hồi (°C)"
          - type: section
            label: Bảo vệ Khác
          - entity: number.bms_p1_power_tube_overtemperature_protection
            name: Bảo vệ quá nhiệt Mosfet (°C)
          - entity: number.bms_p1_power_tube_overtemperature_protection_recovery
            name: Phục hồi quá nhiệt Mosfet (°C)
          - entity: number.bms_p1_short_circuit_protection_delay
            name: "Ngắn mạch: Độ trễ (µs)"
          - entity: number.bms_p1_short_circuit_protection_recovery_time
            name: "Ngắn mạch: Thời gian phục hồi (s)"
          - type: section
            label: Hiệu chỉnh & Nâng cao
          - entity: number.bms_p1_voltage_calibration
            name: "Hiệu chỉnh: Điện áp"
          - entity: number.bms_p1_current_calibration
            name: "Hiệu chỉnh: Dòng điện"
          - entity: number.bms_p1_cell_soc0_voltage
            name: "Hiệu chỉnh: Điện áp SOC 0% (V)"
          - entity: number.bms_p1_cell_soc100_voltage
            name: "Hiệu chỉnh: Điện áp SOC 100% (V)"
          - entity: number.bms_p1_cell_request_charge_voltage
            name: "Yêu cầu: Điện áp sạc (V)"
          - entity: number.bms_p1_cell_request_charge_voltage_time
            name: "Yêu cầu: Thời gian giữ áp sạc (s)"
          - entity: number.bms_p1_cell_request_float_voltage
            name: "Yêu cầu: Điện áp thả nổi (V)"
          - entity: number.bms_p1_cell_request_float_voltage_time
            name: "Yêu cầu: Thời gian giữ áp thả nổi (s)"
cards: []
badges:
  - type: custom:mushroom-template-badge
    icon: mdi:restart
    entity: button.bms_bms_restart
    content: Restart
    color: green
    tap_action:
      action: toggle
5 1 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận
0
Rất thích suy nghĩ của bạn, hãy bình luận.x