Getting Battery Capacity in Windows with Python

11,582

Solution 1

Tim Golden's excellent wmi module will, I believe, give you everything you want. You'll just have to do several queries to get everything:

import wmi

c = wmi.WMI()
t = wmi.WMI(moniker = "//./root/wmi")

batts1 = c.CIM_Battery(Caption = 'Portable Battery')
for i, b in enumerate(batts1):
    print 'Battery %d Design Capacity: %d mWh' % (i, b.DesignCapacity or 0)


batts = t.ExecQuery('Select * from BatteryFullChargedCapacity')
for i, b in enumerate(batts):
    print ('Battery %d Fully Charged Capacity: %d mWh' % 
          (i, b.FullChargedCapacity))

batts = t.ExecQuery('Select * from BatteryStatus where Voltage > 0')
for i, b in enumerate(batts):
    print '\nBattery %d ***************' % i
    print 'Tag:               ' + str(b.Tag)
    print 'Name:              ' + b.InstanceName

    print 'PowerOnline:       ' + str(b.PowerOnline)
    print 'Discharging:       ' + str(b.Discharging)
    print 'Charging:          ' + str(b.Charging)
    print 'Voltage:           ' + str(b.Voltage)
    print 'DischargeRate:     ' + str(b.DischargeRate)
    print 'ChargeRate:        ' + str(b.ChargeRate)
    print 'RemainingCapacity: ' + str(b.RemainingCapacity)
    print 'Active:            ' + str(b.Active)
    print 'Critical:          ' + str(b.Critical)

This is certainly not cross-platform, and it requires a 3rd party resource, but it does work very well.

Solution 2

The most reliable way to retrieve this information is by using GetSystemPowerStatus instead of WMI. psutil exposes this information under Linux, Windows and FreeBSD:

>>> import psutil
>>>
>>> def secs2hours(secs):
...     mm, ss = divmod(secs, 60)
...     hh, mm = divmod(mm, 60)
...     return "%d:%02d:%02d" % (hh, mm, ss)
...
>>> battery = psutil.sensors_battery()
>>> battery
sbattery(percent=93, secsleft=16628, power_plugged=False)
>>> print("charge = %s%%, time left = %s" % (battery.percent, secs2hours(battery.secsleft)))
charge = 93%, time left = 4:37:08

The relevant commit is here.

Solution 3

import psutil

battery = psutil.sensors_battery()
plugged = battery.power_plugged
percent = str(battery.percent)

The variable percent will have the battery percent. I have written a small piece of code using python to notify when the battery is fully charged

https://github.com/Mitzzzzz/Battery-Full-Indicator

Kindly check!!

Solution 4

**Checking the battery percentage in python can be done using the psutil module as 
follows **

# Installing the psutil module
from  pip._internal import  main
main(["install", "psutil"])
import psutil

battery = psutil.sensors_battery();

# checking if the charger is plugged
if battery.power_plugged:
    print("Charging: ", battery.percent)
else:
    print("Not Charging", battery.percent ,"%");
    print( "Discharge time ", int(battery.secsleft)," sec_lft")
Share:
11,582

Related videos on Youtube

cwoebker
Author by

cwoebker

Python Lover Student Science Advocate Open Source Supporter

Updated on July 22, 2022

Comments

  • cwoebker
    cwoebker almost 2 years

    I am looking to figure out both the current Battery Capacity and the Design Capacity.

    So far what I could get to work is using the Win32_Battery() class which doesn't give all the information I need (at least not on my system). I used the pure-python wmi library for that.

    On the other hand I found this which works In Python, how can I detect whether the computer is on battery power?, but unfortunately it doesn't provide any information on Capacity neither.

    The Battery Information structure and the Battery Status structure seem perfect for this. Now I know that I have to use the DeviceIoControl function to do so and I found this C++ code that explains it a little.

    I would prefer something that simply uses ctypes and not the python win32api provided by pywin32. If you have an idea how to do this in python please let me know!

    Thanks in advance.

    • PurityLake
      PurityLake almost 11 years
      I assume you don't want to use win32api because you want to use the code across other platforms, so I'm not sure about alternative ways to do this because all systems have different APIs. If u don't need other platforms i may be able to help u
  • cwoebker
    cwoebker almost 11 years
    I tried this already and two problems came up. First the CIM_Battery class does not give you the current Capacity as far as I know. It also generally just doesn't seem to give me most of the data (Meaning I get 0's or other default values). The last part looks interesting though, I am going to try it out and let you know if it worked.
  • cwoebker
    cwoebker almost 11 years
    Thanks a lot pretty much solved all my problems. I have one issue left, the DesignCapacity always returns 0 for me. I tried performing queries and everything but even those just give me errors. I am testing this on bootcamp with windows 8 so that might be the problem there but whatever I can live without the DesignCapacity for now. Thanks a lot for your help.
  • Alex Zab
    Alex Zab over 3 years
    \ Why 'secsleft=4294967295' ??? It's 19884 hours. I have only 30% on battery
  • crispengari
    crispengari over 3 years
    Im not sure, it have been long let me go and check the documentation, then i will come back to you but i think those units aren't actually second
  • crispengari
    crispengari over 3 years
    Go ahead and check this script it may help you to get the actual time left. If it doesn't help you hit me up i will fix it for you. github.com/giampaolo/psutil/blob/master/scripts/battery.py