デュアルバッテリーを搭載したThinkPadラップトップを持っていますが、外部バッテリーが接続されている/接続されていないときにアクションを実行するGNOME用のインジケーターアプリを作成したいと思います。これらのイベントを読み取るために、次のようにacpidソケットに接続します。
#!/usr/bin/env python3
import socket
ACPID_SOCKETFILE = "/var/run/acpid.socket"
RECV_SIZE = 4096
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(ACPID_SOCKETFILE)
try:
while True:
data = s.recv(RECV_SIZE)
print(repr(data))
except:
s.close()
raise
そして、私は次のような出力を取得します:
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000001 00000001\n'
b'battery PNP0C0A:01 00000001 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000080 00000001\n'
b'battery PNP0C0A:01 00000003 00000000\n'
b'battery PNP0C0A:01 00000003 00000000\n'
4番目の列は、バッテリーが接続されている場合は1
であり、プラグが抜かれている場合は0
であると考えました。しかし、2番目と3番目の列は正確にはどういう意味ですか? man acpid
を試しましたが、役立つ情報が見つかりませんでした。
最初の列はデバイスクラスです。値は、それぞれのACPIデバイスを処理するカーネルドライバーから取得されます。それらは、「クラス」(例:「バッテリー」)または「クラス/サブクラス」(例:「ボタン/電源」)のいずれかの形式です。
2番目の列は、カーネルがデバイスに使用する名前です。すべてのACPIデバイスの/sys/bus/acpi/devices/
に一致するフォルダーがあります。これらの名前の一般的なルールは、デバイスタイプ:インスタンス番号。 カーネルドキュメント で説明されているように、デバイスタイプは次のいずれかです。
LNX
で始まる名前が割り当てられます。device
。インスタンス番号は、同じタイプの異なるデバイスを区別するための増分カウンターです。たとえば、一次電池はPNP0C0A:00
で、二次電池はPNP0C0A:01
です。
3番目の列は、イベントコードまたは「通知値」です。これらはセクション5.6.6で定義されています ACPI仕様 。 00000001
は「デバイスチェック」(デバイスが表示または非表示)、00000003
「リクエストの取り出し」、00000080
「バッテリーステータスが変更されました」を意味します。
4番目の列は、カーネルドライバーによって生成される補足値です。この列の意味は、イベントコード、ドライバー、およびデバイスタイプの任意の組み合わせによって異なります。 Linux ACPIバッテリードライバーは、「BatteryStatusChanged」イベントの値を「present」の場合は1
に、「notpresent」の場合は0
に設定します。