JK BMS Integration

I Have successfully integrated my JK BMS with Home assistant (Running on Ras pi4) through ESP32. Here is the Yaml File for the Dashboard
Battery 48V100Ah Lithium 16S 3.2V Cells

views:

  • title: Home
    sections:
    • type: grid
      cards:
      • type: heading
        heading: Sukhpal’s JK BMS
        heading_style: title
      • type: vertical-stack
        cards:
        • square: false
          type: grid
          cards:
          • type: vertical-stack
            cards:
            • type: entity
              entity: sensor.jk_bms_total_voltage
              name: Battery voltage
            • type: entity
              entity: sensor.jk_bms_current
              name: Current
          • type: gauge
            entity: sensor.jk_bms_discharging_power
            name: Load power
            needle: true
            max: 5120
            severity:
            green: 0
            yellow: 400
            red: 1600
            columns: 2
        • square: false
          type: grid
          cards:
          • type: entity
            entity: sensor.jk_bms_state_of_charge
            name: SOC
          • type: entity
            entity: sensor.jk_bms_charging_cycles
            name: Cycles
            columns: 2
        • square: false
          type: grid
          cards:
          • type: entity
            entity: sensor.jk_bms_discharging_power
            name: Discharging
            card_mod:
            style: |
            ha-card {
            color: red !important;
            }
            .info, .name {
            color: red !important;
            }
          • type: entity
            entity: sensor.jk_bms_power
            name: Charging
            card_mod:
            style: |
            ha-card {
            color: green !important;
            }
            .info, .name {
            color: green !important;
            }
            columns: 2
        • square: false
          type: grid
          cards:
          • type: entity
            entity: sensor.jk_bms_capacity_remaining
            name: Remaining
          • type: entity
            entity: number.jk_bms_total_battery_capacity
            name: Capacity
            columns: 2
        • square: false
          type: grid
          cards:
          • type: entity
            entity: sensor.jk_bms_average_cell_voltage
            name: Avg. cell volt
          • type: entity
            entity: sensor.jk_bms_delta_cell_voltage
            name: Cell Vol diff.
            columns: 2
        • type: vertical-stack
          cards:
          • type: entities
            style: |
            ha-card {
            color: #18f50c;
            box-shadow: none;
            background: rgba(0,0,0,0);
            border: white solid 1px !important;
            }
            entities:
            • entity: sensor.jk_bms_total_charging_cycle_capacity
              name: Cycle capacity
              card_mod:
              style:
              hui-generic-entity-row:
              $: |
              state-badge {
              display: none;
              }
              .info {
              margin-left:0 !important;
              Color: white;
              }
            • entity: sensor.jk_bms_charging_cycles
              name: Cycle count
              card_mod:
              style:
              hui-generic-entity-row:
              $: |
              state-badge {
              display: none;
              }
              .info {
              margin-left:0 !important;
              Color: white;
              }
            • entity: sensor.jk_bms_balancing_current
              name: Balance current
              card_mod:
              style:
              hui-generic-entity-row:
              $: |
              state-badge {
              display: none;
              }
              .info {
              margin-left:0 !important;
              Color: white;
              }
            • entity: sensor.jk_bms_temperature_sensor_1
              name: Battery T1
              card_mod:
              style:
              hui-generic-entity-row:
              $: |
              state-badge {
              display: none;
              }
              .info {
              margin-left:0 !important;
              Color: white;
              }
            • entity: sensor.jk_bms_temperature_sensor_2
              name: Battery T2
              card_mod:
              style:
              hui-generic-entity-row:
              $: |
              state-badge {
              display: none;
              }
              .info {
              margin-left:0 !important;
              Color: white;
              }
            • entity: sensor.jk_bms_power_tube_temperature
              name: MOS Temp
              card_mod:
              style:
              hui-generic-entity-row:
              $: |
              state-badge {
              display: none;
              }
              .info {
              margin-left:0 !important;
              Color: white;
              }
          • square: false
            type: grid
            columns: 2
            cards:
            • type: markdown
              content: |2-
              01.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘1’ %} {{ states(‘sensor.jk_bms_cell_voltage_1’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘1’ %} {{
              states(‘sensor.jk_bms_cell_voltage_1’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_1’) }} V {% endif %}


              02.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘2’ %} {{ states(‘sensor.jk_bms_cell_voltage_2’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘2’ %} {{
              states(‘sensor.jk_bms_cell_voltage_2’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_2’) }} V {% endif %}

              03.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘3’ %} {{ states(‘sensor.jk_bms_cell_voltage_3’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘3’ %} {{
              states(‘sensor.jk_bms_cell_voltage_3’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_3’) }} V {% endif %}


              04.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘4’ %} {{ states(‘sensor.jk_bms_cell_voltage_4’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘4’ %} {{
              states(‘sensor.jk_bms_cell_voltage_4’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_4’) }} V {% endif %}


              05.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘5’ %} {{ states(‘sensor.jk_bms_cell_voltage_5’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘5’ %} {{
              states(‘sensor.jk_bms_cell_voltage_5’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_5’) }} V {% endif %}


              06.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘6’ %} {{ states(‘sensor.jk_bms_cell_voltage_6’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘6’ %} {{
              states(‘sensor.jk_bms_cell_voltage_6’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_6’) }} V {% endif %}


              07.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘7’ %} {{ states(‘sensor.jk_bms_cell_voltage_7’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘7’ %} {{
              states(‘sensor.jk_bms_cell_voltage_7’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_7’) }} V {% endif %}


              08.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘8’ %} {{ states(‘sensor.jk_bms_cell_voltage_8’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘8’ %} {{
              states(‘sensor.jk_bms_cell_voltage_8’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_8’) }} V {% endif %}

              card_mod:
              style: |
              ha-card {
              box-shadow: none;
              background: rgba(0,0,0,0);
              border: white solid 1px !important;
              }
            • type: markdown
              content: |2-

              09.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘9’ %} {{ states(‘sensor.jk_bms_cell_voltage_9’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘9’ %} {{
              states(‘sensor.jk_bms_cell_voltage_9’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_9’) }} V {% endif %}


              10.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘10’ %} {{ states(‘sensor.jk_bms_cell_voltage_10’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘10’ %} {{
              states(‘sensor.jk_bms_cell_voltage_10’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_10’) }} V {% endif %}


              11.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘11’ %} {{ states(‘sensor.jk_bms_cell_voltage_11’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘11’ %} {{
              states(‘sensor.jk_bms_cell_voltage_11’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_11’) }} V {% endif %}


              12.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘12’ %} {{ states(‘sensor.jk_bms_cell_voltage_12’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘12’ %} {{
              states(‘sensor.jk_bms_cell_voltage_12’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_12’) }} V {% endif %}


              13.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘13’ %} {{ states(‘sensor.jk_bms_cell_voltage_13’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘13’ %} {{
              states(‘sensor.jk_bms_cell_voltage_13’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_13’) }} V {% endif %}


              14.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘14’ %} {{ states(‘sensor.jk_bms_cell_voltage_14’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘14’ %} {{
              states(‘sensor.jk_bms_cell_voltage_14’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_14’) }} V {% endif %}

              15.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘15’ %} {{ states(‘sensor.jk_bms_cell_voltage_15’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘15’ %} {{
              states(‘sensor.jk_bms_cell_voltage_15’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_15’) }} V {% endif %}


              16.      {% if
              states(‘sensor.jk_bms_max_voltage_cell’) == ‘16’ %} {{ states(‘sensor.jk_bms_cell_voltage_16’) }}
              V {% elif states(‘sensor.jk_bms_min_voltage_cell’) ==
              ‘16’ %} {{
              states(‘sensor.jk_bms_cell_voltage_16’) }} V {% else %}
              {{ states(‘sensor.jk_bms_cell_voltage_16’) }} V {% endif %}


              card_mod:
              style: |
              ha-card {
              box-shadow: none;
              background: rgba(0,0,0,0);
              border: white solid 1px !important;
              }
            • type: entities
              style: |
              ha-card {
              color: #18f50c;
              box-shadow: none;
              background: rgba(0,0,0,0);
              border: white solid 1px !important;
              }
              entities:
              • entity: sensor.jk_bms_cell_resistance_1
                name: 1
              • entity: sensor.jk_bms_cell_resistance_2
                name: 2
              • entity: sensor.jk_bms_cell_resistance_3
                name: 3
              • entity: sensor.jk_bms_cell_resistance_4
                name: 4
              • entity: sensor.jk_bms_cell_resistance_5
                name: 5
              • entity: sensor.jk_bms_cell_resistance_6
                name: 6
              • entity: sensor.jk_bms_cell_resistance_7
                name: 7
              • entity: sensor.jk_bms_cell_resistance_8
                name: 8
            • type: entities
              style: |
              ha-card {
              color: #18f50c;
              box-shadow: none;
              background: rgba(0,0,0,0);
              border: white solid 1px !important;
              }
              entities:
              • entity: sensor.jk_bms_cell_resistance_9
                name: 9
              • entity: sensor.jk_bms_cell_resistance_10
                name: 10
              • entity: sensor.jk_bms_cell_resistance_11
                name: 11
              • entity: sensor.jk_bms_cell_resistance_12
                name: 12
              • entity: sensor.jk_bms_cell_resistance_13
                name: 13
              • entity: sensor.jk_bms_cell_resistance_14
                name: 14
              • entity: sensor.jk_bms_cell_resistance_15
                name: 15
              • entity: sensor.jk_bms_cell_resistance_16
                name: 16
        • show_name: true
          show_icon: true
          show_state: true
          type: glance
          entities:
          • entity: switch.jk_bms_charging
            name: Charging
          • entity: switch.jk_bms_discharging
            name: Discharging
          • entity: binary_sensor.jk_bms_balancing
            name: Balancing
            state_color: true
    • type: grid
      cards:
      • type: heading
        heading: New section
      • type: history-graph
        entities:
        • entity: sensor.jk_bms_state_of_charge
          name: Battery SoC
          hours_to_show: 24
          refresh_interval: 0
          title: SOC Chart
1 Like

An efficient and elegant way to apply color to the max/min voltage cells is by using css selectors with the help of the card-mod.

type: entities
entities:
  - entity: sensor.jk_bms0_cell_voltage_1
    name: C1
  - entity: sensor.jk_bms0_cell_voltage_2
    name: C2
  - entity: sensor.jk_bms0_cell_voltage_3
    name: C3
  - entity: sensor.jk_bms0_cell_voltage_4
    name: C4
  - entity: sensor.jk_bms0_cell_voltage_5
    name: C5
  - entity: sensor.jk_bms0_cell_voltage_6
    name: C6
  - entity: sensor.jk_bms0_cell_voltage_7
    name: C7
  - entity: sensor.jk_bms0_cell_voltage_8
    name: C8
  - entity: sensor.jk_bms0_cell_voltage_9
    name: C9
  - entity: sensor.jk_bms0_cell_voltage_10
    name: C10
  - entity: sensor.jk_bms0_cell_voltage_11
    name: C11
  - entity: sensor.jk_bms0_cell_voltage_12
    name: C12
  - entity: sensor.jk_bms0_cell_voltage_13
    name: C13
  - entity: sensor.jk_bms0_cell_voltage_14
    name: C14
  - entity: sensor.jk_bms0_cell_voltage_15
    name: C15
  - entity: sensor.jk_bms0_cell_voltage_16
    name: C16
card_mod:
  style:
    "#states": |
      div > div:nth-child({{- states('sensor.jk_bms0_min_voltage_cell') -}}) {
        color: red;
      }  
      div > div:nth-child({{- states('sensor.jk_bms0_max_voltage_cell') -}}) {
        color: deepskyblue;
      }
    hui-sensor-entity-row:
      $ hui-generic-entity-row:
        $: |
          state-badge {
            display: none;
          }
          .info {
            padding-left: 0px !important;
          }

2 Likes

Hi,

i am trying to copy it but get this error:

TemplateSyntaxError: unexpected char ‘‘’ at 2777

Can sombody help me with this code, it does not show min/max voltage in colour.

type: vertical-stack
cards:
  - type: vertical-stack
    keep:
      margin: false
      box_shadow: false
      background: false
    cards:
      - type: grid
        square: false
        columns: 1
        cards:
      
          - type: entities
            entities:
              - entity: sensor.accu_bms0_cell_1
                name: C1
              - entity: sensor.accu_bms0_cell_2
                name: C2
              - entity: sensor.accu_bms0_cell_3
                name: C3
              - entity: sensor.accu_bms0_cell_4
                name: C4
              - entity: sensor.accu_bms0_cell_5
                name: C5

            card_mod:
              style:
                "#states": |
                  div > div:nth-child({{- states('sensor.jk_bms0_min_voltage_cell') -}}) {
                    color: red;
                  }  
                  div > div:nth-child({{- states('sensor.jk_bms0_max_voltage_cell') -}}) {
                    color: deepskyblue;
                  }
                hui-sensor-entity-row:
                  $ hui-generic-entity-row:
                    $: |
                      state-badge {
                        display: none;
                      }
                      .info {
                        padding-left: 0px !important;
                      }       

What is wrong? No coloured values.

type: entities
entities:
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_1
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_2
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_3
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_4
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_5
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_6
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_7
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_8
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_9
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_10
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_11
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_12
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_13
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_14
  - entity: sensor.mi_seplos_multi_bms_bms0_cell_15
show_header_toggle: true
state_color: false

card_mod:
  style:
    "#states": >
      div > div:nth-child({{-
      states('sensor.mi_seplos_multi_bms_bms0_min_cell_voltage') -}}) {
        color: red;
      }  

      div > div:nth-child({{-
      states('sensor.mi_seplos_multi_bms_bms0_max_cell_voltage') -}}) {
        color: deepskyblue;
      }
    hui-sensor-entity-row:
      $ hui-generic-entity-row:
        $: |
          state-badge {
            display: none;
          }
          .info {
            padding-left: 0px !important;
          }

type or paste code here

does this work with bluetooth proxy

Should work, but i am using an esphome with rs485 modbus-mqtt.

Why does this code not show de min/max values in colour?

type: vertical-stack
cards:
  - type: vertical-stack
    keep:
      margin: false
      box_shadow: false
      background: false
    cards:
      - type: grid
        square: false
        columns: 1
        cards:
      
          - type: entities
            entities:
              - entity: sensor.accu_bms0_cell_1
                name: C1
              - entity: sensor.accu_bms0_cell_2
                name: C2
              - entity: sensor.accu_bms0_cell_3
                name: C3
              - entity: sensor.accu_bms0_cell_4
                name: C4
              - entity: sensor.accu_bms0_cell_5
                name: C5

No color here?

type: entities
entities:
  - entity: sensor.bms0_cell_1
    name: C1
  - entity: sensor.bms0_cell_7
    name: C2
card_mod:
  style:
    "#states": |
      div > div:nth-child({{- states('sensor.bms0_min_cell_voltage') -}}) {
        color: red;
      }  
      div > div:nth-child({{- states('sensor.bms0_max_cell_voltage') -}}) {
        color: yellow;
      }
    hui-sensor-entity-row:
      $ hui-generic-entity-row:
        $: |
          state-badge {
            display: none;
          }
          .info {
            padding-left: 0px !important;
          }

Hey @sukhpal3y

Would you mind sharing the yaml for the ESP32 I’m struggling to get this working. Thanks

Hi @broekieman

Would you mind explaining and or sharing the yaml for how you have got this running with the rs485?

Thanks

Try converting the state value to int. For example replacing:

div > div:nth-child({{- states('sensor.bms0_min_cell_voltage') -}}) {

with:

div > div:nth-child({{- states('sensor.sensor.bms0_min_cell_voltage')|int -}})

Same for the max state.
Also make sure the sensor names correspond to your configuration.

Apologies for the late reply.