Triki z PowerShellem #17 – Stan baterii

2010-11-02 18:27

Wykonywałem ostatnio skomplikowane akrobacje z bashem, plikiem /etc/rc.local, modułami kernela i innymi linuksowymi wynalazkami, aby uruchomić system spod znaku pingwina na swoim laptopie. Problem leżał w posiadaniu przezeń dwóch kart graficznych, działających w trybie hybrydowym, z których jedna (zintegrowana) działa zawsze, natomiast druga (zewnętrzna) budzi się na żądanie w celu obsłużenia bardziej skomplikowanych aplikacji graficznych i gier. Naturalnie Linux nie jest przygotowany do współpracy z tą technologią. więc o bezproblemowym działaniu X-owych okienek (poza trybem recovery) nie mogło być mowy.
Rozwiązaniem było całkowite wyłączenie zewnętrznej karty i to w niezbyt delikatny sposób, bo poprzez… pozbawienie jej zasilania za pomocą odpowiedniego polecenia modułu acpi. O tym, czy polecenie to faktycznie coś dało, mogłem się natomiast przekonać przy pomocy obserwacji szybkości rozładowywania się baterii, dostępnej w pliku /proc/acpi/battery/BAT1/state i wyglądającej mniej więcej tak:

  1. present:                 yes
  2. capacity state:          ok
  3. charging state:          discharging
  4. present rate:            13634 mW
  5. remaining capacity:      57720 mWh
  6. present voltage:         15947 mV

Tak to właśnie wygląda na systemie, który podobno “po prostu działa” ;-) Żarty żartami, ale powyższy raport nt. stanu zasilania jest zbiorem całkiem interesujących informacji, które byłyby pożyteczne także i w systemie Windows. Pomyślałem więc, czy i tam nie udało by się pozyskać podobnych danych. Odpowiedź – jak można się domyślić – jest oczywiście pozytywna.

Nietrudno też odgadnąć, jakiego narzędzia można w tym celu użyć. Tak jest, chodzi oczywiście o naszą ulubioną windowsową konsolę, czyli PowerShell :) Jak to już nie tak dawno temu pokazywałem, daje ona dostęp do WMI, czyli narzędzi służących między innymi do interakcji ze sterownikami sprzętowymi systemu Windows. Wśród API, jakie dzięki temu dostajemy do ręki, znajduje się między innymi także i to, które pozwala na dostęp do informacji o aktualnym stanie baterii komputera: stopniu naładowania, przewidywanego czasu pracy, i tak dalej.
Skrypt, który potrafi te dane pobrać, może wyglądać na przykład tak:

  1. # battery.ps1
  2. # Pokazuje stan baterii
  3.  
  4. $battery = Get-WmiObject -Class Win32_Battery
  5. $bs = Get-WmiObject -Class batterystatus -Namespace root\WMI -ErrorAction SilentlyContinue
  6.  
  7.  
  8. # Podstawowe dane
  9. "Name:              " + $battery.Name | Out-Host
  10. "Charge (%):            " + $battery.EstimatedChargeRemaining | Out-Host
  11.  
  12. # Reszta
  13. if ($bs -ne $null) {
  14.     if ($bs.Discharging)    { $state = "Discharging" }
  15.     else                    { $state = "Charging" }
  16.     if ($bs.PowerOnline)    { $state += " (Power ON)" }
  17.     else                    { $state += " (Power OFF)" }
  18.     "State:             " + $state | Out-Host
  19.    
  20.     if ($bs.Discharging) {
  21.         # Obliczamy czas życia na podstawie szybkości rozładowywania
  22.         $time = $bs.RemainingCapacity / $bs.DischargeRate
  23.         $hours = [int][Math]::Floor($time)
  24.         $minutes = [int](($time - $hours) * 60)
  25.    
  26.         "Remaining time (h:m):      " + $hours + ":" + $minutes | Out-Host
  27.         "-------------------------------------------------------" | Out-Host
  28.         "Discharge rate (mW):       " + $bs.DischargeRate | Out-Host
  29.         "Remaining capacity (mWh):  " + $bs.RemainingCapacity | Out-Host
  30.     }
  31. }
  32. else { 
  33.     # Pobieramy czas życia z systemu
  34.     if ($battery.EstimatedRunTime -ne $null) {
  35.         $hours = [int][Math]::Floor($battery.EstimatedRunTime / 60)
  36.         $minutes = $battery.EstimatedRunTime % 60
  37.         "Remaining time (h:m):      " + $hours + ":" + $minutes | Out-Host
  38.     }
  39. }

Posługuje się on klasą Win32_Battery z WMI, a także batterystatus. Druga z tych klas jest nieudokumentowana i nie zawsze musi być dostępna. Jeśli jednak jest, daje ona zwykle szczegółowe informacje na temat zużycia energii przez nas sprzęt i możliwość bardziej wiarygodnego wyliczenia przybliżonego czasu dalszej pracy.
Po uruchomieniu skrypt może wyprodukować wyjście podobne do poniższego:

Przy jego pomocy możemy więc badać np. jak różne ustawienia jasności ekranu wpływają na pobór mocy przez nasz sprzęt.

Tags: , , , ,
Author: Xion, posted under Applications, Programming »



Adding comments is disabled.

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.