Every Infinite Battery carries four LEDs. Most of the time they are simply a charge gauge in green. The rest of the time they are a diagnostic: which subsystem is in fault, how severe it is, and whether the pack can stay in service. This page is the full decoding table, exactly as the firmware drives it.
The firmware evaluates seven cases in a fixed order and displays the first one that applies. An OTA update hides everything else; a critical fault hides the charge gauge. So a pack showing green is not just charged — it is also free of every condition above.
Breathing only ever happens while charging: a 1 s triangle pulse between off and half brightness. Blinking only ever happens while not charging: 2 s period, 50 % duty, at full brightness. The two never coexist, so the animation alone tells you whether a charger is connected.
LED 1 is blue throughout; the following LEDs count the progress. Do not disconnect the pack while blue LEDs are counting up.
| Step | LED 1 | LED 2 | LED 3 | LED 4 |
|---|---|---|---|---|
| Fetching the URL | ||||
| Downloading the firmware | ||||
| Success | ||||
| Failure |
A single blue LED after an update attempt means the update failed — the pack keeps its previous firmware and can be retried.
The pack is running the factory image. It is not a fault, but the pack is not in its field configuration either — it should be provisioned before being shipped or put in service.
| State | LEDs | Pattern |
|---|---|---|
| Factory mode | All four solid, dim orange · RGB(51, 33, 0) — a low-brightness amber, not black |
All four LEDs go red. The pattern separates the two severities: blinking is critical, solid is major. Alerts come either from the pack's own monitoring or from the level pushed by the backend.
| Level | LEDs | Pattern |
|---|---|---|
| Critical | All four blinking red, 500 ms period | |
| Major | All four solid red |
In addition to the level sent by the backend, the pack raises these alerts on its own.
| Cause | Identifier | Level |
|---|---|---|
| BMS temperature | bms_temperature | Critical |
| Cell temperature | cells_temperature | Critical |
| Critical humidity | critical_humidity | Critical |
| Temperature spread between cells | — | Major |
| Major humidity | major_humidity | Major |
| Safety under-voltage | safety_under_voltage | Major |
| Voltage spread between cells | — | Major |
These are feedback, not faults: each one is triggered by an action and clears on its own. If you see one, someone — or something — just did something to the pack.
| Trigger | LEDs | Pattern |
|---|---|---|
| "Flash lights" command app / backend |
All four blinking white, 500 ms — used to locate a pack in a rack | |
| Config button pressed | All four blinking magenta, 500 ms — sensitive BLE actions are unlocked | |
| Forced discharge Pony only |
All four solid pink · RGB(255, 20, 147) | |
| Tap detected Pony only |
All four white |
Solid red on all four LEDs, with no alert pending, means a permanent failure has been latched. The pack does not recover on its own: it goes back to a repair point.
| Condition | LEDs | Pattern |
|---|---|---|
| Permanent failure, or cell over-voltage COV beyond the threshold + 50 mV |
All four solid red |
The permanent failures concerned: safety under-voltage (suv), copper deposition (cudep), charge FET fault (cfetf) or discharge FET fault (dfetf), and the BQ's internal faults (otpf, drmf, irmf, lfof, vssf, hwmx, cmdf).
Solid red is shared by a major alert (priority 3) and a permanent failure (priority 5). The two cannot be told apart on the LEDs alone: read the pack's event history in the portal to know whether it is recoverable or a repair.
This is the only case where the LEDs form a readable code. LED 1 red marks "error mode"; LED 3 carries current errors and LED 4 carries temperature errors, each one encoded by its colour in the two tables below.
| LED | Shown | Meaning |
|---|---|---|
| LED 1 | Red — "error mode" marker, always lit | |
| LED 2 | Always off — unused. Voltage errors are either critical or filtered out | |
| LED 3 | Current errors — the colour says which one · see Table 8 | |
| LED 4 | Temperature errors — the colour says which one · see Table 9 |
In priority order: the first condition that applies sets the color.
| Color | LED | Meaning |
|---|---|---|
| Red | Short circuit in discharge (scd / scdl) | |
| Yellow | Over-current in discharge (ocd1, ocd2 or ocd3) | |
| Cyan | Over-current in charge (occ) | |
| Off | No current error |
| Color | LED | Meaning |
|---|---|---|
| Cyan | Under-temperature (cutd or intut) — including when an over-temperature is present as well | |
| Yellow | Over-temperature (cotd, intot or fot) | |
| Off | No temperature error |
Pick what the pack is showing on LED 3 and LED 4 to read the code back.
Some conditions are filtered out before they ever reach the LEDs, because they describe normal use rather than a fault: cell under-voltage cuv (the battery is simply empty), cutc / cotc (pending charger detection), covl, and cell over-voltage cov below the threshold + 50 mV (the battery is simply full).
The normal state. One LED per quarter of the state of charge, in green. The gauge behaves differently depending on whether the pack is charging, so the two cases are read from different tables.
Breathing — a 1 s triangle pulse between off and 50 % brightness. It happens only while charging.
Blinking — 2 s period, 50 % duty cycle, full-brightness green. It happens only when not charging.
Any LED below the topmost lit one is always solid green.
The topmost lit LED breathes; the ones below it are solid green.
| SOC | LED 1 | LED 2 | LED 3 | LED 4 |
|---|---|---|---|---|
| ≤ 25 % | breathes | |||
| 25 – 50 % | breathes | |||
| 50 – 75 % | breathes | |||
| 75 – 90 % | breathes | |||
| ≥ 90 % standard |
||||
| ≥ 90 % Pony |
breathes |
On the standard scale the first step is split into two bands (≤ 0 % and 0 – 25 %), but both breathe on LED 1 while charging. The two scales only diverge at the top: at ≥ 90 % a standard pack is fully solid, a Pony keeps breathing on LED 4.
Nothing breathes. Blinking marks a flat battery.
| SOC | LED 1 | LED 2 | LED 3 | LED 4 |
|---|---|---|---|---|
| ≤ 0 % | blinks | |||
| 0 – 25 % | ||||
| 25 – 50 % | ||||
| 50 – 75 % | ||||
| ≥ 75 % |
Each step has a "low" zone where the topmost LED blinks instead of being solid.
| SOC | LED 1 | LED 2 | LED 3 | LED 4 |
|---|---|---|---|---|
| ≤ 25 % | blinks | |||
| 25 – 30 % | ||||
| 30 – 50 % | blinks | |||
| 50 – 55 % | ||||
| 55 – 75 % | blinks | |||
| 75 – 80 % | ||||
| 80 – 90 % | blinks | |||
| ≥ 90 % |
A blinking LED in the middle of the strip — LED 2, 3 or 4 — only exists on the Pony scale, and always means the pack has just entered that step. On the standard scale, blinking only ever appears on LED 1, and only at 0 %.
In the first moments after boot, the pack has no measurement to display yet. These three patterns say how far it got. Two of them are white — the pack drives RGB(127, 127, 127), which is simply white at half brightness, so do not expect a distinguishable grey in the field.
| State | LEDs | Pattern |
|---|---|---|
| First 3 seconds after boot | All four show the default pattern below | |
| No configuration loaded | All four blinking yellow, 2 s period — the pack needs to be provisioned | |
| Config OK, BQ/SOC not ready | All four solid white at half brightness · RGB(127, 127, 127) — reads as plain white in the field |
In error mode LED 2 is explicitly unused, so a "current + temperature" code only ever uses three of the four LEDs. It is not a dead LED — the slot is free, and it is where voltage errors would go if they were ever surfaced.
Cyan is over-current in charge on LED 3 and under-temperature on LED 4. The color alone is ambiguous — the position is what disambiguates it. Confirm which end of the strip is LED 1 before calling it, or the two faults swap.
Neither is a defect. Both are reasons to pin down the LED orientation in your own service documentation before training technicians on this table.
Every pack also reports its state to the Infinite portal, with the full event history behind each LED pattern. If a pack shows something that isn't on this page, send us its serial number.