Cell Balancing

Post Reply
User avatar
HughInDevon
Posts: 67
Joined: Wed Jul 31, 2024 4:50 pm

Hi,
I’m trying to learn a bit more about cell balancing. I gather that the Fox ESS BMS uses top balancing and I assume that it will be active power balancing. From my reading so far it seems as if the balancing kicks in when the battery SoC is about 95%.

I have in mind an automation to minimise energy loss by inverter clipping on sunny days. By switching work mode from Feed-in first to Self use, provided there is headroom in the battery, the battery will take enough power to avoid the clipping. The extra battery power will then be exported via forced discharge when the sun goes down. This strategy should maximise the grid export. To make sure there is sufficient headroom in the battery, when a sunny day is forecast, the battery will be charged overnight to only say 80% SoC rather than the normal 100%.

My questions are:
Roughly how long does the balancing take and is there a recommendation for a minimum time for the battery to be above 95% SoC?
How often is balancing needed? If there was a run of very sunny days (in Devon? Unlikely) this could potentially mean that the batteries wouldn’t be balanced for several days. Is this a problem?

All comments very welcome.
Thanks, Hugh
KH10 with 4 off ECS4800 batteries.
20 Jinko 435W panels in 2 strings. 10 on house, south facing, 10 on barn, east facing.
Solar installation active on 27/11/2024. Export MPAN active on 30.12/2024.
Zappi V2 charger and 2 EVs.
Currently on Octopus Intelligent Go tariff.
Home Assistant modbus integration (Now working - ish)
Dave Foster
Posts: 1786
Joined: Thu Oct 13, 2022 7:21 pm

There's quite a bit of history around this, the early versions of BMS software were at best average, but the latest versions of BMS software are quite good and for the most part manage the batteries well so they don't need a lot of attention.

There's an old automation I wrote here viewtopic.php?t=368 that explains some of the behaviour, but the things to note specifically for the current Fox batteries is that they do have active balancing but the circuits are only modest - on my HV2600 I estimate the balance circuits are capable of approx 0.6A (~30Wh per pack) and so any changes they make are small and need time - this works well when managing a balanced pack but if the balance is lost it can take time and effort to recover it.

With the latest firmware the pack slows down the charge rate to 4A when it gets to 96% and this simply allows a bit more time for top balancing to take place but the pack is balancing whenever charging (particularly if the charge is consistent as it is from grid) but when charging at 5kW the balance circuits don't get a lot of time to do their work.

I have found in general the balance will be good as long as you regularly hit 100% SoC, in summer normal LFP guidelines would suggest not doing that but I have tried to reduce how often my batteries got to 100% by limiting it to 75%, and whilst this would be good practice for a normal LFP battery the Fox packs really do need to get to 100% so they have the time to top balance and importantly the BMS maintains its estimates of pack SoC - if you only charge to 75% after a just few weeks the SoC estimate will steadily drift and lose accuracy.

Just to explain the pack SoC thing - in a large pack of seperate Fox batteries, each battery is responsible for managing it's own balance - the BMS broadcasts the pack statistics to all batteries so all batteries know the 'pack' temperature and cell voltage range. Each pack listens to that and attempts to harmonise with it. The SoC is actually a construct made up by the BMS based on cell voltages, temperature and age for the pack and it performs much of the learning for that calculation when the pack gets to 96% - 100%.

I've also found that after hard maximum discharge power sessions (i.e. Octopus saver sessions where you get paid to export) the batteries need just that bit longer to balance at the top end and the 96% used by the BMS is just a bit too high.

Rather than the complicated automation I linked above - I have written a simple automation for my friends systems that changes the charge rate to 5A when it gets to 94% to give it that bit more time - the batteries will still go through their balancing but have a bit more time to do it. In practice for Fox batteries this works really well and i've never had issue with any of their packs since, even after hard discharge sessions.

Myself I still use the battery throttle linked above as it lets me set charge curves for night and day and control the charge rates more elegantly and with better precision (but i'm a battery geek) and keeping a bit more space available stops my inverter clipping when solar is very strong. However with latest firmware the simple automation does the job.

So key message, on latest firmware Fox BMS does a pretty good job - but make sure you charge to 100% regularly (at least weekly, preferably more often) and give them a bit more time at the top of the charge by reducing the charge rates, it is better for temperature management when it is hot in summer and it helps to reduce the higher battery voltage you see as it approaches 100% which again avoids stress on the battery.
User avatar
HughInDevon
Posts: 67
Joined: Wed Jul 31, 2024 4:50 pm

Hi Dave,

That's excellent information, many thanks. I will definitely make sure that my battery is charged to 100% at least once per week and I will also use a reduced charge current to slow the charging when over 90%. I like your 'active' approach using the jinja template but it is probably a stretch too far for my limited coding abilities! The 6 hour low-tariff window on IOG gives a generous amount of time to play with the charge curve.

One more question. Looking at the Fox ESS user manual for the EQ4800 batteries, they quote the following:
Max. charge/discharge current (A) 50/50
(CC-CV) Standard charging current (A) 30
Constant current and constant voltage charging cut-off current (A) 5.3.

What does the last value of 5.3 refer to? I am wondering if this is something to do with cell balancing?
Any thoughts?

Regards, Hugh
KH10 with 4 off ECS4800 batteries.
20 Jinko 435W panels in 2 strings. 10 on house, south facing, 10 on barn, east facing.
Solar installation active on 27/11/2024. Export MPAN active on 30.12/2024.
Zappi V2 charger and 2 EVs.
Currently on Octopus Intelligent Go tariff.
Home Assistant modbus integration (Now working - ish)
Dave Foster
Posts: 1786
Joined: Thu Oct 13, 2022 7:21 pm

I think those parameters are referring to the way a recommended LFP charger should be used to charge the battery i.e. when using constant current/voltage stages - more advanced chargers start with a constant current cycle to get the heavy lifting done, switching to constant voltage towards the end which is used to get the battery to 100%. For that second stage you would hold your voltage steady and wait for the charge current to pass a cutoff limit (it looks like 5.3A in the case of the 4800) - and that would signal the charge cycle to end.

I sort of eluded to it in the battery throttle post that the Fox charger appears to behave as a constant current charger only - i.e. it has to reduce the current in the latter stages of the charge because the voltage is increasing rapidly where instead it uses a voltage cut-off to indicate full.

Have a look at your battery voltage trace vs charge power / SoC when you next grid charge to 100%, admittedly this will change depending on temperature but will; show why Fox drop the charge for the last few % of SoC and you should see the long delay around 96% as it waits for packs to balance - the pack voltage will be rapidly increasing at the end and so the BMS waits for the cell volts to trip ~3.6V per cell and it's fully charged.

I have tested with very low charge currents on my HV2600's they are approx half the size of the EQ4800 around a ~2.5A cut off current at 100% charge. When I drop below 1.5A above 97% SoC it gets confused and starts SoC cycling - so I never drop below 2A with my charge curves now.

Probably best for your EQ4800's to use 5A as the minimum level for the last few %.
WyndStryke
Posts: 60
Joined: Mon Nov 18, 2024 9:16 pm

Dave Foster wrote: Tue Feb 25, 2025 12:51 pm - but make sure you charge to 100% regularly (at least weekly, preferably more often) and give them a bit more time at the top of the charge by reducing the charge rates,

I set my KH7 (EC4300-H4) to do it every 10 days - sounds like I need to adjust this down to a week. I set up my calibration-day charge profile as follows:


* 99% 0.4kW 1.7A
* 98% 0.5kW 2A
* 97% 0.6kW 2.5A
* 96% 0.8kW 3.3A
* 95% 1kW 4A
* 94% 1.25kW 5.2A
* 93% 1.75kW 7A
* 92% 2.5kW 10A
* Below 91% = 6.6kW 27A

& I generally stop as soon as it gets to 98%. 99% seems to be the max (although the battery was pretty cold when I tried that last). It just sat at 99% for several hours seemly swallowing 1.4kWh of PV somehow (self-use mode) with no export. I haven't tried it on a warmer day.

Does that charge profile seem OK or should I adjust it to higher amps rather than trickle charging it for the last bit?

Interestingly I see a higher sensor.invbatvolt voltage between 92% and 94% (when at a higher rate of charge) than at 98%, but the cell BMS mV high and low are highest at 98%. Unfortunately I didn't have the BMS sensors back when I hit 99% so I can't compare.

I've now set it to 99% and 7 days, so I'll see what happens once that is reached (Thursday?). Let me know if I should raise the charge profile to higher amps.
Dave Foster
Posts: 1786
Joined: Thu Oct 13, 2022 7:21 pm

WyndStryke wrote: Tue Feb 25, 2025 10:15 pm I set my KH7 (EC4300-H4) to do it every 10 days - sounds like I need to adjust this down to a week. I set up my calibration-day charge profile as follows:

& I generally stop as soon as it gets to 98%. 99% seems to be the max (although the battery was pretty cold when I tried that last). It just sat at 99% for several hours seemly swallowing 1.4kWh of PV somehow (self-use mode) with no export. I haven't tried it on a warmer day.

Does that charge profile seem OK or should I adjust it to higher amps rather than trickle charging it for the last bit?
Yes I think reducing the interval to 7 days won't do any harm and is likely to improve SoC accuracy.

I think from what you have said hold the minimum current at 2.5A from 97% and see how that performs - the long period you saw at 99% I always think is a good thing it's the pack re-balancing and the BMS re-evaluating the pack statistics to improve it's SOC, but I think below 2.5A you might be a bit low for the 4300's.
WyndStryke wrote: Tue Feb 25, 2025 10:15 pm Interestingly I see a higher sensor.invbatvolt voltage between 92% and 94% (when at a higher rate of charge) than at 98%, but the cell BMS mV high and low are highest at 98%. Unfortunately I didn't have the BMS sensors back when I hit 99% so I can't compare.
The rapid rise is indicative of the higher voltage as the batteries internal resistance increases with a constant current (there's a whole load of information out there on how the SEI layer in lithium batteries behaves) - reducing the charge current helps the battery absorb power over a longer time. Ideally you want the charge voltage to continue to increase but slowly, if it drops it probably means you could do with raising the charge rate slightly (but note temperature effects, internal resistance is much higher when the batteries are cold than warm).


Just to add a note for anyone reading this and think 'I have to do something like this to look after the batteries' - I still think the Fox BMS with latest firmware does a very good job of managing the batteries on it's own, and for standard systems I would simply say do a 100% charge as regularly as you can and run the batteries down to 10% once a month.
WyndStryke
Posts: 60
Joined: Mon Nov 18, 2024 9:16 pm

That's great, thank you.

I have adjusted the charge rates appropriately. Currently it does the bottom calibration at the same interval as top calibration, so I'll also split that out into another setting rather than sharing it.

I drive my battery relatively hard (about the equivalent of 1.3 full cycles daily, which is more than I would recommend to others) so the goal is to extend the expected cycle life as much as I can by adjusting where it usually sits in the SoC range.
User avatar
HughInDevon
Posts: 67
Joined: Wed Jul 31, 2024 4:50 pm

Fascinating stuff!

This is my EQ4800 battery stack charging to 100% SoC.
Picture1.png
Picture1.png (27.79 KiB) Viewed 45206 times
It shows the 15 minutes hold at 96% charge. The voltage curve is unexpected but clearly is being managed.

I think I will go with the following strategy:

Reduce charging current to say 5.3 amps at 93% charge.
Charge to 100% at least once per week.
Discharge to 10% at least once per week. (usual minimum charge is 13 -15%)
Normal charging current of 20 A. (Calculated 16 amps to charge from 15% to 93% in 5 hours)

Hopefully this will make sure the cells are kept balanced.

Thanks to everyone for excellent guidance.
Regards, Hugh
KH10 with 4 off ECS4800 batteries.
20 Jinko 435W panels in 2 strings. 10 on house, south facing, 10 on barn, east facing.
Solar installation active on 27/11/2024. Export MPAN active on 30.12/2024.
Zappi V2 charger and 2 EVs.
Currently on Octopus Intelligent Go tariff.
Home Assistant modbus integration (Now working - ish)
WyndStryke
Posts: 60
Joined: Mon Nov 18, 2024 9:16 pm

Here's the result of my calibration automation - I got brave and set it to 100%, and it reached it OK. This is with top calibration interval at 7 days, bottom calibration interval 28 days, charge current 2.7A via number.force_charge_power (600W on an EC4300-H4) >= 97% SoC. I guess the previous time when it got stuck at 99% was because the battery was cold (probably around 6-10c) & the power from the PV in January wasn't quite enough to push it over the edge into 100%.



calibration.png
I wasn't touching bms_charge_rate but it is interesting to see it automatically react to both the SoC and the battery cell temperature.

I changed my normal operating range from 20%-80% to 20%-87%. As noted previously this is all above&beyond the existing BMS protections, because I'm using the battery quite heavily.
User avatar
HughInDevon
Posts: 67
Joined: Wed Jul 31, 2024 4:50 pm

I have been dithering about this for ages, being guilty of 'best' being the enemy of 'better'. So, in the end I have gone for a quick (and fairly dirty) top balance only routine. This is the code:

Code: Select all

alias: CB_Top1
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.battery_soc
conditions:
  - or:
      - condition: time
        after: input_datetime.fd_setlowtariffstart
        before: "23:59:59"
      - condition: time
        after: "00:00:00"
        before: input_datetime.fd_setlowtariffend
  - condition: numeric_state
    entity_id: sensor.battery_soc
    above: 89
  - condition: numeric_state
    entity_id: sensor.battery_soc
    below: 96
actions:
  - action: notify.persistent_notification
    metadata: {}
    data:
      message: CB_Top1 has triggered
  - action: number.set_value
    target:
      entity_id: number.max_charge_current
    data:
      value: >-
        {% set mySOC = states("sensor.battery_soc") | int  %}  {{18 -
        ((mySOC-89) * 2)}}
mode: single
Hopefully fairly self-explanatory but in essence I am (for now anyway) restricting the balancing action to the IOG low tariff period only. The changes I am making will progressively reduce the charging current when the battery SoC is in the range 90 to 95%. The 'normal' charging rate is set at 18 amps for my 18.64 kWh battery. The battery voltage is a nominal 180 volts, so 18 amps means charging at about 3.2 kW. This is about 0.2C charge rate. When the battery SoC reaches > 89%, each increase of 1% causes the charge current to be reduced by 2 amps, so at 95% SoC the charge rate is 6 amps. The automation gives up when the SoC reaches 96% on the grounds that Fox ESS almost certainly know more about this than I do and their BMS algorithm takes over.

There might be some battery charging outside of this period as my next project is to use spare battery capacity to reduce clipping by throttling grid export to below the DNO limit.

This is all untested at the moment. I will keep a close eye on it over the next few charging periods and see if it works or needs tweaking.
KH10 with 4 off ECS4800 batteries.
20 Jinko 435W panels in 2 strings. 10 on house, south facing, 10 on barn, east facing.
Solar installation active on 27/11/2024. Export MPAN active on 30.12/2024.
Zappi V2 charger and 2 EVs.
Currently on Octopus Intelligent Go tariff.
Home Assistant modbus integration (Now working - ish)
User avatar
HughInDevon
Posts: 67
Joined: Wed Jul 31, 2024 4:50 pm

Also, on the topic of the best regime for LFP batteries, this paper is interesting:
https://iopscience.iop.org/article/10.1 ... ad6cbd/pdf
KH10 with 4 off ECS4800 batteries.
20 Jinko 435W panels in 2 strings. 10 on house, south facing, 10 on barn, east facing.
Solar installation active on 27/11/2024. Export MPAN active on 30.12/2024.
Zappi V2 charger and 2 EVs.
Currently on Octopus Intelligent Go tariff.
Home Assistant modbus integration (Now working - ish)
WyndStryke
Posts: 60
Joined: Mon Nov 18, 2024 9:16 pm

Yeah. A pity that particular paper did not model 20-80 charging as one of the scenarios, but some other papers do cover it. High cell temperatures, high SoC ranges, high charge rates, etc all have an effect over the years.
Post Reply