Getting buttery status

マウスやキーボードの充電中のステイタスがメニューバーに出ないうえに、システム環境設定から対応する項目を探すのも面倒なので、スクリプトを書いた。

バッテリーステイタスに特化したコマンドは特にない(おそらく)が、ioreg (I/O Kit registry) コマンドの出力から取得できる。 ちなみにこの出力は膨大なプロパティリストで grep などの行ベースの操作では分かりづらい結果になるので、XML として出力 (-a option) し Python の xml.etree.ElementTree でパースする。

battery-status.py
import subprocess
import xml.etree.ElementTree as ET

def main():
    try:
        ioreg_result = subprocess.run(
            ['ioreg', '-a', '-k', 'BatteryPercent'],
            capture_output=True,
            encoding='utf-8',
            check=True,
        )
    except subprocess.CalledProcessError as err:
        print(err)
        exit(1)

    root = ET.fromstring(ioreg_result.stdout)
    results = list()
    for d in root.iterfind('.//{*}*[key="BatteryPercent"]'):
        key = ''
        entry = dict()
        for e in d.iterfind('./{*}*'):
            if key:
                entry[key] = e.text
                key = ''
            if e.tag == 'key':
                if e.text in ('Product', 'BatteryPercent', 'BatteryStatusFlags'):
                    key = e.text
        if entry:
            results.append(entry)

    for entry in results:
        print(f'''Product:         {entry['Product']}
Battery percent: {entry['BatteryPercent']}
Battery status:  {entry['BatteryStatusFlags']}
''')


if __name__ == '__main__':
    main()

以下出力例

Product:         Magic Keyboard
Battery percent: 22
Battery status:  0
        
Product:         Magic Mouse
Battery percent: 96
Battery status:  0

Battery status の値は BatteryStatusFlags キーから取得しており、これは UIKit の UIDevice.BatteryState にあたると思うが、どうも私の環境の ioreg コマンドからは 0: unknown(通常時)か 3: full(充電中)しか取得できなかったので不明である。

gist

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です