2014-02-06 248 views
6

我正在測試一個應用程序,以便讓用戶知道何時插入和拔下筆記本電腦以最大限度地利用筆記本電腦電池。除此之外,我試圖從Windows功率計複製工具提示。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) 
+0

只是一個澄清 - 你使用[任何這些函數](http://msdn.microsoft.com/en-us/library/windows/desktop/aa373163%28v=vs.85%29.aspx)某處? – admdrew

+1

這是估計的課程。它沒有時間機器知道你要開始玩遊戲並迅速耗盡你的電池。 –

+1

@admdrew我正在使用'wmi',這是一個大概在某個級別包裝這些​​函數的Python包。我正在從[此答案](http://stackoverflow.com/a/16380996/1706564)執行。 –

回答

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;博士用剩下的時間,通過上述類,如果可能爲你計算的百分比:/


順便說一句,一些筆記本電腦廠商捆綁自己的工具來計算剩餘時間和查詢特定微控制器實現他們的擁有自己的電池,並能夠對剩餘電池做出更明智/非線性的猜測。

+0

這很棒。如果您可以按照msdn.microsoft.com/en-us/library/aa394074%28VS.85%29.aspx中所述的方式添加如何從Windows進行查詢,賞金是您的。 –