The dashboard tells you "battery health is good" and gives you a bar chart nobody reads. That's a marketing screen, not a diagnosis. To judge a pack you need three numbers from a live BMS scan or a bench test: module voltage spread, internal-resistance rise, and capacity fade against rated. This guide is the way I actually run that read, and the thresholds where I start writing "replace module" instead of "drive another year."
Why SOH, and Why Not the Dashboard
State-of-health (SOH) is the catch-all term for how much usable life a pack has left versus its rated new condition. It's not one thing. Aging shows up as: lithium inventory lost to solid-electrolyte interphase growth (capacity fade), impedance climbing as conductive paths degrade (IR rise), and cells drifting apart from each other (imbalance). All three march together, but they don't mark time equally. A pack can lose 12% capacity and still read "good health" on the dash because it's balanced enough to deliver its now-shorter range. The dash graphs range, not degradation.
HV safety — read before you sweep a pack
- Class-0 insulated gloves, rated and re-tested, before any orange connector.
- Disconnect and WAIT — capacitors hold lethal charge minutes after cutoff.
- Isolation test with a megohmmeter, not a continuity beep.
- One hand in pocket near the pack. Always.
The Three Numbers That Matter
| Metric | What it catches | Healthy | I get suspicious | I write it up |
|---|---|---|---|---|
| Module voltage spread | Cell imbalance / weak cells | < 10 mV between modules at rest | 25–50 mV spread | > 50 mV sustained |
| Internal resistance rise | Impedance / degradation | < +10% over rated | +20–40% | > +40% on any module |
| Capacity fade | Usable energy loss | > 90% of rated | 80–90% | < 80% (or per fleet policy) |
Those are my working bands for a typical NiMH/Li-ion hybrid traction pack. Fleet policy and the vehicle's Warranty SOH threshold override them; a taxi that's down to 82% gets pulled a lot sooner than a weekend car at 78%. The shape of the fault matters as much as the number.
Capacity fade: C_fade% = C_measured / C_rated × 100
Voltage spread: V_max − V_min across all modules at 20% SOC rest.
The Procedure, In Order
- Park at known SOC. I bring the pack to ~20% SOC and let it rest minimum one hour — voltages settle; a fresh-off-charge read lies.
- Full module voltage sweep. Via the BMS scan tool or service port. Log every module, not just the pack average. I want the spread, not the mean.
- IR test. Megohmmeter for isolation on the pack side. For per-module impedance I use the BMS's own cell-balancing current pulses — every module reports voltage under a known load, and I take the delta.
- Capacity check. Controlled discharge at the nominal C-rate, logging amp-hours out. This is the slow one — it's a full discharge cycle, not a 10-minute tap.
- Read the pattern, not the bar. One module 40 mV high with matching IR rise = single weak cell, replace that module. Uniform IR creep across all = whole pack age, plan for pack, not module.
Patterns I read in the scan
- One high IR module — that cell's the weak link; the pack is fine, swap the module.
- Uniform IR rise + uniform fade — the pack is aging as a unit; schedule replacement.
- Spike on one cell at low SOC — classic lithium plating / dendrite risk. That module comes out NOW, not at the next service.
- Spread that tightens under load, widens at rest — a wiring/connector resistance, not a cell fault. Look before you condemn a battery.
Pack Simulator — You Drive the Read
Drag the three sliders and watch what I'd say about the hypothetical pack. This is the same arithmetic the BMS uses under the hood, rendered as a verdict instead of a bar.
Grounding: pack reads and thresholds above are from my field work on hybrid traction packs; chemistry baseline on the working anode/cathode assumptions cites lithium-ion battery (Wikidata). Slider verdicts follow the threshold bands in the table; a real diagnosis needs the full procedure, not the simulator.