電源・バッテリーの情報を調べる

 Windowsのコントロールパネルで『電源オプション』を調べると、バッテリの残量なんかを見ることが出来ます。こんな風に電源やバッテリーの状態を調べてみましょう。。

 SystemInformation.PowerStatusを使用する

 System.Windows.Forms.SystemInformationのプロパティの一つに紐付けられているPowerStatusクラスを使用します。具体的には次のようにします。

import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import SystemInformation
from System.Windows.Forms import PowerLineStatus

ps = SystemInformation.PowerStatus

 まずSystemInformationのPowerStatusプロパティからPowerStatusクラスのpsを作ります。あとはpsから情報を入手するスクリプトです。

#電源に接続されているか
if ps.PowerLineStatus == PowerLineStatus.Online :
  print "コンセントに接続されています。"
elif ps.PowerLineStatus == PowerLineStatus.Offline :
  print "バッテリーを使用しています。"
elif ps.PowerLineStatus == PowerLineStatus.Unknown :
  print "電源の状態がわかりません。"

 PowerLineStatusは.NET Framework内で定義されている列挙体です。
Online、Offline、Unkownという言葉の状態が定義されています。スクリプト中ではpsのPowerLineStatusがどれになっているか調べています。

#バッテリー残量
print "バッテリー残量:",ps.BatteryLifePercent *100,"%"
if ps.PowerLineStatus == PowerLineStatus.Offline :
if ps.BatteryLifeRemaining >0 :
  print "バッテリーの残り時間:",ps.BatteryLifeRemaining/3600,":",
  print ps.BatteryLifeRemaining/60 - ps.BatteryLifeRemaining/3600*60

 バッテリーの残量を調べるスクリプトです。Microsoftの記述にはBatteryLifePercentは0〜100までの数字で、不明なときは255を返すと書かれていますが、ウソです。
調べた限りでは全部1以下で100を掛けないとパーセントになりません。
 BatteryLifeRemainingはバッテリがどこまでもつか秒単位の時間を示します。
秒から時間と分に換算するところは、電卓を叩いてみてください。

#充電状態チェック
if ps.BatteryChargeStatus.ToString().find('High')>=0 :
  print "バッテリー残量は十分あります。"

if ps.BatteryChargeStatus.ToString().find('Low')>=0 :
  print "バッテリー残量が少ないです。"

if ps.BatteryChargeStatus.ToString().find('Critical')>=0 :
  print "すぐに充電してください。"

if ps.BatteryChargeStatus.ToString().find('Charging')>=0 :
  print "充電中です。"

if ps.BatteryChargeStatus.ToString().find('NoSystemBattery')>=0 :
  print "バッテリーを使用していません。"

if ps.BatteryChargeStatus.ToString().find('Unknown')>=0 :
  print "バッテリー状態は不明です。"

raw_input()

 BatteryChargeStatusもPowerStatusと同様に列挙体なのですが、複数の状態(例えば、LowとChargihg)を示すことができます。
これまた、Microsoftの記述を実際が異なります。C++をやっている人ならビット演算で切り抜けたいところですが、ビット演算の説明をするのが面倒なので文字列のfindメゾットで逃げてみました。

合わせるとスクリプトファイルと出力は次のようになります。

import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import SystemInformation
from System.Windows.Forms import PowerLineStatus

ps = SystemInformation.PowerStatus

#電源に接続されているか
if ps.PowerLineStatus == PowerLineStatus.Online :
  print "コンセントに接続されています。"
elif ps.PowerLineStatus == PowerLineStatus.Offline :
  print "バッテリーを使用しています。"
elif ps.PowerLineStatus == PowerLineStatus.Unknown :
  print "電源の状態がわかりません。"

#バッテリー残量
print "バッテリー残量:",ps.BatteryLifePercent *100,"%"
if ps.PowerLineStatus == PowerLineStatus.Offline :
if ps.BatteryLifeRemaining >0 :
  print "バッテリーの残り時間:",ps.BatteryLifeRemaining/3600,":",
  print ps.BatteryLifeRemaining/60 - ps.BatteryLifeRemaining/3600*60

#充電状態チェック
if ps.BatteryChargeStatus.ToString().find('High')>=0 :
  print "バッテリー残量は十分あります。"

if ps.BatteryChargeStatus.ToString().find('Low')>=0 :
  print "バッテリー残量が少ないです。"

if ps.BatteryChargeStatus.ToString().find('Critical')>=0 :
  print "すぐに充電してください。"

if ps.BatteryChargeStatus.ToString().find('Charging')>=0 :
  print "充電中です。"

if ps.BatteryChargeStatus.ToString().find('NoSystemBattery')>=0 :
  print "バッテリーを使用していません。"

if ps.BatteryChargeStatus.ToString().find('Unknown')>=0 :
  print "バッテリー状態は不明です。"

raw_input()

出力画面:
 バッテリーを使用しています。
 バッテリー残量: 85.0 %
 バッテリーの残り時間: 1 : 12
 バッテリー残量は十分あります。
  ↑こんな感じで表示されます。

今回はSystemInformationクラスから電源の情報を扱いましたが、調べてみるとWindowsのいろいろな設定情報が入手できそうです。もしスクリプトからWindowsの設定を調べたいときには、このSystemInformationクラスを覚えておくと役に立つかも知れません。