電源断時にラズパイを自動でシャットダウン（簡易UPS初級編）

**本ブログは投稿から4年以上になりますが、継続して問い合わせが多いので現行機種のslee-Pi3を使用したブログを別途作成いたしました。こちら参照ください。**

https://qiita.com/miyoshii/items/37f100647b7489354dfa


[メカトラックス](https://mechatrax.com/ "MechaTrax")の永里です。
弊社のラズベリーパイ用電源管理/死活監視モジュール「[slee-Pi](https://mechatrax.com/products/slee-pi/ "slee-Pi")」を使って、電源断時に自動シャットダウンする方法はないか？（UPS機能は実現できないか？）という問合せを多くいただくので、記事にまとめます。

**結論から言えば、市販の乾電池とslee-Piを使ってラズパイ用の簡易的なUPSが実現できます。**

ただ、以下のような条件に限定すればそこそこ使える程度とお考え下さい。

・電源復旧までの稼動維持は求めない（電源断⇒シャットダウン出来ればOK）
・電源断の頻度が少ない（1次電池を使用するため、高頻度だと電池交換も高頻度になりツライ） 
・対象となる台数が少ない（電源復帰時に自動起動ができないので）

上記のとおり適用範囲は限定されますが、少数台のラズパイを低頻度の電源断時に自動シャットダウンするという運用に限れば、手軽に実現できる方法ですのでご参考になれば幸いです。

![slee-pi_slide04@2x.png](https://qiita-image-store.s3.amazonaws.com/0/100149/2ea4db36-3a55-f535-ee89-a701c2d98a01.png)

# slee-Piには電源端子が二つあります

slee-Pi（現行機種のslee-Pi2）の外形図は以下のとおり、以後、現行機種のslee-Pi2をベースに記述しますのでご注意ください。slee-Pi2の詳細情報は[こちら](https://github.com/mechatrax/slee-pi2)に有ります。
![sleepi2.png](https://qiita-image-store.s3.amazonaws.com/0/100149/c298aa46-d5ac-51ce-2419-c7dcda4602c5.png)
CN1とCN2が電源コネクタでCN1を補助電源コネクタとしていますが、回路的には等価です（どちらを使っても良い）。CN1とCN2は6～24VのDC入力に対応しています。

※余談ですが、slee-Piからピンヘッダ経由で十分な電力を供給することでラズパイ本体の安定動作を実現しつつ、電源ノイズの低減も可能となってます。

# 二つの電源端子に同時に電源供給したらどうなるか？

電圧が高い方の電源が採用されます。具体的には12VのACアダプタと角型乾電池（006P型 9V）をそれぞれCN1とCN2に接続して電源供給した場合、slee-Piは12VのACアダプタを電源として使用します。（角型乾電池は接続はされてますが使用されません）

12VのACアダプタが何らかの理由で電源供給を停止した場合（ブレーカ落ちた？停電？断線？などなど）、角型乾電池の電力でラズパイは稼動を継続できます。一方、当然ながら稼動継続時間は角型電池の容量とラズパイの消費電力次第となりますので、乾電池に切り替わったタイミングでシャットダウンコマンドを実行し正常終了したいところです。

※slee-Piの電源はDC6～24V対応ですので、9V角型乾電池を例にしてますが、6V以上確保できれば単3乾電池直列などでも対応可能です。

※※電源復旧まで稼働を維持したい場合、復旧までの時間を何時間に想定するか次第ですが9V角型電池ではなく大容量の電池を使用して、管理者にメール等で警告だけ実行してシャットダウン処理を行わないことも可能です（後述のsleepi2-monitorの設定次第です）。

![slee-pi_slide01@2x.png](https://qiita-image-store.s3.amazonaws.com/0/100149/73872fa7-4995-c339-a753-067e9a1f2107.png)
図と写真の向きが上下逆ですね。。。スミマセン。。

# sleepi2-monitorで電源電圧の値をモニタリング
slee-Piは、ラズパイの間欠動作（タイマー動作）や死活監視を可能としますが、これらの機能をラズパイ側から使用するための[専用ユーティリティ](https://github.com/mechatrax/slee-pi2/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)をGithubから提供しており、その一つが[sleepi2-monitor](https://github.com/mechatrax/sleepi2-monitor)です。

専用ユーティリティのセットアップ後、sleepi2-monitorの設定ファイルsleepi2-monitor.confは以下のようになっているはずです。

```
#
# Configuration file for sleepi2-monitor
#

#
# Common settings
#
#  interval = N: monitoring interval seconds
#
[common]
interval = 1

#
# Execute command when the SW1 is pressed more than threshold.
# If set oneshot to true, command execute once.
#
#  command = ""
#
#  oneshot = {true, false}
#
#  threshold = 0: disabled
#            = N: N[1..255] seconds
#
[switch]
command = "shutdown -h now"
oneshot = true
threshold = 3

#
# Execute command when the external input is detected more than threshold.
# If oneshot is true, execute command once.
#
#  command = ""
#
#  oneshot = {true, false}
#
#  threshold = 0: disabled
#            = N: N[1..255] seconds
#
[extin]
command = "shutdown -h now"
oneshot = true
threshold = 0

#
# Execute command when the supply voltage drops below threshold.
# If oneshot is true, execute command once.
#
#  command = ""
#
#  oneshot = {true, false}
#
#  threshold = 0: disabled
#            = N: N[1..65535] mV
#
[voltage]
command = "shutdown -h now"
oneshot = true
threshold = 0
```

この最後の行[voltage]thresholdを10000（単位がmvなので、10V）にしてみます。

```
#
# Configuration file for sleepi2-monitor
#

#
# Common settings
#
#  interval = N: monitoring interval seconds
#
[common]
interval = 1

#
# Execute command when the SW1 is pressed more than threshold.
# If set oneshot to true, command execute once.
#
#  command = ""
#
#  oneshot = {true, false}
#
#  threshold = 0: disabled
#            = N: N[1..255] seconds
#
[switch]
command = "shutdown -h now"
oneshot = true
threshold = 3

#
# Execute command when the external input is detected more than threshold.
# If oneshot is true, execute command once.
#
#  command = ""
#
#  oneshot = {true, false}
#
#  threshold = 0: disabled
#            = N: N[1..255] seconds
#
[extin]
command = "shutdown -h now"
oneshot = true
threshold = 0

#
# Execute command when the supply voltage drops below threshold.
# If oneshot is true, execute command once.
#
#  command = ""
#
#  oneshot = {true, false}
#
#  threshold = 0: disabled
#            = N: N[1..65535] mV
#
[voltage]
command = "shutdown -h now"
oneshot = true
threshold = 10000
```

この結果、電源電圧が10V以下になった場合は[voltage]commandの設定"shutdown -h now" が実行されることになります。

※ここではデフォルト設定のシャットダウンとしてますが、電源断警告のメール送信のみ、もしくは送信後シャットダウン等の任意のスクリプトも実行可能です。

※※slee-Piは、リアルタイムクロック（RTC）を搭載していますので、任意のタイミングで電源停止状態のラズパイを起動（コールドブート）でき、OSからのシャットダウンと組み合わせることでそれらの繰り返し（間欠動作）を実現できます。また、ラズパイの状態をモニタリングすることも可能なので、ラズパイ本体や稼動アプリケーションの死活監視も可能となります。詳細は[こちら](https://qiita.com/syasuda/items/dd1564896e75b03b2b7d)参照ください。

※※※さらに余談ですが、ラズパイに擬似的な間欠動作（スリープ動作）を付与できることから寝る（sleep）って意味でslee-Pi（スリーピー）って名前です、スリーパイとよく呼ばれますが。。（苦笑）




# 簡易UPSとしての動作
上述の設定（CN1とCN2にそれぞれ12V ACアダプタ、9V角型乾電池接続し、[voltage]thresholdを10000mV=10Vに）を反映した状態では、ACアダプタの電圧が乾電池よりも高いので電源電圧は12Vとして稼動してます。9V角型乾電池は適当な電池フォルダにXHP-2コネクタで接続してます（+と-を間違えないように！！）。
※slee-Piを使用した場合、起動にはSW1（起動用スイッチ）の押下が必要です。

[<img src = "https://qiita-image-store.s3.amazonaws.com/0/100149/847a8646-7711-603b-0974-3ab6968d9797.png">](https://youtu.be/YjdiUWY8JPE)

上記動画では、ACアダプタを抜くと9V角型乾電池に電源が自動で切り替わります。と同時にsleepi2-monitorが設定された電源電圧閾値[voltage]threshold 10V以下になったことを検知して、シャットダウンコマンドを実行します。このシャットダウンコマンド実行の為の電力は9V角型乾電池から供給されています。

※ラズパイはシャットダウンしてますが、slee-PiのRTCは角型乾電池で動作継続してます。

以上です。。。

あっけないほどカンタンな話ですが、以上、slee-Piと乾電池を使ったラズパイ用簡易UPS機能の解説でした。


# 注意！これはあくまで簡易的なUPSです。
まずは突然の電源断時にラズパイを正常終了（シャットダウン）させたいというだけであれば上記で対応可能ですが、最初に述べたとおり

・電源復旧までの稼動維持は求めない（電源断⇒シャットダウン出来ればOK）
・電源断の頻度が少ない（1次電池を使用するため、高頻度だと電池交換も高頻度になりツライ） 
・対象となる台数が少ない（電源復帰時に自動起動ができないので）

場合に使える程度ですので、ご留意ください。