32

How can I read the status of the battery on my MacBookPro from my own application?

Googling has so far only revealed APIs for device drivers to handle power events - there's nothing about user-land processes accessing this information.

thanks.

Alnitak
  • 325,660
  • 70
  • 395
  • 481

5 Answers5

77

If you're looking for a quick way to query it from the command line, you'll find the pmset command helpful. To query the battery status, specifically, use:

$ pmset -g batt
Gary Chambers
  • 1,219
  • 1
  • 10
  • 10
  • 2
    And this is particularly useful when using your Mac remotely via SSH. It's good to know if you need to sprint over to it to connect to the AC! – ScrollerBlaster Sep 28 '12 at 18:55
  • 5
    curious that this got so many upvotes, when it's explicitly an API call I was looking for (per the answer I accept) – Alnitak Feb 19 '16 at 13:55
  • 4
    Plausibly because the question title/tags doesn't distinguish between scripts/CLI and compiled contexts, so many (like myself) find a trivially wrappable answer more useful than an answer that requires me to drop into a specific compiled lang. – xander Jul 17 '16 at 01:06
26

You'll want to use IOKit for this, specifically the IOPowerSources functions. You can use IOPSCopyPowerSourcesInfo() to get a blob, and IOPSCopyPowerSourcesList() to then extract a CFArray out of that, listing the power sources. Then use IOPSGetPowerSourceDescription() to pull out a dictionary (see IOPSKeys.h for the contents of the dictionary).

alfwatt
  • 1,971
  • 2
  • 17
  • 28
Ben Gottlieb
  • 84,931
  • 22
  • 173
  • 171
0

Maybe help extracted text into script app

pmset -g batt | head -n 1 | cut -c19- | rev | cut -c 2- | rev

output

Battery Power
AC Power
BGBRUNO
  • 5,819
  • 5
  • 39
  • 47
-1

For Objective-C, this works to get the current percentage:

NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;
NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/usr/bin/pmset -g batt |  perl -ne ' print \"$1\n\" if /([0-9]+%)/'";
NSPipe *pipe = [NSPipe pipe];
task.standardOutput = pipe;
[task launch];
NSData *data = [pipe availableData];
hd1
  • 32,598
  • 5
  • 75
  • 87
-3

Look at the System Management Controller. I don't have my MBP handy, but I believe you need to look at smc.h

Terry Wilcox
  • 9,000
  • 1
  • 35
  • 36