【问题标题】:How does Windows calculate remaining time on battery?Windows 如何计算电池剩余时间?
【发布时间】:2017-02-02 04:04:23
【问题描述】:

我正在测试一个应用程序,让用户知道何时插入和拔出笔记本电脑,以最大限度地利用笔记本电脑的电池。除此之外,我正在尝试从 Windows 功率计复制工具提示。

到目前为止,它相当成功,但有一些不同之处。

  1. Windows 剩余时间通知,例如“剩余 X 小时 XX 分钟 (XX%)”,大约一分钟后才会显示。
  2. 在不断变化的电池负载下,Windows 剩余时间似乎更稳定

这些让我认为 Windows 剩余时间算法是过去一分钟左右的平均值,但我找不到任何文档。有谁知道它的确切作用,以便我可以重现它?

这是我的实现(在 Python 中,但问题与语言无关)。我想我需要平均每 y 秒轮询一次的最新 x 放电率,但需要知道 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)

【问题讨论】:

标签: windows language-agnostic batterylevel


【解决方案1】:

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 如果可能,请使用上述课程为您计算的剩余时间和百分比:/


顺便说一句,一些笔记本电脑制造商捆绑了他们自己的工具来计算剩余时间并在他们自己的电池中查询特定的微控制器实现,并且能够对剩余电池做出更明智/非线性的估计。

【讨论】:

  • 这很棒。如果您可以按照 msdn.microsoft.com/en-us/library/aa394074%28VS.85%29.aspx 中的说明添加如何从 Windows 查询它,那么赏金就是您的了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多