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_increasing: 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

:high_voltage: 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_decreasing: 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 |

ko-fi


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

4 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.

Hi, thanks for the detailed feedback! I looked into the code and changed some stuff.

  1. Domain Issue: The card was previously coded to listen for input_select (manual helpers) but it ignored the select domain, which is what your integration (select.givtcp...) uses. That is why the click event didn’t trigger the service call. Hopefully I have added full support for select entities now.

  2. String/Number Comparison: In Home Assistant, states are usually strings (e.g., “2”), but sometimes type mismatches occur during comparison. The code now strictly converts everything to strings before comparing, so “2” should be recognized correctly now.

I have updated the code to v_1.7.
Please could you update and let me know if it works for you now?

Yes, it’s now doing the Force Charge for 2 minutes but there is no visual indication on the Button ie it stays at Charge: OFF

1 Like

Hi, thanks for testing. Great that it basically works now. It’s strange that the button doesn’t display “Charge”. I’ll take another look at that.

Hi, i think i have fixed it with the visual indication. Please try it again. Thanks for testing.

v_1.8

  • fixed visual indication for “select” entities
  • new code structure (build up the files in github now)
  • optimized for hacs

No change - Still says “Off”. It does do the 2 minute charge though.

I reloaded from HACS and cleared the cache (Crtl-F5). I checked the files in www/community/bms-battery-cells-card but couldn’t see any Version information (not for 1.8 anyway). So, I think I did all I needed to.

Ok sorry for that. Mhh, it’s behaving really strangely and I can’t really test it. But I will look again in the code to find the fix.

If you press F12 in Chrome to open the developer console, you can search for “bms” there. It should look like this (1.8):

Yes, I’m getting the V_1.8. I’m happy to test it but can’t help with the code I’m afraid!

No problem, we will find a solution. Thanks for testing. :slight_smile:

I just installed this BMS monitor software by @jayjojayson and you can tell from the images it is very colorful. Is the blue perimeter suppose to indicate the lowest cell voltage? Is the red outline suppose to indicate the highest voltage? because I never added cell low from my JBD battery’s bluetooth. Thanks for this! It is a very lovely BMS monitor!


1 Like

Hi, I’m glad you like it. The color segments indicate the charge level more precisely. Red means fully charged battery, blue almost fully charged, green to blue optimal range, and orange almost empty battery.

I’m planning some improvements for the next version, but I’m currently focusing on my Power Flux card. However, there will be updates in the near future.

1 Like

Hi, thanks for the PRs i received. I have added the pull requests and the new version v_1.9 is ready.

:white_check_mark: New

1 Like