IOPSCopyPowerSourcesInfo → kIOPSBatteryHealthKey returning incorrect value

IOPSCopyPowerSourcesInfo → kIOPSBatteryHealthKey returning incorrect value

Background: I write software to monitor computer system health.

I'm having problems getting battery health information on my new M2 notebook.

Given the following Objective-C program:

#include <Foundation/NSObjCRuntime.h>
#include <IOKit/ps/IOPSKeys.h>
#include <IOKit/ps/IOPowerSources.h>
#include <assert.h>
int main() {
    CFTypeRef psInfo = IOPSCopyPowerSourcesInfo();
    assert(psInfo != NULL);
    CFArrayRef list = IOPSCopyPowerSourcesList(psInfo);
    assert(list != NULL);
    long count = CFArrayGetCount(list);
    for(long i = 0; i < count; i++) {
        CFDictionaryRef ps =
            IOPSGetPowerSourceDescription(
                psInfo, CFArrayGetValueAtIndex(list, i));
        assert(ps != NULL);
        CFStringRef deviceName =
            (CFStringRef)CFDictionaryGetValue(
                ps, CFSTR(kIOPSNameKey));
        assert(deviceName != NULL);
        CFStringRef serialNumber =
            (CFStringRef)CFDictionaryGetValue(
                ps, CFSTR(kIOPSHardwareSerialNumberKey));
        assert(serialNumber != NULL);
        CFStringRef health =
            (CFStringRef)CFDictionaryGetValue(
                ps, CFSTR(kIOPSBatteryHealthKey));
        assert(health != NULL);
        NSLog(@"\nName=\"%@\"\nSerialNumber=\"%@\"\n"
            "BatteryHealth=\"%@\"\n",
            (__bridge NSString*)deviceName,
            (__bridge NSString*)serialNumber,
            (__bridge NSString*)health);
    }
    CFRelease(list);
    CFRelease(psInfo);
    return 0;
}

and looking at the IOPSKeys.h header, I expect to get one of "Poor", "Fair", or "Good" for the value of kIOPSBatteryHealthKey.

https://opensource.apple.com/source/IOKitUser/IOKitUser-1845.81.1/ps.subproj/IOPSKeys.h.auto.html

Instead, on my 2022 M2 Macbook Air running 13.2.1 (22D68), I get the following output:

Name="InternalBattery-0"
SerialNumber="F8Y2422145S10X2A7"
BatteryHealth="Check Battery"

At the same time, the "System Information app says "Condition: Normal".

Am I missing something? This seems to be a bug, right? Should I look into filing a Technical Support Incident?

Replies

I ran into the same problem yesterday on an M1 Max, using a command line tool I built for testing network and battery. Preferences reports Normal and 92% remaining capacity. Had a colleague confirm it on his M1 this morning. I'd like to test on a few more machines and at least one Intel before submitting it to Apple.

Seems to be fixed in "13.5 (22G74)".