2014-02-06 13 views
6

Ich teste eine App, um die Benutzer wissen zu lassen, wann sie ihren Laptop anstecken und ausstecken müssen, um das meiste aus ihrer Laptopbatterie herauszuholen. Außerdem versuche ich den Tooltip vom Windows Power Meter zu replizieren.Wie berechnet Windows die verbleibende Zeit im Akkubetrieb?

Es ist bisher ziemlich erfolgreich mit ein paar Unterschieden.

  1. Die Windows-Zeit verbleibende Benachrichtigung, z. "X hr XX min (XX%) verbleibend", erscheint erst nach etwa einer Minute.
  2. Die restliche Windows-Zeit scheint stabiler unter wechselnder Batterie lädt

Diese führt mich zu denken, dass die Windows-Zeit in den letzten Minuten verbleibenden Algorithmus oder so ist mit durchschnittlich aber ich jede Dokumentation, dass nicht finden kann. Weiß jemand genau, was es tut, damit ich es reproduzieren kann?

Hier ist meine Implementierung (in Python, aber die Frage ist sprachunabhängig). Ich denke, ich muss die neuesten x Entladungsraten von der Abfrage alle y Sekunden, aber müssen die Werte für x und y kennen.

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

Nur eine Klarstellung - verwenden Sie [irgendeine dieser Funktionen] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa373163%28v=vs.85%29.aspx) irgendwo ? – admdrew

+1

Es ist natürlich eine Schätzung. Es hat keine Zeitmaschine, um zu wissen, dass Sie anfangen werden, ein Spiel zu spielen und schnell Ihre Batterie zu entleeren. –

+1

@admdrew Ich verwende 'wmi', ein Python-Paket, das vermutlich diese Funktionen auf einer bestimmten Ebene wickelt. Ich bin nach der Umsetzung von [dieser Antwort] (http://stackoverflow.com/a/16380996/1706564). –

Antwort

5

Windows die ACPI specification folgt, und die Spezifikation gegeben gibt ein Verfahren zur Herstellung verbleibende Batteriezeit zu berechnen, würde ich das annehmen würde, wie sie es tun würden.

Bearbeiten: Gefunden somewhat confirming source.

Ich beziehe mich speziell auf Kapitel 3.9.3 "Battery Gas Gauge".

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

, wenn Sie in Stunden brauchen, dass:

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

Dies resultierte im Wesentlichen die aktuelle Änderungsrate pro Zeiteinheit in Ladekapazität darstellt, werden Sie bei der ACPI-Spezifikation aussehen müssen um zu sehen, wie Windows es spezifisch implementiert.

Die fraglichen Variablen, die ich annehmen würde, müssten vom Batteriecontroller abgefragt werden, und ich würde Windows erlauben, alle Kompatibilitätsprobleme dort zu behandeln. Dafür gibt es die Windows Management Instrumentation Klassen Win32_Battery und (wahrscheinlich geeigneter) Win32_PortableBattery. Nach etwas weiterem Graben scheint es so, als ob diese Klassen die verbleibende Zeit für Sie berechnen und die aktuelle Ladung der Batterie nicht aussetzen (wahrscheinlich um Leute dazu zu ermutigen, dass sie nur eine Art berechnet wird/Rundungsprobleme usw.). Die nächste "coole" Sache, die Sie tun können, ist die Abschätzung der Batterie durch FullChargeCapacity/DesignCapacity. Die nächste beste Sache, die ich finden könnte, scheint eine niedrigere Ebene API durch IOCTL_BATTERY_QUERY_INFORMATION ausgesetzt sein, aber das scheint, wie es auch nicht aktuelle Ladekapazität in Milliwatt-Stunden gibt. tl; dr Verwenden Sie die restlichen Zeiten und für Sie errechnete Prozentsätze von den oben genannten Klassen, wenn möglich:/


Als beiseite, bündeln einige Laptop-Hersteller ihre eigenen Werkzeuge verbleibende Zeit und Abfrage spezifische Mikro-Controller-Implementierungen in ihren berechnen eigene Batterien und sind in der Lage, eine fundiertere/nichtlineare Beantwortung der Restbatterie durchzuführen.

+0

Das ist toll. Wenn Sie in hinzufügen könnten, wie es aus dem Windows abfragen, wie in msdn.microsoft.com/en-us/library/aa394074%28VS.85%29.aspx der Bounty Sie beschrieben. –