Windows如何计算电池的剩余时间?

时间:2014-02-06 19:21:01

标签: windows language-agnostic batterylevel

我正在测试一个应用程序,让用户知道何时插拔他们的笔记本电脑,以便从他们的笔记本电池中获得最大的生命。除此之外,我试图从Windows功率计复制工具提示。

到目前为止,这是相当成功的,但有一些差异。

  1. Windows剩余时间通知,例如“X hr XX min(XX%)剩余”,直到大约一分钟后才出现。
  2. 在更改电池负载的情况下,Windows剩余时间似乎更稳定
  3. 这些让我觉得Windows剩余时间算法是在过去一分钟左右的平均值,但我找不到任何相关的文档。有谁知道它究竟是做什么所以我可以重现它?

    这是我的实现(在Python中,但问题是与语言无关)。我想我需要在x秒内每次投票平均最近的y出院率,但需要知道xy的值。

    t = wmi.WMI(moniker = "//./root/wmi")
    batts = t.ExecQuery('Select * from BatteryStatus where Voltage > 0')
    
    time_left = 0
    for _i, b in enumerate(batts):
        time_left += float(b.RemainingCapacity) / float(b.DischargeRate)
    
    hours = int(time_left)
    mins = 60 * (time_left % 1.0)
    return '%i hr %i min' % (hours, mins)
    

1 个答案:

答案 0 :(得分:5)

Windows遵循ACPI specification,并且鉴于规范提供了计算剩余电池时间的方法,我认为这将是他们如何做到这一点。

修改:找到somewhat confirming source

我指的是第3.9.3章“电池电量监测计”。

Remaining Battery Percentage[%] = Battery Remaining Capacity [mAh/mWh] / Last Full Charged Capacity [mAh/mWh]* 100

如果您需要数小时:

Remaining Battery Life [h]= Battery Remaining Capacity [mAh/mWh] / Battery Present Drain Rate [mA/mW]

这基本上代表了每单位时间充电容量的当前变化率,您需要查看ACPI规范,了解Windows如何专门实现它。

我认为必须从电池控制器查询有问题的变量,我会让Windows处理那里的所有兼容性问题。 为此,存在Windows Management InstrumentationWin32_Battery和(可能更合适)Win32_PortableBattery。经过一些进一步的挖掘,似乎这些课程计算了你的剩余时间,并且没有公开当前的电池电量(可能是为了鼓励人们只计算单向/舍入问题等)。您可以做的最接近“酷”的事情是FullChargeCapacity / DesignCapacity估算/计算电池耗损量。 我能找到的下一个最好的东西似乎是通过IOCTL_BATTERY_QUERY_INFORMATION暴露的较低级API,但似乎它也没有提供毫瓦时的当前充电容量。 tl; dr如果可能,请使用上述类为您计算的剩余时间和百分比:/

<小时/> 另外,一些笔记本电脑制造商捆绑自己的工具来计算剩余时间,并在自己的电池中查询特定的微控制器实现,并能够对剩余电池做出更明智/非线性的猜测。