電源が低電圧状態かどうかを把握する方法と、その電圧状態の変化を検知する方法、また状態変化をトリガーにして何らかのコマンドを実行する手段について。
- 検証および動作確認に使用したデバイス・OS
- Raspberry Pi 5 / Ubuntu 24.04 LTS
- Raspberry Pi 3 Model B+ / Ubuntu Server 22.04 LTS
- Raspberry Pi Zero 2 W / Ubuntu Server 24.04 LTS
電源の電圧状態を把握する
電源が低電圧状態(undervoltage)かどうかを把握する方法について。
sysfs
sysfs(/sys
)のファイルを参照することで、電源の電圧状態を把握できる。 ファイル/sys/class/hwmon/hwmon<n>/in0_lcrit_alarm
の内容が0
なら正常、1
なら低電圧状態を表す。
このファイルは、デバイスの種類によってhwmon0
あるいはhwmon1
となるかが異なる模様。 (詳細未調査)
sensorsコマンド(lm_sensors)
sensorsコマンドを使用することで電圧状態を把握することもできる。 低電圧状態の場合、ALARMと表示される。
sensorsコマンドを引数なしで実行すれば、表示できるすべてのセンサーの情報が表示される。
syslog
/var/log/syslog
には電圧状態の変化が記録される。 低電圧状態になった時点ではUndervoltage detected!、低電圧状態から平常状態に復帰した時点ではVoltage normalisedというメッセージが出力される。
normalise
はイギリス英語で一般的なスペル、normalize
はアメリカ英語で一般的なスペルとのこと。
電圧状態の変化を検知する
電源の低電圧状態(undervoltage)への遷移および復帰の状態変化を検知する方法について。
udevイベント (検知できない)
実際にはこの方法では検知できないが、udevイベントを捕捉して検知を試みる手段について。 今後の参考として記録しておく。
まず、sysfsのファイルパスをもとに、電圧センサのDEVPATH
を取得する。
次に、電圧センサの状態変化イベントを捕捉するためのudevルールファイルを/etc/udev/rules.d/
に作成する。
作成したudevルールファイルをアクティブにするために、ルールをリロードする。
電圧センサの状態変化に応じてhwmonサブシステムからchange
イベントが起これば上記のルールがトリガーされるはずだが、実際には動作しない。
udevadm monitor
コマンドでイベントをモニタリングしても、電圧センサの状態変化に起因するイベントが発生しないので、したがって上記ルールもトリガーされることがない。 vcgencmd get_throttled
で取得できるスロットル状態についても同様で、udevのイベントとしては捕捉できない。
sysfsファイルの変化を監視する
sysfsファイルの変化を監視することによって、電圧状態の変化を検知し、それをトリガーにしてコマンドを実行する方法について。
ここではファイルの内容変化を検知する方法として、inotifywait
コマンドを使用する。 inotifywait
コマンドを使用するには、inotify-tools
をインストールする必要がある。
inotifywait
コマンドに引数--event modify
を指定すれば、ファイル内容に変化があるまで待機することができる。
ファイル内容に変化があると、次のように出力してコマンドは終了する。
例として、電圧状態の変化が起こるたびにメッセージを表示するスクリプトを書くと次のようになる。
以下は、このスクリプトをシステム起動時からバックグラウンドで動作させるために、systemdユニットとして動作させる方法について。
上記スクリプトを起動するsystemdユニットファイルを/etc/systemd/system/
に作成する。
このユニットを有効にして、起動する。 以降は、再起動した後も自動的に起動されるようになる。