BMS Battery Cells Card - Visualize individual cell voltages of battery storage systems (hacs)

BMS Battery Cells Card

Visualization of individual cell voltages of your battery storage system (BMS)

I would like to present my new card to you. The :battery: BMS Battery Cells Card is a custom Lovelace card for visualizing the individual cell voltages of your battery storage system (BMS). It provides a clear overview of the status of all cells, including min/max values and balancing drift status.

The card can be fully configured via the card editor user interface and is translated to eng and ger. You need the corresponding entities from your BMS (e.g. Victron, JK-BMS, Daly) that provide the cell voltages in Home Assistant. Regular batteries (AGM and similar) also work, as long as you have suitable entities available in Home Assistant.

If you like the Card, I would appreciate a Star rating on my github :star:. :hugs:

Features

:battery: Visualizations & Layouts

  • Individual Cell Voltage: Bar charts with dynamic color thresholds (Min/Max/Avg)
  • Multiple Layout Modes:
    • :straight_ruler: Standard View: Classic bar chart visualization
    • :clipboard: Table View: Compact grid showing only numbers (no bars)
    • :page_with_curl: List View: Horizontal layout for a list-like appearance
    • :control_knobs: Detailed View: A full BMS dashboard view
  • Compact Mode: Option to hide bars and show only header stats
  • Animations: Charging (power in) and Discharging (power out) animations on cell bars

:chart_with_upwards_trend: Detailed View (optional)

  • Integrated Charts: Live history graphs for Total Voltage and Cell Drift (using Chart.js)
  • Extended BMS Metrics: Display of SoH, Cycles, Capacity (Ah), and MOS Temperature
  • Remaining Capacity: Auto-calculation based on Amp-hours and SoC
  • Cell List: detailed table of all cell voltages including individual balancing status
  • Hybrid View: Option to show the standard cell bars inside the detailed view

:zap: BMS Control & Interactive Elements

  • Interactive Status Switches: Toggle Charge, Discharge, and Balance directly from the card (supports Switches, Input Booleans, and Input Selects)
  • Custom State Logic: Define custom values for “On” and “Off” states (e.g., True/False, On/Off)
  • Click Actions: Click on sensors, charts, or cells to open the Home Assistant “More Info” dialog

:chart_with_downwards_trend: Statistics & Monitoring

  • Real-time Stats: Total Voltage, Current, Power (Watt), and Temperature
  • Smart Drift Calculation: Automatically calculates the delta between Min and Max cells (or uses an external sensor)
  • Min/Max Indicators: Visual highlighting of the highest and lowest voltage cells
  • Average Voltage: Option to display the calculated average cell voltage

:gear: Configuration & Customization

  • UI Editor: Fully configurable via the Home Assistant UI editor (no YAML required)
  • Thresholds: Adjustable Minimum and Maximum voltage for color scaling
  • Visual Tweaks: Options for thicker borders, hiding header values, and a lot more

Standard view:






image


Detailed view:


Installation

HACS (Recommended)

  • Add the GitHub repository via the link in Home Assistant.

    Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

  • The “BMS Battery Cells Card” should now be available in HACS. Click “INSTALL”.

  • The resource will be automatically added to your Lovelace configuration.

Manual Installation via Hacs

Manual Installation via Hacs

Open HACS in Home Assistant…

  • Go to “Frontend” and click the three dots in the upper right corner.
  • Select “Custom repositories”.
  • Add the URL of your GitHub repository and select “Lovelace” as the category.
  • Click “ADD”.
  • The “BMS Battery Cells Card” should now be available in HACS. Click “INSTALL”.
  • The resource will be automatically added to your Lovelace configuration.
Manual Installation via Hacs

Manual Installation in HA

  1. Download files:

    • Download the bms-battery-cells-card.js from this repository.
  2. import files to Home Assistant:

    • Create a new folder named bms-battery-cells-card in the www/community-directory of your Home Assistant configuration. (The www directory is located in the same folder as your configuration.yaml).
    • Copy all downloaded files into this new folder. Your folder structure should look like this:
      /config/www/community/bms-battery-cells-card/bms-battery-cells-card.js
      
  3. Add the resource to Home Assistant::

    • In Home Assistant, go to Settings > Dashboards.
    • Click the three-dot menu in the top right corner and select Resources.
    • Click + Add resource.
    • Enter /local/community/bms-battery-cells-card/bms-battery-cells-card.js as the URL.
    • Select JavaScript module as the resource type.
    • Click Create.

Configuration

After installation, you can add the card to your dashboard:

  1. Enable edit mode:

    • Open the dashboard where you want to add the card and click Edit..
  2. Add card:

    • Click + Add card and search for “BMS Battery Cells Card”.
  3. Configure options:

    • A configuration dialog will open where all settings can be conveniently adjusted.
    • BMS Entity: The main entity or list of sensors.
    • Voltage Range: Define the minimum and maximum voltage for the graphical display.
    • Details: Display additional values ​​such as battery power, temperature, drift, or average voltage.

simple example:

type: custom:bms-battery-cells-card
title: Battery Cells
cells:
  - entity: sensor.cell_1
    name: "1"
  - entity: sensor.cell_2
    name: "2"
  - entity: sensor.cell_3
    name: "3"
  - entity: sensor.cell_4
    name: "4"

advanced example:

type: custom:bms-battery-cells-card
cells:
  - name: "1"
    entity: sensor.vrm_maximum_cell_voltage_batt_1
  - name: "2"
    entity: sensor.vrm_minimum_cell_voltage_batt_1
  - name: "3"
    entity: sensor.vrm_maximum_cell_voltage_batt_2
  - name: "4"
    entity: sensor.vrm_minimum_cell_voltage_batt_2
soc_entity: sensor.victron_system_battery_soc
watt_entity: sensor.vrm_battery_power_batt_1024
cell_diff_sensor: sensor.vrm_minimum_cell_voltage_batt_1
temp_entity: sensor.vrm_battery_temperature_batt_1
show_values_on_top: false
enable_animations: true
title: Battery Cells
thicker_borders: true
min_voltage: 2.6
max_voltage: 3.65
show_average: false

| hacs_badge | HACS validation | hacs_badge | GitHub release |


More Details you can find in my github. :slight_smile:

3 Likes

Hey everyone, I just released a new update for the BMS Battery Cells Card on GitHub. It’s a pretty comprehensive update. I’ve added a detailed view, which provides even more visualization options. The chart isn’t perfect yet, as it doesn’t always seem to use the full width, but I’ll figure that out.

New features:

:heavy_check_mark: Detailed view implemented
:heavy_check_mark: New adjustable sensors (SOH, cycles, capacity, MOS temperature)
:heavy_check_mark: Integrated buttons/switches/select for charging, discharging, and balancing
:heavy_check_mark: Balance indicator added
:heavy_check_mark: New design options

Here’s a look at what the detailed view looks like.

2 Likes

This is cool. Thanks.

I’m using it with GivTCP with a 16 cell GivEnergy battery. The GivTCP Integration can force charge the battery by picking on option from a Select entity. The Options are Normal, Running, Cancel and a range of times in minutes. I can’t figure out how to define that in your card even though the charge part says it will accept a Select entity.

Hi and thanks. You are right, currently the card acts as a toggle button, not as a dropdown selector menu. In the code, specifically for input_select entities, it checks if the current state matches the defined “On Value”.

  • If it matches, it switches to the “Off Value”
  • If it does not match, it switches to the “On Value”

Because your integration requires selecting specific durations (e.g., “30 mins”, “60 mins”) rather than just a simple On/Off, you can not select the duration directly through this card’s button.

Solution / Workaround: You can still use the card to trigger a charge, but you have to decide on a “default” behavior.

Direct Configuration:

  • Set Value for ON to one specific option, e.g., 60 (or whatever the exact string for 60 minutes charge is in GivTCP)
  • Set Value for OFF to Normal (or Cancel)
  • Result: Clicking the button will always toggle between “Normal” and “60 minutes charge”

Using an input_boolean helper with automation that handles the complex logic of integration within HA could also be a solution.

Ah Thanks.

The GivTCP Ad-On exposes the Force Charge as a select, as I said above, but does stuff behind the scenes. EG If I select ‘2’ (minutes), it starts charging the battery from the grid and changes the Select value to ‘Running’. After 2 minutes it stops charging and the Select value goes back to ‘Normal’. I just tried 5 minutes and then the ‘Cancel’ but that didn’t seem to do anything and it just continued the charge for 5 minutes!

Anyway, after reading your post, I set the ‘Value for ON’ to ‘2’ thinking that when I press your Charge button, the comparison would be - does ‘Normal’ == ‘2’ ? giving False and your code would then set the Select value to ‘2’. But it doesn’t! Also, I don’t see any change in the label on the button (it stays as ‘Charge: OFF’.

These are the relevant settings in your card

stat_charge_entity: select.givtcp2_fdxxxxgxxx_force_charge
stat_charge_on: "2"
stat_charge_off: Normal

I’m not too bothered, just thought you might like to know. Maybe it’s me misunderstanding what I should be doing.

Thanks again - I think it’s a great card.