From 9f82653953b0780bbcec59f9865aa0d3ce40230e Mon Sep 17 00:00:00 2001 From: Txu Date: Tue, 2 Jul 2024 00:55:34 +0200 Subject: [PATCH] uploaded a Home Assistant Dashboard --- .../0bms_master_and_2bms_slaves.yaml | 2272 +++++++++++++++++ 1 file changed, 2272 insertions(+) create mode 100644 components/jk_rs485_bms/home_assistant_dashboards/0bms_master_and_2bms_slaves.yaml diff --git a/components/jk_rs485_bms/home_assistant_dashboards/0bms_master_and_2bms_slaves.yaml b/components/jk_rs485_bms/home_assistant_dashboards/0bms_master_and_2bms_slaves.yaml new file mode 100644 index 00000000..c3e2fe63 --- /dev/null +++ b/components/jk_rs485_bms/home_assistant_dashboards/0bms_master_and_2bms_slaves.yaml @@ -0,0 +1,2272 @@ +title: JK-BMS monitor +views: + - title: WHOLE SYSTEM + path: default_view + badges: [] + cards: + - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + + {%- set total_bms = namespace(value=0) %} {%- set + total_online_bms = namespace(value=0) %} {% for idx in + range(0, 16)-%} + {% if states('binary_sensor.esp32_s3_jk_bms_%d_status_online' % idx)=='on' or states('binary_sensor.rs485_bms%d_status_online' % idx)=='off' %} + {% set total_bms.value = total_bms.value +1 %} + {% if states('binary_sensor.esp32_s3_jk_bms_%d_status_online' % idx)=='on' %} + {% set total_online_bms.value = total_online_bms.value +1 %} + {% endif %} + {%- endif %} + + {% endfor %}
ONLINE BMSs: + {{total_online_bms.value}}/{{total_bms.value}}
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set power_draw = + states('sensor.esp32_s3_jk_bms_1_battery_power')|float + + states('sensor.esp32_s3_jk_bms_2_battery_power')|float %} + {%- set power_charging = + states('sensor.esp32_s3_jk_bms_1_battery_power_charging')|float + + + states('sensor.esp32_s3_jk_bms_2_battery_power_charging')|float + %} {%- set power_discharging = + states('sensor.esp32_s3_jk_bms_1_battery_power_discharging')|float + + + states('sensor.esp32_s3_jk_bms_2_battery_power_discharging')|float + %} + + {%- set power_label = "(charging)" if (power_charging)>0 + else "(discharging)" if (power_discharging)>0 + else "" %} + + {%- set power_value = power_charging if + (power_charging)>0 + else power_discharging if (power_discharging)>0 + else power_draw %} + + {%- set font_start = '' if + (power_charging)>0 + else '' if (power_discharging)>0 + else '' %} + + {%- set font_end = '' if (power_charging)>0 or + (power_discharging)>0 else '' %} + +
{{font_start}}{{ "%.3f" % power_value }}W + {{power_label}}{{font_end}}
+ + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %} +
+ - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {%- set total_voltage = + (states('sensor.esp32_s3_jk_bms_1_battery_voltage')|float + + + states('sensor.esp32_s3_jk_bms_2_battery_voltage')|float)/2 + %} + +
{{"%.3f" % + total_voltage}}V
{% macro + pad_right(w, s) %} {{ s }} {% set slen = w - (s|length) + %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %} +
+ - type: markdown + content: >- + {%- set total_current = + (states('sensor.esp32_s3_jk_bms_1_battery_current')|float)+(states('sensor.esp32_s3_jk_bms_2_battery_current')|float) + %} + +
{{"%.3f" % + total_current}}A
{% macro + pad_right(w, s) %} {{ s }} {% set slen = w - (s|length) + %} {% for idx in range(slen)%}   {%endfor %} {%- + endmacro %} {% macro green(s) %} {{ s }} {%- endmacro %} + - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content:
BMS 01
+ style: | + ha-card { + height: 10px; /* Ajusta el valor según tu preferencia */ + overflow: hidden; + } + - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} {% for idx in range(slen)%}   {%endfor + %} {%- endmacro %} {% macro green(s) %} {{ s }} {%- + endmacro %}
{{ pad_right(14, 'MOS Temp.:') }} + {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_powertube') + + ' °C') }}
{{ pad_right(15, 'Battery T1:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_1') + + ' °C') }}
{{ pad_right(15, 'Battery T2:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_2') + + ' °C') }}
{{ pad_right(15, 'Battery T3:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_3') + + ' °C') }}
{{ pad_right(15, 'Battery T4:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_4') + + ' °C') }}
{{ pad_right(15, 'Battery + T5:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_5') + + ' °C') }}

+ +
{%- set alarm_active = + states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_active')|int + %} {%- set alarm_active = 0 %} + {%- set alarm_count = states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_count')|int %} + {%- set alarm_label = 'ALARMS' if alarm_active==0 + else 'ALARMS' %} + {{alarm_label}} ({{ alarm_active }}/{{ alarm_count -}}) + - type: markdown + content: >- + {%- set soc = + states('sensor.esp32_s3_jk_bms_1_battery_capacity_state_of_charge') %} + {%- set soh = + states('sensor.esp32_s3_jk_bms_1_battery_soh_valuation') %} {%- set + max_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_max_cell_number') + %} {%- set min_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_min_cell_number') + %} {%- set max_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_max_cell_number') + %} {%- set min_idxr = + states('sensor.esp32_s3_jk_bms_1_cell_resistance_min_cell_number') + %} {%- set max_idxr = + states('sensor.esp32_s3_jk_bms_1_cell_resistance_max_cell_number') + %} {%- set delta_voltage = + (states('sensor.esp32_s3_jk_bms_1_cell_delta_voltage')|float) + %} {%- set average_voltage = + (states('sensor.esp32_s3_jk_bms_1_cell_average_voltage')|float) %} {%- + set max_voltage = + (states('sensor.esp32_s3_jk_bms_1_cell_voltage_max')|float) + %} {%- set min_voltage = + (states('sensor.esp32_s3_jk_bms_1_cell_voltage_min')|float) + %} {%- set max_resistance = + (states('sensor.esp32_s3_jk_bms_1_cell_resistance_max')|float) + %} {%- set min_resistance = + (states('sensor.esp32_s3_jk_bms_1_cell_resistance_min')|float) + %} + + + + + + + + +
SOC:{{soc}} %
SOH:{{soh}} %
delta:{{delta_voltage}} V
avg:{{average_voltage}} V
Vmax:{{max_voltage}} V [cell {{max_idx}}]
Vmin:{{min_voltage}} V [cell {{min_idx}}]
Rmax:{{max_resistance}} Ω [cell {{max_idxr}}]
Rmin:{{min_resistance}} Ω [cell {{min_idxr}}]
+ - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content:
BMS 02
+ style: | + ha-card { + height: 10px; /* Ajusta el valor según tu preferencia */ + overflow: hidden; + } + - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} {% for idx in range(slen)%}   {%endfor + %} {%- endmacro %} {% macro green(s) %} {{ s }} {%- + endmacro %}
{{ pad_right(14, 'MOS Temp.:') }} + {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_powertube') + + ' °C') }}
{{ pad_right(15, 'Battery T1:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_1') + + ' °C') }}
{{ pad_right(15, 'Battery T2:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_2') + + ' °C') }}
{{ pad_right(15, 'Battery T3:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_3') + + ' °C') }}
{{ pad_right(15, 'Battery T4:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_4') + + ' °C') }}
{{ pad_right(15, 'Battery + T5:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_5') + + ' °C') }}

+ +
{%- set alarm_active = + states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_active')|int + %} {%- set alarm_active = 0 %} + {%- set alarm_count = states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_count')|int %} + {%- set alarm_label = 'ALARMS' if alarm_active==0 + else 'ALARMS' %} + {{alarm_label}} ({{ alarm_active }}/{{ alarm_count -}}) + - type: markdown + content: >- + {%- set soc = + states('sensor.esp32_s3_jk_bms_2_battery_capacity_state_of_charge') %} + {%- set soh = + states('sensor.esp32_s3_jk_bms_2_battery_soh_valuation') %} {%- set + max_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_max_cell_number') + %} {%- set min_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_min_cell_number') + %} {%- set max_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_max_cell_number') + %} {%- set min_idxr = + states('sensor.esp32_s3_jk_bms_2_cell_resistance_min_cell_number') + %} {%- set max_idxr = + states('sensor.esp32_s3_jk_bms_2_cell_resistance_max_cell_number') + %} {%- set delta_voltage = + (states('sensor.esp32_s3_jk_bms_2_cell_delta_voltage')|float) + %} {%- set average_voltage = + (states('sensor.esp32_s3_jk_bms_2_cell_average_voltage')|float) %} {%- + set max_voltage = + (states('sensor.esp32_s3_jk_bms_2_cell_voltage_max')|float) + %} {%- set min_voltage = + (states('sensor.esp32_s3_jk_bms_2_cell_voltage_min')|float) + %} {%- set max_resistance = + (states('sensor.esp32_s3_jk_bms_2_cell_resistance_max')|float) + %} {%- set min_resistance = + (states('sensor.esp32_s3_jk_bms_2_cell_resistance_min')|float) + %} + + + + + + + + +
SOC:{{soc}} %
SOH:{{soh}} %
delta:{{delta_voltage}} V
avg:{{average_voltage}} V
Vmax:{{max_voltage}} V [cell {{max_idx}}]
Vmin:{{min_voltage}} V [cell {{min_idx}}]
Rmax:{{max_resistance}} Ω [cell {{max_idxr}}]
Rmin:{{min_resistance}} Ω [cell {{min_idxr}}]
+ - type: entities + entities: + - entity: binary_sensor.esp32_s3_canbus_1_status + name: CANBUS 1 Status + - entity: binary_sensor.esp32_s3_esp32_online_status + name: ESP32 Online Status + - entity: binary_sensor.esp32_s3_jk_bms_1_status_online + name: JK-BMS 1 status online + - entity: binary_sensor.esp32_s3_jk_bms_2_status_online + name: JK-BMS 2 status online + - entity: sensor.esp32_s3_smart_bms_1_alarm + name: Smart BMS 1 Alarm + - entity: sensor.esp32_s3_smart_bms_1_last_complete_charge + name: Smart BMS 1 Last Complete Charge + - entity: sensor.esp32_s3_smart_bms_1_last_complete_charge_human_readable + name: Smart BMS 1 Last Complete Charge Human Readable + - entity: sensor.esp32_s3_smart_bms_1_warning + name: Smart BMS 1 Warning + - entity: sensor.esp32_s3_uptime_human_readable + name: Uptime Human Readable + - entity: sensor.esp32_s3_uptime_sensor + name: Uptime Sensor + title: Esp32-S3 + - title: BMS Summary + path: bmss-summary + badges: [] + cards: + - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- +
BMS_01 [{{ + states('sensor.esp32_s3_jk_bms_1_total_runtime_formatted') + | string }}]  {{ + (states('sensor.esp32_s3_jk_bms_1_battery_capacity_state_of_charge') + + ' %') }} ({{ + (states('sensor.esp32_s3_jk_bms_1_battery_capacity_remaining')) }}Ah) +
+ - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {%- set online = + states('binary_sensor.esp32_s3_jk_bms_1_status_online') + %} + + {%- set is_working = "online" if (online|bool) else + "offline" %} + + {%- set font_start = '' if + (online|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "BMS:"}} {{ is_working }} {{font_end + -}} + + + {%- set precharging = + states('binary_sensor.esp32_s3_jk_bms_1_status_precharging') + %} + + {%- set is_working = "working" if (precharging|bool) else + "idle" %} + + {%- set font_start = '' if + (precharging|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "Precharging:"}} {{ is_working }} + {{font_end -}} + + + {%- set heating = + states('binary_sensor.esp32_s3_jk_bms_1_status_heating') + %} + + {%- set is_working = "working" if (heating|bool) else + "idle" %} + + {%- set font_start = '' if + (heating|bool) else '' %} + + {%- set font_end = '' if is_working else + '- + {%- set charging = + states('binary_sensor.esp32_s3_jk_bms_1_status_charging') + %} + + {%- set is_working = "working" if (charging|bool) else + "idle" %} + + {%- set font_start = '' if + (charging|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "Charging:"}} {{ is_working }} {{ + font_end -}} + + + {%- set discharging = + states('binary_sensor.esp32_s3_jk_bms_1_status_discharging') + %} + + {%- set is_working = "working" if (discharging|bool) else + "idle" %} + + {%- set font_start = '' if + (discharging|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "Discharging:"}} {{ is_working }} {{ + font_end -}} + + {%- set balancing_direction = + states('sensor.esp32_s3_jk_bms_1_balancing_direction')%} + {%- set is_working = "charging" if + (balancing_direction|int)==1 + else "discharging" if (balancing_direction|int)==2 + else "idle" if (balancing_direction|int)==0 + else 'unknown' %} + {%- set font_start = '' if + (balancing_direction|int)>0 + else '' if (balancing_direction|int)<0 + else '' %} + {%- set font_end = '' if + (balancing_direction|int)!=0 else '' %} {{ + font_start }} {{ "
Balancing:"}} {{ is_working }} + {{font_end -}} + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set power_draw = + states('sensor.esp32_s3_jk_bms_1_battery_power')|float %} + {%- set power_charging = + states('sensor.esp32_s3_jk_bms_1_battery_power_charging')|float + %} {%- set power_discharging = + states('sensor.esp32_s3_jk_bms_1_battery_power_discharging')|float + %} + + {%- set power_label = "(charging)" if (power_charging)>0 + else "(discharging)" if (power_discharging)>0 + else "" %} + + {%- set power_value = power_charging if + (power_charging)>0 + else power_discharging if (power_discharging)>0 + else power_draw %} + + {%- set font_start = '' if + (power_charging)>0 + else '' if (power_discharging)>0 + else '' %} + + {%- set font_end = '' if (power_charging)>0 or + (power_discharging)>0 else '' %} + +
{{font_start}}{{ power_value }}W + {{power_label}}{{font_end}}
+ + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %} +
+ - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- +
{{states('sensor.esp32_s3_jk_bms_1_battery_voltage') + }}V
{% macro pad_right(w, s) %} + {{ s }} {% set slen = w - (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %} +
+ - type: markdown + content: >- +
{{ + states('sensor.esp32_s3_jk_bms_1_battery_current') }} + A
{% macro pad_right(w, s) %} {{ + s }} {% set slen = w - (s|length) %} {% for idx in + range(slen)%}   {%endfor %} {%- endmacro %} {% macro + green(s) %} {{ s }} + {%- endmacro %} + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- +
{%- set ovp = + states('sensor.esp32_s3_jk_bms_1_cell_overvoltage_protection') + %} {%- set slv = + states('sensor.esp32_s3_jk_bms_1_cell_smart_sleep_voltage') + %} {%- set rcv = + states('sensor.esp32_s3_jk_bms_1_cell_request_charge_voltage') + %} {%- set bsv = + states('sensor.esp32_s3_jk_bms_1_cell_balancing_starting_voltage') + %} {%- set soc100 = + states('sensor.esp32_s3_jk_bms_1_cell_soc100_voltage') %} + {%- set ovpr = + states('sensor.esp32_s3_jk_bms_1_cell_overvoltage_protection_recovery') + %} {%- set rfv = + states('sensor.esp32_s3_jk_bms_1_cell_request_float_voltage') + %} {%- set uvpr = + states('sensor.esp32_s3_jk_bms_1_cell_undervoltage_protection_recovery') + %} {%- set soc0 = + states('sensor.esp32_s3_jk_bms_1_cell_soc0_voltage') %} + {%- set uvp = + states('sensor.esp32_s3_jk_bms_1_cell_undervoltage_protection') + %} {%- set poff = + states('sensor.esp32_s3_jk_bms_1_cell_power_off_voltage') + %} {%- set rcvt = + states('sensor.esp32_s3_jk_bms_1_cell_request_charge_voltage_time') + %} {%- set rfvt = + states('sensor.esp32_s3_jk_bms_1_cell_request_float_voltage_time') + %} {%- set TimeOVPR = + states('sensor.esp32_s3_jk_bms_1_cell_overvoltage_protection_release_time') + %} {%- set TimeUVPR = + states('sensor.esp32_s3_jk_bms_1_cell_undervoltage_protection_release_time') + %} + + + + {%- set rcvt = 'N/D' if rcvt == 'unknown' + else "%.1f" % rcvt|float %} + {%- set rfvt = 'N/D' if rfvt == 'unknown' + else "%.1f" % rfvt|float %} + + + + + +
VOLTAGE + SETTINGS
OVP{{ovp}}V + @{{TimeOVPR}}s
Smart Sleep + {{slv}}V
RCV{{rcv}}V + @{{rcvt}}h
Bal.Start.{{bsv}}V
SOC 100%{{soc100}}V
OVPR{{ovpr}}V
RFV{{rfv}}V @{{rfvt}}h
UVPR{{uvpr}}V
SOC + 0%{{soc0}}V
UVP{{uvp}}V + @{{TimeUVPR}}s
Power + OFF{{poff}}V

+ +
TEMPERATURES {% macro pad_right(w, s) %} {{ s + }} {% set slen = w - (s|length) %} {% for idx in + range(slen)%}   {%endfor %} {%- endmacro %} {% macro + green(s) %} {{ s }} + {%- endmacro %}
{{ pad_right(14, 'MOS + Temp.:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_powertube') + + ' °C') }}
{{ pad_right(15, 'Battery T1:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_1') + + ' °C') }}
{{ pad_right(15, 'Battery T2:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_2') + + ' °C') }}
{{ pad_right(15, 'Battery T3:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_3') + + ' °C') }}
{{ pad_right(15, 'Battery T4:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_4') + + ' °C') }}
{{ pad_right(15, 'Battery + T5:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_temperature_sensor_5') + + ' °C') }}
+ - type: markdown + content: >- + {%- set min_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_min_cell_number') + %} + + {%- set max_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_max_cell_number') + %} + + {%- set min_idxr = + states('sensor.esp32_s3_jk_bms_1_cell_resistance_min_cell_number') + %} + + {%- set max_idxr = + states('sensor.esp32_s3_jk_bms_1_cell_resistance_max_cell_number') + %} + + {%- set delta = + (states('sensor.esp32_s3_jk_bms_1_cell_delta_voltage')|float) + %} + + {% + for idx in range(1, 17) -%} + {%- set is_max = 1 if ((max_idx | int) == (idx | int)) else 0 %} + {%- set is_min = 1 if ((min_idx | int) == (idx | int)) else 0 %} + {%- set is_maxr = 1 if ((max_idxr | int) == (idx | int)) else 0 %} + {%- set is_minr = 1 if ((min_idxr | int) == (idx | int)) else 0 %} + {%- set cell_volt = states('sensor.esp32_s3_jk_bms_1_cell_voltage_%02d' % idx) %} + {%- set cell_resistance = states('sensor.esp32_s3_jk_bms_1_cell_resistance_%02d' % idx) %} + {%- set font_start = '' if is_max + else '' if is_min + else '' %} + {%- set font_end = '' if is_max or is_min + else '' %} + {%- set font_start_resistance = '' if is_minr + else '' if is_maxr + else '' %} + {%- set font_end_resistance = '' if is_maxr or is_minr + else '' %} + {% endfor %} +
CELL + INFO  (Δ: {{delta}}V)
{{ "%02d" % idx}}.{{ font_start }} {{ cell_volt }} V {{ font_end -}} /{{ font_start_resistance }} {{ cell_resistance |float * 1000 }} mΩ {{ font_end_resistance }}
{%- set network_nodes_available = + states('sensor.esp32_s3_jk_bms_1_network_nodes_available') + %} NET:{{network_nodes_available}}   + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: custom:stack-in-card + margin: false + columns: 2 + mode: horizontal + cards: + - type: markdown + content: >- + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %}
+ {{ pad_right(20, 'Cycle Capacity:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_battery_capacity_total_charging_cycle') + + " Ah") }}
{{ pad_right(15, "Rem. Capacity:") + -}} {{ + green(states('sensor.esp32_s3_jk_bms_1_battery_capacity_remaining') + + " Ah") }}
{{ pad_right(20, "Total Capacity:") -}} {{ + green(states('sensor.esp32_s3_jk_bms_1_battery_capacity_total_setting') + + " Ah")}}
+ +
+ - type: markdown + content: >- + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} {% for idx in range(slen)%}   {%endfor + %} {%- endmacro %} {% macro green(s) %} {{ s }} {%- + endmacro %}
{{ pad_right(18, "SOC:") -}} {{ + green(states('sensor.esp32_s3_jk_bms_1_battery_capacity_state_of_charge') + + ' %') }}
{{ pad_right(18, "SOH:") -}} {{ + green(states('sensor.esp32_s3_jk_bms_1_battery_soh_valuation') + + ' %') }}
{{ pad_right(18, 'Cycle Count:') }} {{ + green(states('sensor.esp32_s3_jk_bms_1_charging_cycles' )+ + ' cycles') }}
+ {{ pad_right(20, 'Balance Curr:') }} + {{green(states('sensor.esp32_s3_jk_bms_1_balancing_current') + + ' A') }}
{{ pad_right(20, 'Balancing Trig.:') }} + {{green(states('sensor.esp32_s3_jk_bms_1_balancing_trigger_voltage') + ' V') }} +
+ - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- +
BMS_02 [{{ + states('sensor.esp32_s3_jk_bms_2_total_runtime_formatted') + | string }}]  {{ + (states('sensor.esp32_s3_jk_bms_2_battery_capacity_state_of_charge') + + ' %') }} ({{ + (states('sensor.esp32_s3_jk_bms_2_battery_capacity_remaining')) }}Ah) +
+ - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {%- set online = + states('binary_sensor.esp32_s3_jk_bms_2_status_online') + %} + + {%- set is_working = "online" if (online|bool) else + "offline" %} + + {%- set font_start = '' if + (online|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "BMS:"}} {{ is_working }} {{font_end + -}} + + + {%- set precharging = + states('binary_sensor.esp32_s3_jk_bms_2_status_precharging') + %} + + {%- set is_working = "working" if (precharging|bool) else + "idle" %} + + {%- set font_start = '' if + (precharging|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "Precharging:"}} {{ is_working }} + {{font_end -}} + + + {%- set heating = + states('binary_sensor.esp32_s3_jk_bms_2_status_heating') + %} + + {%- set is_working = "working" if (heating|bool) else + "idle" %} + + {%- set font_start = '' if + (heating|bool) else '' %} + + {%- set font_end = '' if is_working else + '- + {%- set charging = + states('binary_sensor.esp32_s3_jk_bms_2_status_charging') + %} + + {%- set is_working = "working" if (charging|bool) else + "idle" %} + + {%- set font_start = '' if + (charging|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "Charging:"}} {{ is_working }} {{ + font_end -}} + + + {%- set discharging = + states('binary_sensor.esp32_s3_jk_bms_2_status_discharging') + %} + + {%- set is_working = "working" if (discharging|bool) else + "idle" %} + + {%- set font_start = '' if + (discharging|bool) else '' %} + + {%- set font_end = '' if is_working else + '' %} + + {{ font_start }} {{ "Discharging:"}} {{ is_working }} {{ + font_end -}} + + {%- set balancing_direction = + states('sensor.esp32_s3_jk_bms_2_balancing_direction')%} + {%- set is_working = "charging" if + (balancing_direction|int)>0 + else "discharging" if (balancing_direction|int)<0 + else 'idle' %} + {%- set font_start = '' if + (balancing_direction|int)>0 + else '' if (balancing_direction|int)<0 + else '' %} + {%- set font_end = '' if + (balancing_direction|int)!=0 else '' %} {{ + font_start }} {{ "
Balancing:"}} {{ is_working }} + {{font_end -}} + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set power_draw = + states('sensor.esp32_s3_jk_bms_2_battery_power')|float %} + {%- set power_charging = + states('sensor.esp32_s3_jk_bms_2_battery_power_charging')|float + %} {%- set power_discharging = + states('sensor.esp32_s3_jk_bms_2_battery_power_discharging')|float + %} + + {%- set power_label = "(charging)" if (power_charging)>0 + else "(discharging)" if (power_discharging)>0 + else "" %} + + {%- set power_value = power_charging if + (power_charging)>0 + else power_discharging if (power_discharging)>0 + else power_draw %} + + {%- set font_start = '' if + (power_charging)>0 + else '' if (power_discharging)>0 + else '' %} + + {%- set font_end = '' if (power_charging)>0 or + (power_discharging)>0 else '' %} + +
{{font_start}}{{ power_value }}W + {{power_label}}{{font_end}}
+ + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %} +
+ - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- +
{{states('sensor.esp32_s3_jk_bms_2_battery_voltage') + }}V
{% macro pad_right(w, s) %} + {{ s }} {% set slen = w - (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %} +
+ - type: markdown + content: >- +
{{ + states('sensor.esp32_s3_jk_bms_2_battery_current') }} + A
{% macro pad_right(w, s) %} {{ + s }} {% set slen = w - (s|length) %} {% for idx in + range(slen)%}   {%endfor %} {%- endmacro %} {% macro + green(s) %} {{ s }} + {%- endmacro %} + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- +
{%- set ovp = + states('sensor.esp32_s3_jk_bms_2_cell_overvoltage_protection') + %} {%- set slv = + states('sensor.esp32_s3_jk_bms_2_cell_smart_sleep_voltage') + %} {%- set rcv = + states('sensor.esp32_s3_jk_bms_2_cell_request_charge_voltage') + %} {%- set bsv = + states('sensor.esp32_s3_jk_bms_2_cell_balancing_starting_voltage') + %} {%- set soc100 = + states('sensor.esp32_s3_jk_bms_2_cell_soc100_voltage') %} + {%- set ovpr = + states('sensor.esp32_s3_jk_bms_2_cell_overvoltage_protection_recovery') + %} {%- set rfv = + states('sensor.esp32_s3_jk_bms_2_cell_request_float_voltage') + %} {%- set uvpr = + states('sensor.esp32_s3_jk_bms_2_cell_undervoltage_protection_recovery') + %} {%- set soc0 = + states('sensor.esp32_s3_jk_bms_2_cell_soc0_voltage') %} + {%- set uvp = + states('sensor.esp32_s3_jk_bms_2_cell_undervoltage_protection') + %} {%- set poff = + states('sensor.esp32_s3_jk_bms_2_cell_power_off_voltage') + %} {%- set rcvt = + states('sensor.esp32_s3_jk_bms_2_cell_request_charge_voltage_time') + %} {%- set rfvt = + states('sensor.esp32_s3_jk_bms_2_cell_request_float_voltage_time') + %} {%- set TimeOVPR = + states('sensor.esp32_s3_jk_bms_2_cell_overvoltage_protection_release_time') + %} {%- set TimeUVPR = + states('sensor.esp32_s3_jk_bms_2_cell_undervoltage_protection_release_time') + %} + + + + {%- set rcvt = 'N/D' if rcvt == 'unknown' + else "%.1f" % rcvt|float %} + {%- set rfvt = 'N/D' if rfvt == 'unknown' + else "%.1f" % rfvt|float %} + + + + + +
VOLTAGE + SETTINGS
OVP{{ovp}}V + @{{TimeOVPR}}s
Smart Sleep + {{slv}}V
RCV{{rcv}}V + @{{rcvt}}h
Bal.Start.{{bsv}}V
SOC 100%{{soc100}}V
OVPR{{ovpr}}V
RFV{{rfv}}V @{{rfvt}}h
UVPR{{uvpr}}V
SOC + 0%{{soc0}}V
UVP{{uvp}}V + @{{TimeUVPR}}s
Power + OFF{{poff}}V

+ +
TEMPERATURES {% macro pad_right(w, s) %} {{ s + }} {% set slen = w - (s|length) %} {% for idx in + range(slen)%}   {%endfor %} {%- endmacro %} {% macro + green(s) %} {{ s }} + {%- endmacro %}
{{ pad_right(14, 'MOS + Temp.:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_powertube') + + ' °C') }}
{{ pad_right(15, 'Battery T1:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_1') + + ' °C') }}
{{ pad_right(15, 'Battery T2:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_2') + + ' °C') }}
{{ pad_right(15, 'Battery T3:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_3') + + ' °C') }}
{{ pad_right(15, 'Battery T4:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_4') + + ' °C') }}
{{ pad_right(15, 'Battery + T5:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_temperature_sensor_5') + + ' °C') }}
+ - type: markdown + content: >- + {%- set min_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_min_cell_number') + %} + + {%- set max_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_max_cell_number') + %} + + {%- set min_idxr = + states('sensor.esp32_s3_jk_bms_2_cell_resistance_min_cell_number') + %} + + {%- set max_idxr = + states('sensor.esp32_s3_jk_bms_2_cell_resistance_max_cell_number') + %} + + {%- set delta = + (states('sensor.esp32_s3_jk_bms_2_cell_delta_voltage')|float) + %} + + {% + for idx in range(1, 17) -%} + {%- set is_max = 1 if ((max_idx | int) == (idx | int)) else 0 %} + {%- set is_min = 1 if ((min_idx | int) == (idx | int)) else 0 %} + {%- set is_maxr = 1 if ((max_idxr | int) == (idx | int)) else 0 %} + {%- set is_minr = 1 if ((min_idxr | int) == (idx | int)) else 0 %} + {%- set cell_volt = states('sensor.esp32_s3_jk_bms_2_cell_voltage_%02d' % idx) %} + {%- set cell_resistance = states('sensor.esp32_s3_jk_bms_2_cell_resistance_%02d' % idx) %} + {%- set font_start = '' if is_max + else '' if is_min + else '' %} + {%- set font_end = '' if is_max or is_min + else '' %} + {%- set font_start_resistance = '' if is_minr + else '' if is_maxr + else '' %} + {%- set font_end_resistance = '' if is_maxr or is_minr + else '' %} + {% endfor %} +
CELL + INFO  (Δ: {{delta}}V)
{{ "%02d" % idx}}.{{ font_start }} {{ cell_volt }} V {{ font_end -}} /{{ font_start_resistance }} {{ cell_resistance |float * 1000 }} mΩ {{ font_end_resistance }}
{%- set network_nodes_available = + states('sensor.esp32_s3_jk_bms_2_network_nodes_available') + %} NET:{{network_nodes_available}}   + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: custom:stack-in-card + margin: false + columns: 2 + mode: horizontal + cards: + - type: markdown + content: >- + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} + {% for idx in range(slen)%}   {%endfor %} + {%- endmacro %} + + {% macro green(s) %} {{ s }} {%- endmacro %}
+ {{ pad_right(20, 'Cycle Capacity:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_battery_capacity_total_charging_cycle') + + " Ah") }}
{{ pad_right(15, "Rem. Capacity:") + -}} {{ + green(states('sensor.esp32_s3_jk_bms_2_battery_capacity_remaining') + + " Ah") }}
{{ pad_right(20, "Total Capacity:") -}} {{ + green(states('sensor.esp32_s3_jk_bms_2_battery_capacity_total_setting') + + " Ah")}}
+ +
+ - type: markdown + content: >- + {% macro pad_right(w, s) %} {{ s }} {% set slen = w - + (s|length) %} {% for idx in range(slen)%}   {%endfor + %} {%- endmacro %} {% macro green(s) %} {{ s }} {%- + endmacro %}
{{ pad_right(18, "SOC:") -}} {{ + green(states('sensor.esp32_s3_jk_bms_2_battery_capacity_state_of_charge') + + ' %') }}
{{ pad_right(18, "SOH:") -}} {{ + green(states('sensor.esp32_s3_jk_bms_2_battery_soh_valuation') + + ' %') }}
{{ pad_right(18, 'Cycle Count:') }} {{ + green(states('sensor.esp32_s3_jk_bms_2_charging_cycles' )+ + ' cycles') }}
+ {{ pad_right(20, 'Balance Curr:') }} + {{green(states('sensor.esp32_s3_jk_bms_2_balancing_current') + + ' A') }}
{{ pad_right(20, 'Balancing Trig.:') }} + {{green(states('sensor.esp32_s3_jk_bms_2_balancing_trigger_voltage') + ' V') }} +
+ - title: BMS1 (cells) + cards: + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_01 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_05 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_02 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_06 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_03 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_07 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_04 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_08 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_09 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_10 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_11 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_12 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_13 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_14 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_15 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_16 + - graph: line + type: sensor + detail: 1 + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_max_cell_number + - graph: line + type: sensor + detail: 1 + entity: sensor.esp32_s3_jk_bms_1_cell_voltage_min_cell_number + - title: BMS2(cells) + cards: + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_01 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_05 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_02 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_06 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_03 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_07 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_04 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_08 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_09 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_10 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_11 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_12 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_13 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_14 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_15 + - type: gauge + needle: true + max: 3.65 + min: 3 + segments: + - from: 2 + color: '#db4437' + - from: 2.4 + color: '#ffa600' + - from: 3.1 + color: '#43a047' + - from: 3.35 + color: '#999999' + - from: 3.45 + color: '#00a6ee' + - from: 3.6 + color: '#ffa600' + - from: 3.65 + color: '#db4437' + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_16 + - graph: line + type: sensor + detail: 1 + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_max_cell_number + - graph: line + type: sensor + detail: 1 + entity: sensor.esp32_s3_jk_bms_2_cell_voltage_min_cell_number + - path: bms0_settings + title: BMS1 (SETTINGS) + icon: '' + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {%- set vid = states('sensor.esp32_s3_jk_bms_1_info_vendorid') + %} {%- set swv = + states('sensor.esp32_s3_jk_bms_1_info_software_version') %} + {%- set hwv = + states('sensor.esp32_s3_jk_bms_1_info_hardware_version') %} + {%- set dna = + states('sensor.esp32_s3_jk_bms_1_info_device_name') %} {%- set + dsn = + states('sensor.esp32_s3_jk_bms_1_info_device_serial_number') + %} {%- set pin = + states('sensor.esp32_s3_jk_bms_1_info_device_password') %} + {%- set settings_pin = + states('sensor.esp32_s3_jk_bms_1_info_device_setup_passcode') + %} {%- set uart1 = + states('sensor.esp32_s3_jk_bms_1_uart1_protocol_number') %} + {%- set uart2 = + states('sensor.esp32_s3_jk_bms_1_uart2_protocol_number') %} + {%- set cell_number_settings = + states('sensor.esp32_s3_jk_bms_1_cell_count_settings') %} {%- + set cell_number_real = + states('sensor.esp32_s3_jk_bms_1_cell_count_real') %} + + + + + +
BMS INFO:
VendorID:{{vid}}
HARD + ver:{{swv}}
SOFT + ver:{{hwv}}
DEV + name:{{dna}}
DEV + S/N{{dsn}}
BT + PASS:{{pin}}
+ PASS:{{settings_pin}}
UART1:{{uart1}}
UART2:{{uart2}}
Cells + (sett.):{{cell_number_settings}}
Cells + (real):{{cell_number_real}}

+ - type: markdown + content: >- + {%- set min_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_min_cell_number') + %} + + {%- set max_idx = + states('sensor.esp32_s3_jk_bms_1_cell_voltage_max_cell_number') + %} + + {%- set delta = + (states('sensor.esp32_s3_jk_bms_1_cell_delta_voltage')|float) + %} + +
NETWORK + DEVICES:  
{%- set + network_nodes_available = + states('sensor.esp32_s3_jk_bms_1_network_nodes_available') %} +
+ + {{network_nodes_available}}
   + - type: entities + entities: + - entity: switch.esp32_s3_jk_bms_1_charging + name: CHARGE + - entity: switch.esp32_s3_jk_bms_1_discharging + name: DISCHARGE + - entity: switch.esp32_s3_jk_bms_1_balancing + name: BALANCING + - entity: switch.esp32_s3_jk_bms_1_emergency + name: EMERGENCY + - entity: switch.esp32_s3_jk_bms_1_heating + name: HEATING + - entity: switch.esp32_s3_jk_bms_1_disable_temperature_sensors + name: DISABLE TEMPERATURE SENSORS + - entity: switch.esp32_s3_jk_bms_1_display_always_on + name: DISPLAY ALWAYS ON + - entity: switch.esp32_s3_jk_bms_1_smart_sleep_on + name: SMART SLEEP ON + - entity: switch.esp32_s3_jk_bms_1_disable_pcl_module + name: DISABLE PCL MODULE + - entity: switch.esp32_s3_jk_bms_1_timed_stored_data + name: TIMED_STORED_DATA + - entity: switch.esp32_s3_jk_bms_1_charging_float_mode + name: CHARGE FLOAT MODE + title: Switch (Read Only) + show_header_toggle: false + - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: |- +
+ {%- set alarm_active = states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_active')|int %} + {%- set alarm_active = 0 %} + {%- set alarm_count = states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_count')|int %} + {%- set alarm_label = 'ALARMS BMS_00' if alarm_active==0 + else 'ALARMS BMS_00' %} + {{alarm_label}} ({{ alarm_active }}/{{ alarm_count -}})
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set alarm_active = + states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_active')|int + %} + + {%- set alarm_count = + states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_count')|int + %} + + {%- set alarm_active = 0 %} + + {%- set alarms_label = '
No alarms found. Working + well
' if (alarm_active==0) + else 'ALARMS FOUND:' %} + {{ alarms_label }} + +
{% for state in states -%} + {% if state.entity_id.startswith('binary_sensor.esp32_s3_jk_bms_1_alarm_') and state.state!="off" %} + {% set last_word = state.name.split()[-1] | string %} + {% set last_status = state.state %} + {%- set font_start = '' if last_status=="off" + else '' if last_status=="on" + else '' %} + {%- set font_end = '' if last_status + else '' %} + {{ font_start }} {{ last_word }} (status: {{last_status}}) {{ font_end -}}
+ {% endif %} + {% endfor %}
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: |- +
+ {%- set alarm_active = states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_active')|int %} + {%- set alarm_active = 0 %} + {%- set alarm_count = states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_count')|int %} + {%- set alarm_label = 'ALARMS BMS_01' if alarm_active==0 + else 'ALARMS BMS_01' %} + {{alarm_label}} ({{ alarm_active }}/{{ alarm_count -}})
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set alarm_active = + states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_active')|int + %} + + {%- set alarm_count = + states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_count')|int + %} + + {%- set alarm_active = 0 %} + + {%- set alarms_label = '
No alarms found. Working + well
' if (alarm_active==0) + else 'ALARMS FOUND:' %} + {{ alarms_label }} + +
{% for state in states -%} + {% if state.entity_id.startswith('binary_sensor.esp32_s3_jk_bms_2_alarm_') and state.state!="off" %} + {% set last_word = state.name.split()[-1] | string %} + {% set last_status = state.state %} + {%- set font_start = '' if last_status=="off" + else '' if last_status=="on" + else '' %} + {%- set font_end = '' if last_status + else '' %} + {{ font_start }} {{ last_word }} (status: {{last_status}}) {{ font_end -}}
+ {% endif %} + {% endfor %}
+ - path: bms1_settings + title: BMS2 (SETTINGS) + icon: '' + cards: + - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 2 + cards: + - type: markdown + content: >- + {%- set vid = + states('sensor.esp32_s3_jk_bms_2_info_vendorid') %} {%- + set swv = + states('sensor.esp32_s3_jk_bms_2_info_software_version') + %} {%- set hwv = + states('sensor.esp32_s3_jk_bms_2_info_hardware_version') + %} {%- set dna = + states('sensor.esp32_s3_jk_bms_2_info_device_name') %} {%- + set dsn = + states('sensor.esp32_s3_jk_bms_2_info_device_serial_number') + %} {%- set pin = + states('sensor.esp32_s3_jk_bms_2_info_device_password') + %} {%- set settings_pin = + states('sensor.esp32_s3_jk_bms_2_info_device_setup_passcode') + %} {%- set uart1 = + states('sensor.esp32_s3_jk_bms_2_uart1_protocol_number') + %} {%- set uart2 = + states('sensor.esp32_s3_jk_bms_2_uart2_protocol_number') + %} {%- set cell_number_settings = + states('sensor.esp32_s3_jk_bms_2_cell_count_settings') %} + {%- set cell_number_real = + states('sensor.esp32_s3_jk_bms_2_cell_count_real') %} + + + + + + +
BMS INFO:
VendorID:{{vid}}
HARD + ver:{{swv}}
SOFT + ver:{{hwv}}
DEV + name:{{dna}}
DEV + S/N{{dsn}}
BT + PASS:{{pin}}
+ PASS:{{settings_pin}}
UART1:{{uart1}}
UART2:{{uart2}}
Cells + (sett.):{{cell_number_settings}}
Cells + (real):{{cell_number_real}}

+ - type: markdown + content: >- + {%- set min_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_min_cell_number') + %} + + {%- set max_idx = + states('sensor.esp32_s3_jk_bms_2_cell_voltage_max_cell_number') + %} + + {%- set delta = + (states('sensor.esp32_s3_jk_bms_2_cell_delta_voltage')|float) + %} + +
NETWORK + DEVICES:  
{%- set + network_nodes_available = + states('sensor.esp32_s3_jk_bms_2_network_nodes_available') + %}
+ + {{network_nodes_available}}
   + - type: entities + entities: + - entity: switch.esp32_s3_jk_bms_2_charging + name: CHARGE + - entity: switch.esp32_s3_jk_bms_2_discharging + name: DISCHARGE + - entity: switch.esp32_s3_jk_bms_2_balancing + name: BALANCING + - entity: switch.esp32_s3_jk_bms_2_emergency + name: EMERGENCY + - entity: switch.esp32_s3_jk_bms_2_heating + name: HEATING + - entity: switch.esp32_s3_jk_bms_2_disable_temperature_sensors + name: DISABLE TEMPERATURE SENSORS + - entity: switch.esp32_s3_jk_bms_2_display_always_on + name: DISPLAY ALWAYS ON + - entity: switch.esp32_s3_jk_bms_2_smart_sleep_on + name: SMART SLEEP ON + - entity: switch.esp32_s3_jk_bms_2_disable_pcl_module + name: DISABLE PCL MODULE + - entity: switch.esp32_s3_jk_bms_2_timed_stored_data + name: TIMED_STORED_DATA + - entity: switch.esp32_s3_jk_bms_2_charging_float_mode + name: CHARGE FLOAT MODE + title: Switch (Read Only) + show_header_toggle: false + - type: vertical-stack + cards: + - type: custom:stack-in-card + keep: + margin: false + box_shadow: false + background: false + cards: + - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: |- +
+ {%- set alarm_active = states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_active')|int %} + {%- set alarm_active = 0 %} + {%- set alarm_count = states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_count')|int %} + {%- set alarm_label = 'ALARMS BMS_00' if alarm_active==0 + else 'ALARMS BMS_00' %} + {{alarm_label}} ({{ alarm_active }}/{{ alarm_count -}})
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set alarm_active = + states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_active')|int + %} + + {%- set alarm_count = + states('sensor.esp32_s3_jk_bms_1_battery_total_alarms_count')|int + %} + + {%- set alarm_active = 0 %} + + {%- set alarms_label = '
No alarms found. Working + well
' if (alarm_active==0) + else 'ALARMS FOUND:' %} + {{ alarms_label }} + +
{% for state in states -%} + {% if state.entity_id.startswith('binary_sensor.esp32_s3_jk_bms_1_alarm_') and state.state!="off" %} + {% set last_word = state.name.split()[-1] | string %} + {% set last_status = state.state %} + {%- set font_start = '' if last_status=="off" + else '' if last_status=="on" + else '' %} + {%- set font_end = '' if last_status + else '' %} + {{ font_start }} {{ last_word }} (status: {{last_status}}) {{ font_end -}}
+ {% endif %} + {% endfor %}
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: |- +
+ {%- set alarm_active = states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_active')|int %} + {%- set alarm_active = 0 %} + {%- set alarm_count = states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_count')|int %} + {%- set alarm_label = 'ALARMS BMS_01' if alarm_active==0 + else 'ALARMS BMS_01' %} + {{alarm_label}} ({{ alarm_active }}/{{ alarm_count -}})
+ - type: grid + square: false + columns: 1 + cards: + - type: markdown + content: >- + {%- set alarm_active = + states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_active')|int + %} + + {%- set alarm_count = + states('sensor.esp32_s3_jk_bms_2_battery_total_alarms_count')|int + %} + + {%- set alarm_active = 0 %} + + {%- set alarms_label = '
No alarms found. Working + well
' if (alarm_active==0) + else 'ALARMS FOUND:' %} + {{ alarms_label }} + +
{% for state in states -%} + {% if state.entity_id.startswith('binary_sensor.esp32_s3_jk_bms_2_alarm_') and state.state!="off" %} + {% set last_word = state.name.split()[-1] | string %} + {% set last_status = state.state %} + {%- set font_start = '' if last_status=="off" + else '' if last_status=="on" + else '' %} + {%- set font_end = '' if last_status + else '' %} + {{ font_start }} {{ last_word }} (status: {{last_status}}) {{ font_end -}}
+ {% endif %} + {% endfor %}
+ - title: BMS1 (PROTECTION) + path: protection_bms0 + cards: + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_1_mos_overtemperature_protection + name: mos_overtemperature_protection + - entity: sensor.esp32_s3_jk_bms_1_mos_overtemperature_protection_recovery + name: mos_overtemperature_protection_recovery + - entity: sensor.esp32_s3_jk_bms_1_charging_overtemperature_protection + name: charging_overtemperature_protection + - entity: sensor.esp32_s3_jk_bms_1_discharging_overtemperature_protection + name: discharging_overtemperature_protection + - entity: >- + sensor.esp32_s3_jk_bms_1_charging_overtemperature_protection_recovery + name: charging_overtemperature_protection_recovery + - entity: >- + sensor.esp32_s3_jk_bms_1_discharging_overtemperature_protection_recovery + name: discharging_overtemperature_protection_recovery + - entity: >- + sensor.esp32_s3_jk_bms_1_charging_lowtemperature_protection_recovery + name: charging_lowtemperature_protection_recovery + - entity: sensor.esp32_s3_jk_bms_1_charging_lowtemperature_protection + name: charging_lowtemperature_protection + title: TEMPERATURE + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_1_max_charging_current + name: max_charging_current + - entity: sensor.esp32_s3_jk_bms_1_charging_overcurrent_protection_delay + name: charging_overcurrent_protection_delay + - entity: >- + sensor.esp32_s3_jk_bms_1_charging_overcurrent_protection_recovery_delay + name: charging_overcurrent_protection_recovery_delay + - entity: >- + sensor.esp32_s3_jk_bms_1_charging_overcurrent_protection_release_time + name: charging_overcurrent_protection_release_time + - entity: >- + sensor.esp32_s3_jk_bms_1_charging_short_circuit_protection_release_time + name: charging_short_circuit_protection_release_time + - entity: sensor.esp32_s3_jk_bms_1_precharging_time_from_discharge + name: precharging_time_from_discharge + title: CHARGING + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_1_max_discharging_current + name: max_discharging_current + - entity: sensor.esp32_s3_jk_bms_1_discharging_overcurrent_protection_delay + name: discharging_overcurrent_protection_delay + - entity: >- + sensor.esp32_s3_jk_bms_1_discharging_overcurrent_protection_recovery_delay + name: discharging_overcurrent_protection_recovery_delay + - entity: >- + sensor.esp32_s3_jk_bms_1_discharging_overcurrent_protection_release_time + name: discharging_overcurrent_protection_release_time + - entity: >- + sensor.esp32_s3_jk_bms_1_discharging_short_circuit_protection_release_time + name: discharging_short_circuit_protection_release_time + title: DISCHARGING + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_1_short_circuit_protection_delay + name: short_circuit_protection_delay + - entity: sensor.esp32_s3_jk_bms_1_short_circuit_protection_recovery_delay + name: short_circuit_protection_recovery_delay + title: SHORT CIRCUIT + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_1_max_balancing_current + name: max_balancing_current + title: BALANCING + - title: BMS2 (PROTECTION) + path: protection_bms1 + cards: + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_2_mos_overtemperature_protection + name: mos_overtemperature_protection + - entity: sensor.esp32_s3_jk_bms_2_mos_overtemperature_protection_recovery + name: mos_overtemperature_protection_recovery + - entity: sensor.esp32_s3_jk_bms_2_charging_overtemperature_protection + name: charging_overtemperature_protection + - entity: sensor.esp32_s3_jk_bms_2_discharging_overtemperature_protection + name: discharging_overtemperature_protection + - entity: >- + sensor.esp32_s3_jk_bms_2_charging_overtemperature_protection_recovery + name: charging_overtemperature_protection_recovery + - entity: >- + sensor.esp32_s3_jk_bms_2_discharging_overtemperature_protection_recovery + name: discharging_overtemperature_protection_recovery + - entity: >- + sensor.esp32_s3_jk_bms_2_charging_lowtemperature_protection_recovery + name: charging_lowtemperature_protection_recovery + - entity: sensor.esp32_s3_jk_bms_2_charging_lowtemperature_protection + name: charging_lowtemperature_protection + title: TEMPERATURE + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_2_max_charging_current + name: max_charging_current + - entity: sensor.esp32_s3_jk_bms_2_charging_overcurrent_protection_delay + name: charging_overcurrent_protection_delay + - entity: >- + sensor.esp32_s3_jk_bms_2_charging_overcurrent_protection_recovery_delay + name: charging_overcurrent_protection_recovery_delay + - entity: >- + sensor.esp32_s3_jk_bms_2_charging_overcurrent_protection_release_time + name: charging_overcurrent_protection_release_time + - entity: >- + sensor.esp32_s3_jk_bms_2_charging_short_circuit_protection_release_time + name: charging_short_circuit_protection_release_time + - entity: sensor.esp32_s3_jk_bms_2_precharging_time_from_discharge + name: precharging_time_from_discharge + title: CHARGING + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_2_max_discharging_current + name: max_discharging_current + - entity: sensor.esp32_s3_jk_bms_2_discharging_overcurrent_protection_delay + name: discharging_overcurrent_protection_delay + - entity: >- + sensor.esp32_s3_jk_bms_2_discharging_overcurrent_protection_recovery_delay + name: discharging_overcurrent_protection_recovery_delay + - entity: >- + sensor.esp32_s3_jk_bms_2_discharging_overcurrent_protection_release_time + name: discharging_overcurrent_protection_release_time + - entity: >- + sensor.esp32_s3_jk_bms_2_discharging_short_circuit_protection_release_time + name: discharging_short_circuit_protection_release_time + title: DISCHARGING + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_2_short_circuit_protection_delay + name: short_circuit_protection_delay + - entity: sensor.esp32_s3_jk_bms_2_short_circuit_protection_recovery_delay + name: short_circuit_protection_recovery_delay + title: SHORT CIRCUIT + - type: entities + entities: + - entity: sensor.esp32_s3_jk_bms_2_max_balancing_current + name: max_balancing_current + title: BALANCING