How does Coconut Battery determine a Macbook battery's design capacity?

A macbook's battery has three charge numbers:

  1. The current charge
  2. The maximum charge
  3. The design capacity

Even if a Macbook remains plugged in, OS X does not attempt to charge—as long as (1) is 95% of (2), which is why the percentage in the notification bar will often be between 95% and 100%.

These two numbers are in contrast with a battery's "design capacity". Coconut Battery is the only software I've found that reports a Macbook battery's "design capacity".

This design capacity does not appear in Apple's specs, in System Information, or at everymac.com.

How does Coconut Battery determine the design capacity of a battery?


You can find this information along with much other battery and/or system information from the command

ioreg

This command, according to its man page, does:

ioreg displays the I/O Kit registry. It shows the heirarchical1 registry structure as an inverted tree.

1: heirarchical [sic]

Using a filter by class name (AppleSmartBattery for battery) to get only battery-related information:

$ ioreg -brc AppleSmartBattery
-b    Show the object name in bold.
-r    Show subtrees rooted by objects that match the specified criteria.
       If none of -c, -k, or -n are supplied, -r has no effect.
-c    Show the object properties only if the object is an instance of, or
       derives from, the specified C++ class (e.g. IOService).

From man ioreg.

Will print something like this:

$ ioreg -brc AppleSmartBattery
+-o AppleSmartBattery  <class AppleSmartBattery, id 0x100000254, registered, ma$
{
  "ExternalConnected" = Yes
  "TimeRemaining" = 0
  "InstantTimeToEmpty" = 65535
  "ExternalChargeCapable" = Yes
  "FullPathUpdated" = 1464849055
  "CellVoltage" = (4298,4292,4299,0)
  "Voltage" = 12889
  "BatteryInvalidWakeSeconds" = 30
  "AdapterInfo" = 0
  "MaxCapacity" = 5524
  "PermanentFailureStatus" = 0
  "Manufacturer" = "SMP"
  "Location" = 0
  "CurrentCapacity" = 5524
  "LegacyBatteryInfo" = {"Amperage"=0,"Flags"=5,"Capacity"=5524,"Current"=5$
  "FirmwareSerialNumber" = 1
  "BatteryInstalled" = Yes
  "PackReserve" = 200
  "CycleCount" = 318
  "DesignCapacity" = 6330
  "OperationStatus" = 58371
  "ManufactureDate" = 17726
  "AvgTimeToFull" = 65535
  "BatterySerialNumber" = "D864403T3UVFVN7A6"
  "BootPathUpdated" = 1464353527
  "PostDischargeWaitSeconds" = 120
  "Temperature" = 3096
  "UserVisiblePathUpdated" = 1464849490
  "InstantAmperage" = 0
  "ManufacturerData" = <000000000702000a03890000034a34340330304103534449032$
  "MaxErr" = 1
  "FullyCharged" = Yes
  "DeviceName" = "bq20z451"
  "IOGeneralInterest" = "IOCommand is not serializable"
  "Amperage" = 0
  "IsCharging" = No
  "DesignCycleCount9C" = 1000
  "PostChargeWaitSeconds" = 120
  "AvgTimeToEmpty" = 65535
}

The field you are looking for is DesignCapacity. For convenience, filter it out with grep (unit is milliamp-hours, or mAh):

$ ioreg -brc AppleSmartBattery | grep DesignCapacity
      "DesignCapacity" = 6330

Your DesignCapacity field may not display 6330 as its value. I'm using a 13" mid-2014 rMBP, but you may be using another system with different battery ratings.

Apart from battery information, ioreg can be used to find out more about your system and other peripherals - somewhat like a command-line System Information tool.


If you're looking for a code-implementation of this command, take a look at Beltex's SystemKit over on Github. It's one of the coolest Swift libraries I know of.

Disclaimer: not affiliated to SystemKit or Beltex. Just a happy user of SystemKit.