PeterlFF Posted October 28, 2022 Share Posted October 28, 2022 I want to capture the watt hours capacity and percentage used (using the difference of battery charge level at 2 points in time). _WinAPI_GetSystemPowerStatus should work for the percentage used. I have used Win32_Battery but that doesn't have the data I want. This below looks like it might work for watt hours but I don't know how to get autoit to talk to a windows Namespace. Any suggestions? https://learn.microsoft.com/en-us/uwp/api/windows.devices.power.batteryreport.remainingcapacityinmilliwatthours?view=winrt-22621 Link to comment Share on other sites More sharing options...
Jfish Posted October 30, 2022 Share Posted October 30, 2022 In reading the notes on Win32_battery it says the design capacity property is the capacity expressed in milliwatt-hours. Trying to understand why that is not what you are after from reading your post? Quote DesignCapacity Data type: uint32 Access type: Read-only Qualifiers: MappingStrings ("MIF.DMTF|Portable Battery|002.8"), Units ("milliwatt-hours") Design capacity of the battery in milliwatt-hours. If the property is not supported, enter 0 (zero). This property is inherited from CIM_Battery. Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt Link to comment Share on other sites More sharing options...
PeterlFF Posted October 30, 2022 Author Share Posted October 30, 2022 (edited) @Jfish I mispoke. from the description of DesignCapacity it sounds like it the total capacity of the battery and not the amount of milliwatt-hours of charge left on the battery. I tried Win32_battery but the value for DesignCapacity is blank (ran code on my laptop which has a battery) and the value comes back as null. I tried other fields to make sure I was getting something. I get values for Availability, BatteryStatus, and Caption. Here is the code I am using: #include <MsgBoxConstants.au3> Dim $info $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") $objBatt = $objWMIservice.ExecQuery ("Select * from Win32_Battery") For $object In $objBatt $info &= 'Availability: ' & $object.Availability & @CRLF $info &= 'BatteryRechargeTime: ' & $object.BatteryRechargeTime & @CRLF $info &= 'BatteryStatus: ' & $object.BatteryStatus & @CRLF $info &= 'DesignCapacity: ' & $object.DesignCapacity & @CRLF $info &= 'FullChargeCapacity: ' & $object.FullChargeCapacity & @CRLF $info &= 'TimeOnBattery: ' & $object.TimeOnBattery & @CRLF $info &= 'TimeToFullCharge: ' & $object.TimeToFullCharge & @CRLF $info &= 'Caption: ' & $object.Caption & @CRLF Next MsgBox($MB_SYSTEMMODAL, "battery", $info) Edited October 30, 2022 by PeterlFF Link to comment Share on other sites More sharing options...
Jfish Posted October 30, 2022 Share Posted October 30, 2022 I haven't tested the code but out of pure curiosity - is your laptop plugged in when you run the code (if so, consider unplugging)? Also, confirming you are not using an emulator? "When debugging on a device emulator, the BatteryReport object returns null to the capacity and rate properties." Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt Link to comment Share on other sites More sharing options...
PeterlFF Posted October 30, 2022 Author Share Posted October 30, 2022 @JfishThe laptop is unplugged and around 90% on battery. I am not using an emulator. It is a dell laptop with windows 10 on it. Link to comment Share on other sites More sharing options...
rsn Posted October 31, 2022 Share Posted October 31, 2022 (edited) I popped open WMI Explorer to look at the properties of Win32_Battery. On the Dell system I'm using, from WMIC command line: wmic /NAMESPACE:\\root\cimv2 path Win32_Battery get EstimatedChargeRemaining,EstimatedRunTime,caption,deviceID,batterystatus Which outputs: BatteryStatus Caption DeviceID EstimatedChargeRemaining EstimatedRunTime 2 Internal Battery 183BYDDELL M3KCN12 97 71582788 I had to remove power from the laptop for a few minutes to deplete it enough for WMI to report actual numbers. Not sure how the format may change for multiple laptop batteries. Also, Win32_PortableBattery has a property DesignCapacity that is measured in milliwatt-hours. On the Dell system I'm using, from WMIC command line: wmic /NAMESPACE:\\root\cimv2 path Win32_PortableBattery get DesignCapacity Which outputs: DesignCapacity 41580 That all said, your AutoIt code is probably good (I didn't try it) but note below: BatteryRechargeTime is considered obsolete and left empty DesignCapacity, FullChargeCapacity probably aren't supported by your bios/manufacturer/battery. TimeOnBattery, TimeToFullCharge refers to UPS so may not apply to laptop internal batteries. rsn Edited October 31, 2022 by rsn Win32_PortableBattery stuff Link to comment Share on other sites More sharing options...
PeterlFF Posted October 31, 2022 Author Share Posted October 31, 2022 @rsnThanks for checking it out. I don't think Design capacity will work for me because it measures the capacity of the battery. I need to note the difference in watt hours from the start of some tasks and then at the end of those tasks. The BatteryReport API would work but I don't know how to connect to it. I tried this below but it doesn't return anything. Not even the "RemainingCapacityInMilliwattHours" header text so I don't think it even found that property or really connected to the BatteryReport API. Any ideas what I am doing wrong? #include <MsgBoxConstants.au3> Dim $info $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") $objBatt = $objWMIservice.ExecQuery ("Select * from BatteryReport") For $object In $objBatt $info &= 'RemainingCapacityInMilliwattHours: ' & $object.RemainingCapacityInMilliwattHours & @CRLF Next MsgBox($MB_SYSTEMMODAL, "battery", $info & $objDisks) Link to comment Share on other sites More sharing options...
rsn Posted October 31, 2022 Share Posted October 31, 2022 (edited) @PeterlFF So remaining capacity of the battery is what you're after. I poked around some more in WMI Explorer (highly recommended to find WMI classes and properties quickly) and found something that might help. On the Dell system I'm using, from WMIC command line: wmic /NAMESPACE:\\root\WMI path BatteryStatus get RemainingCapacity which outputs: RemainingCapacity 35226 According to the notes: RemainingCapacity - UInt32 Qualifiers: CIMTYPE, countertype, defaultscale, Description, DisplayName, perfdetail, read, WmiDataId, WmiVolatility The amount of remaining battery capacity. The measurement unit is defined by the underlying hardware platform, but is often represented in milliwatt-hours. So if I had to guess, the AutoIt code would look like this (untested): $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\WMI") $objBatt = $objWMIservice.ExecQuery ("Select * from BatteryStatus") For $object In $objBatt $info &= 'Remaining Capacity: ' & $object.RemainingCapacity & @CRLF Next Or $objBatt = $objWMIservice.ExecQuery ("Select RemainingCapacity from BatteryStatus") if you didn't have any other properties you wanted to look at (19 others if you were curious). rsn Edited October 31, 2022 by rsn Link to WMI Explorer Link to comment Share on other sites More sharing options...
PeterlFF Posted October 31, 2022 Author Share Posted October 31, 2022 @rsn That looks great but not working for me. The AutoIT code doesn't return anything. I download the WMI Explorer, connected to the laptop, found the BatteryStatus class and executed the SELECT * FROM BatteryStatus query inside WMIExplorer and it said it completed successfully and retrieved 0 instances. I tried the other Battery related classes I found there and all were the same as BatteryStatus. I tried it with the laptop plugged in and unplugged. Link to comment Share on other sites More sharing options...
rsn Posted October 31, 2022 Share Posted October 31, 2022 @PeterlFF Try running the wmic command from a command prompt. If bad gets to worse, you could run that and capture the output. I'll see if I can run some tests on the AutoIt code tomorrow. Link to comment Share on other sites More sharing options...
PeterlFF Posted October 31, 2022 Author Share Posted October 31, 2022 @rsn The command line ran successfully on the same laptop. Link to comment Share on other sites More sharing options...
Solution rsn Posted November 1, 2022 Solution Share Posted November 1, 2022 (edited) Try this: #include <MsgBoxConstants.au3> $WMIObj = ObjGet("winmgmts:\\.\root\wmi") If @error Then MsgBox($MB_ICONERROR + $MB_TASKMODAL, @ScriptName, "Error getting wmi : " & Hex(@error, 8) , 10) Exit Else $WMIObjItems = $WMIObj.ExecQuery("select RemainingCapacity FROM BatteryStatus") If IsObj($WMIObjItems) Then For $oItem In $WMIObjItems $iRemainingCapacity = $oItem.RemainingCapacity Next EndIf EndIf MsgBox (4096 , @ScriptName , "Remaining battery capacity in milliwatt hours=" & $iRemainingCapacity ) On the Dell laptop I use, the script returned 35226 @ 100% battery and 34531 @ 98%. rsn Edited November 1, 2022 by rsn Link to comment Share on other sites More sharing options...
PeterlFF Posted November 1, 2022 Author Share Posted November 1, 2022 (edited) @rsn That works. Thank you so much for helping with this. Thanks to @Jfish for your help as well. Edited November 1, 2022 by PeterlFF Link to comment Share on other sites More sharing options...
rsn Posted November 1, 2022 Share Posted November 1, 2022 Happy to help with whatever I can PeterlFF 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now