7. Battery Health
system_profiler when booted, ioreg in Recovery — and how to read the capacity values per era.
Use this. It reports a percentage directly — no unit interpretation, no version drift.
system_profiler SPPowerDataType
# if command not found:
/usr/sbin/system_profiler SPPowerDataTypeRead off Cycle Count, Maximum Capacity, and Condition. Done — skip to Step 8.
Interpret the Capacity Values
The unit MaxCapacity uses depends on the Mac. Read the output, not the model, to tell which case you're in:
| What you see | Era | What to do |
|---|---|---|
MaxCapacity in the thousands (4000–8000), no AppleRawMaxCapacity | Pre-T2 Intel (2017 & older) | Raw mAh — use the formula below |
MaxCapacity ≤ 100, no AppleRawMaxCapacity | T2 Intel (2018–2020) | Already a percentage — record directly |
MaxCapacity ≤ 100, AppleRawMaxCapacity present | Apple Silicon (M1+, 2020+) | Don't trust the percentage — use AppleRawMaxCapacity with the formula |
Apple Silicon pins MaxCapacity near 100
On M-series Macs MaxCapacity is commonly reported at or near 100 and ignores real wear. Always
compute from AppleRawMaxCapacity instead.
Battery Health Formula
Whenever you have a raw mAh value — MaxCapacity on pre-T2 Intel, AppleRawMaxCapacity on Apple Silicon — divide it by DesignCapacity and multiply by 100. This is arithmetic on two numbers, not a command to run:
(raw mAh value) / (DesignCapacity value) * 100Examples:
Pre-T2 Intel: MaxCapacity 6200 / DesignCapacity 6900 = ~90%
Apple Silicon: AppleRawMaxCapacity 4100 / DesignCapacity 4380 = ~94%
T2 Intel: MaxCapacity = 89 (already a percentage) → 89%Compare the cycle count against the model's rated maximum — the Battery column on the model lookup carries it. Almost every notebook since Mid-2009 is rated for 1000 cycles; older ones for 300–500.
If the Data Is Missing
Recovery battery reporting is unreliable on T2 and some Apple Silicon Macs — expect occasional missing or incomplete values. Recovery intentionally loads a reduced environment: hardware identification works well, battery telemetry may not, because it depends on power-management services, SMC communication, and OS-level frameworks that recoveryOS doesn't fully start.
Escalation path, cheapest first:
ioreg command — it intermittently returns partial output on first call.system_profiler SPPowerDataType, then remove the account or erase the machine in Step 9.Rule of thumb
ioreg in Recovery, system_profiler SPPowerDataType everywhere else. When you parse ioreg,
target each key by name (DesignCapacity, MaxCapacity, AppleRawMaxCapacity, CycleCount)
rather than by output ordering — Apple has quietly renamed and added these fields between macOS
releases.