Getting buttery status
マウスやキーボードの充電中のステイタスがメニューバーに出ないうえに、システム環境設定から対応する項目を探すのも面倒なので、スクリプトを書いた。
バッテリーステイタスに特化したコマンドは特にない(おそらく)が、ioreg
(I/O Kit registry) コマンドの出力から取得できる。 ちなみにこの出力は膨大なプロパティリストで grep
などの行ベースの操作では分かりづらい結果になるので、XML として出力 (-a
option) し Python の xml.etree.ElementTree でパースする。
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
(充電中)しか取得できなかったので不明である。