A Battle Born BB10012 stops accepting charge at −3.89°C (25°F) — not a suggestion, a hard cutoff enforced by the battery's own BMS. In Boise, where the design low is −14.9°C, that cutoff isn't a rare edge case: it's the normal state of an unheated LiFePO4 bank on an ordinary winter night. The panels can be making full power at sunrise and the battery will still refuse every electron of it.
Why a BMS refuses charge instead of just warning
Charging a lithium-ion or LiFePO4 cell below freezing does not merely charge it slowly or inefficiently — it plates metallic lithium onto the surface of the graphite anode instead of intercalating it normally into the graphite structure. Above roughly 0°C to 5°C, lithium ions have enough mobility to insert themselves between the graphite layers the way the cell was designed to work. Below that threshold, ion mobility drops enough that incoming lithium can't get inserted fast enough, so it deposits as metal on the anode surface instead.
That plating is not a temporary state that reverses on warming. It permanently consumes lithium inventory (reducing capacity every time it happens), and the plated metal can grow into dendrites — needle-like structures that can eventually pierce the separator between anode and cathode, causing an internal short and, in the worst case, thermal runaway. This is a degradation-and-fire-risk mechanism, not a performance nuisance, which is why a well-designed BMS is built to cut charging current entirely rather than let it through with a warning. A voltage sag or a shortened runtime is recoverable; plated lithium is not.
Discharging is a different mechanism and is not blocked the same way. Pulling current out of a cold cell increases internal resistance and reduces available capacity, but it does not plate lithium, so most LiFePO4 BMS units allow discharge down to around −20°C while cutting off charge input at a much warmer threshold — often 0°C, sometimes milder. The asymmetry is deliberate: the battery can still run the lights and the fridge on a cold night, it just won't take a charge until conditions change or a heater intervenes.
What the catalog's min_charge_temp_c and heated fields actually mean
Every LiFePO4 battery in the parts catalog carries two relevant fields: min_charge_temp_c, the coldest ambient temperature at which the cell's BMS will accept charge current, and heated, a flag for batteries with an internal heating pad that warms the cells above that threshold before allowing charge current through. The two fields interact in a specific way worth being precise about, because it's not intuitive: a heated battery bypasses the freeze risk regardless of what number sits in min_charge_temp_c, because the heater is designed to bring the cells above that number automatically before the BMS would ever need to refuse a charge cycle. An unheated battery with the same printed number has no such mechanism — if ambient temperature is below the threshold, charging simply stops.
The published thresholds vary more than the "0°C is the LiFePO4 limit" rule of thumb suggests. Querying the catalog for verified and draft batteries with a charge-temperature spec on record returns a real spread:
| Battery | Chemistry | Min. charge temp. | Heated? |
|---|---|---|---|
| Battle Born BB10012 | LiFePO4 | −3.89°C (25°F) | No |
| Battle Born BB10012H | LiFePO4 | −3.89°C (25°F) | Yes |
| LiTime 12V 100Ah (Group 31) | LiFePO4 | 0°C (32°F) | No |
| Renogy REGO 12.8V 104Ah | LiFePO4 | −10°C (14°F) | No |
| RELiON RB100 | LiFePO4 | −20°C (−4°F) | No |
| Renogy Core Mini 12V 100Ah DuoHeat | LiFePO4 | −30°C (−22°F) | Yes |
Two things stand out. First, the Battle Born pair shows the point about the heated flag directly: BB10012 and BB10012H list the identical −3.89°C figure, yet only one of them ever hits that limit in practice, because the heated version's pad keeps the cells above it. Second, "0°C" is not a universal LiFePO4 constant — it's one manufacturer's choice among several; RELiON's unheated RB100 tolerates charging 20°C colder than LiTime's unheated Group 31 unit, both without any heater at all, simply from differences in cell chemistry and BMS calibration.
A concrete comparison: the same city, two batteries
Boise's design low — the multi-year average of each winter's single coldest night — is −14.9°C, with a record low of −31.7°C. Put the RELiON RB100 (limit −20°C, unheated) and the LiTime Group 31 (limit 0°C, unheated) in Boise side by side:
| Battery | Min. charge temp. | Boise design low (−14.9°C) | Boise record low (−31.7°C) |
|---|---|---|---|
| RELiON RB100 | −20°C | Charges fine (−14.9 > −20) | Refuses (−31.7 < −20) |
| LiTime Group 31 | 0°C | Refuses (−14.9 < 0) | Refuses (−31.7 < 0) |
Same panels, same controller, same city, same night — one battery takes the morning's charge and one doesn't, purely because of a BMS calibration difference that has nothing to do with capacity, brand reputation, or price tier. A buyer comparing these two batteries on capacity and price alone, without checking this field, would size an otherwise-identical system that works in Boise for eight months a year and silently stops recharging for the other four.
The project's own rule: lithium-freeze
This exact check is encoded as the lithium-freeze rule (src/rules.json, evaluated by evaluateRules() in the engine). Its condition, in plain terms: the battery's chemistry is lifepo4, it is not flagged heated, a location is attached to the build, and the location's design low is colder than the battery's min_charge_temp_c (defaulting to 0°C if the field is missing). When all four hold, the rule fires at error severity — the configurator's highest tier, reserved for combinations that don't just underperform but actively fail — with the message: "Lithium won't accept charge below {limit} °C, and the coldest hour in {location} in {month} is {temp} °C. Use a heated battery." The rule also computes which calendar month actually produces that coldest hour, using the location's month-by-month ambient minimums, so the message names a specific month rather than a vague "winter."
The rule's suggested fix is not "add a heater" as an accessory — it's { slot: 'battery', heated: 1 }, meaning the configurator's fix path swaps in a battery that already has the flag, because a heated pad has to be integrated with the cell's own BMS logic to work safely; it is a battery-selection decision, not an add-on. A build with an unheated battery and a location colder than that battery's threshold cannot be resolved by adding insulation or a space heater in the enclosure — ambient temperature at the terminals is what the BMS measures, and a heated battery is the only fix path the rule offers because it's the only one that reliably works.
How many months of the year this actually trips, not just the coldest night
Design low is a single number, but a real winter isn't a single night — it's a run of months, several of which can sit below a battery's charge threshold even in a place that doesn't feel like the Arctic. Boise's location record carries a month-by-month ambient minimum: −8°C (Jan), −8°C (Feb), −3°C (Mar), −2°C (Apr), 2°C (May), 3°C (Jun), 9°C (Jul), 11°C (Aug), 4°C (Sep), −3°C (Oct), −5°C (Nov), −16°C (Dec). Comparing each month against the two batteries from the table above shows how differently "unheated LiFePO4 in Boise" plays out depending on which unheated battery it is:
| Battery | Charge threshold | Months below threshold | Count |
|---|---|---|---|
| Battle Born BB10012 (unheated) | −3.89°C | Jan, Feb, Nov, Dec | 4 of 12 |
| LiTime Group 31 (unheated) | 0°C | Jan, Feb, Mar, Apr, Oct, Nov, Dec | 7 of 12 |
| RELiON RB100 (unheated) | −20°C | none | 0 of 12 |
This is why the lithium-freeze rule's message names a specific month rather than just repeating the design low: the rule walks the location's twelve monthly minimums, and if the design-low month itself doesn't happen to be the one that trips the threshold, it searches for whichever month actually does and reports that one, with its own temperature. A battery that clears the design low by a comfortable margin can still fail in a single unusually cold month buried elsewhere in the year's data — the LiTime Group 31 in the table above fails in October and April, months a design-low comparison alone wouldn't necessarily flag as suspect. Reading the rule's output as "this fails in the coldest month" rather than "this fails once a year" is the more accurate mental model: for the LiTime unit here, more than half the calendar year is spent below its own charge threshold.
Try it: does the rule fire for your battery and location?
Enter a battery's minimum charge temperature, whether it's flagged heated, and a location's design low. This mirrors the exact lithium-freeze condition from src/rules.json: chemistry lifepo4, not heated, and design low colder than the limit.
Result: —
What this means in practice
Three consequences follow directly from how the BMS and the rule work, not from a general caution about cold weather:
- Check
min_charge_temp_cagainst design low, not against "does it get below freezing here." A battery rated to −10°C is fine in a location whose design low is −8°C and fails in one whose design low is −14.9°C, even though both places would casually be described as having "cold winters." - A heated battery is a different product decision than an unheated one with a colder-sounding spec. The RELiON RB100's −20°C rating and a heated battery's internal pad solve the same problem differently — one relies on the cell chemistry tolerating cold natively, the other actively warms the cells — but only the heated flag guarantees charging continues at temperatures below whatever number is printed, because the heater's job is specifically to keep the cells warmer than ambient.
- The failure mode is a dead charge cycle, not a damaged battery — as long as the BMS is working. A correctly functioning BMS refusing to charge below its threshold is the system behaving as designed: no plating occurs because no charge current flows. The actual damage scenario is a BMS that fails to enforce the cutoff, or a charge controller and battery from different vendors where the low-temperature disconnect isn't wired through at all — which is exactly why the rule treats this as a build-configuration problem to catch before the parts ship, not a warning label to read afterward.
The battery catalog lists min_charge_temp_c and heated for every LiFePO4 battery on the site, and every location page lists design low and record low, so this comparison can be run for any battery-and-location pairing, not just the ones above.
These results are for reference. Wiring must be installed by a qualified electrician. Mobile installations follow ABYC E-11; stationary ones NEC 690/706.