概略
目的
[こちらのブログ] (https://qiita.com/MechaTracks/items/b715f4712611e64df78e)(電源断時にラズパイを自動でシャットダウン)でRaspberry piの簡易型UPSの記事がありますが、メカトラックス社からslee-Pi2 Plusでの記事化を依頼されたので、リレー付き電源も付加してより本格的なUPS化を目指します。
仕組み
slee-Pi2 Plusの2系統ある電源入力の電圧差を利用して電源断を検出し、shutdownする。
slee-Pi2 Plusに外部入力コネクタに電源と連動したリレーから入力し、電源復帰とともにRaspberry piの再起動を実現します。
必要なもの
- Raspberry pi 4 model B w/ Rasbian buster lite 2019-09-26
- slee-Pi2 Plus
- ACアダプタ2つ(Hi, Lo)
- 電源と連動するリレー
- スイッチ付きテーブル・タップ
左から Raspberry pi 4 model B, slee-Pi2 Plus, リレー
Raspberry pi 4はMechatraxとしては非推奨とのことで、注意してください。
slee-Pi2 Plus
既存の標準モデルslee-Pi2に外部入力コネクタが増設されたモデル。
上:slee-Pi2標準モデル,下:slee-Pi2 Plus(右上に2つコネクタが増設されている)。いずれもRaspberry piに装着済み
リレー
電源入でスイッチが入るリレーで、slee-Pi2 Plusの外部入力コネクタに接続する。このリレーは2つ準備したACアダプタのうち、高い電圧の方に接続します。
また、電源はslee-Pi2 Plusの電源コネクタに接続する。
これで、リレーに接続したACアダプタに電源が入ると、外部入力のスイッチがonになる。これをトリガーとして、Raspberry piの起動が始まります。
リレースイッチをslee-Pi2 Plusの外部入力コネクタ、電源ラインを電源コネクタに接続
ACアダプタ(hi,Lo)
2系統の電源の電圧差を検出し、シャットダウンするので、電圧が異なるACアダプタを用意します。
上:15V、下:12V(slee-Pi2標準モデル同梱)
セットアップ
Raspberry pi、slee-Pi2 Plus、電源、リレー付き電源を接続し、Rasbianの設定を前回ブログで言及したansible playbookでセットアップします。
電圧確認
2系統ある電源の電圧を調べます。直接sleepi2ctl -g voltageを使ってもいいですが、せっかくなのでMackerelのログを見てみます。
テーブルタップのスイッチをカチカチとやって、期待通りの電圧がでているか確認します。
15vと12vでThresholdをその間に設定すればいけそうです。リレーに連動する電源(ACアダプタ)が高い方(15v)であることを確認し、sleepi2-monitor.confでvoltageのthresholdを13vに設定します。
[voltage]
command = "shutdown -h now"
oneshot = true
threshold = 13000
thresholdに13000mvを設定して、sleepi2monを再起動するか、Raspberry piを再起動すると、13vが閾値になります。
systemctl restart sleepi2-monitor.service
shutdown -r now
実働テスト
これで高い電圧(15v)のACアダプタの電源を切ると、電圧の低い電源(12v)で稼働し続けますが、sleepi2monによるthreshold監視により"shutdown -h now"が実行されます。
Raspberry piが動作を停止し、再び高い電圧のACアダプタの電源を入れると、連動したリレーがslee-pi2 Plusの外部入力にトリガーを与え、Raspberry piが再起動します。
起動・停止時にslackに投稿するメッセージが以下のようになります。
起動時のwakeup-flagが"extin"になっており、外部入力がトリガーになっているのが分かります。
まとめ
この方式により、以前のブログにあった課題
・電源復旧までの稼動維持は求めない(電源断⇒シャットダウン出来ればOK)
・電源断の頻度が少ない(1次電池を使用するため、高頻度だと電池交換も高頻度になりツライ)
・対象となる台数が少ない(電源復帰時に自動起動ができないので)
の内、最後は解消できます。残りはどのような電源が準備できるかに依存します。また、2系統の電圧の差がある電源を準備しなければなりません。
電源断時に、alertを上げるトリガ(mailやslackなど)とshutdown処理を行うトリガの2つのthresholdで検出できれば、便利かもと思いました。