電源断時にラズパイを自動シャットダウン（slee-Pi3とモバイルバッテリで簡易UPS）

[メカトラックス](https://mechatrax.com/)三好です。
本記事ではRaspberryPi及びメカトラックス社製電源管理/死活監視モジュール「[slee-Pi3](https://mechatrax.com/products/slee-pi/)」を使用して、簡易的なUPS(Uninterruptible Power Supplyの略。無停電電源装置)を作成する方法を説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/597747a6-b056-9e93-93b7-d7efe229fdb3.png)

※本記事は下記記事をslee-Pi3 verにアップデートしたものになります。

https://qiita.com/MechaTracks/items/b715f4712611e64df78e


※※slee-Pi3のセットアップ等は下記ブログ、またはGithubを参考にしてみてください。
　ブログ：

https://qiita.com/vascodagama/items/6fae12853e861614635a



　Github：

https://github.com/mechatrax/slee-pi3


# slee-Piには電源端子が二つあります
[slee-Pi3](https://mechatrax.com/products/slee-pi/)に搭載されている2つの電源端子それぞれに電源(メイン/補助)を接続することで簡易的なUPSが実現できます。
本記事では下記電源を使用して解説します。
　・メイン電源：ACアダプタ(19V)
　・補助電源　：モバイルバッテリー(700-BTL049,12V)



slee-Pi（現行機種の[slee-Pi3](https://github.com/mechatrax/slee-pi3/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2)）の外形図は以下のとおりです。
![sleepi3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/b299cea3-f379-5123-b676-c5f1f2fd0a48.png)

試しにCN1、CN2それぞれの電圧を測定してみます。
```shell
$ sleepi3ctl get voltage 1
19667              #CN1の電圧
$ sleepi3ctl get voltage 2
12229              #CN2の電圧
$ sleepi3ctl get voltage 
19667              #CN1,CN2のうち電圧が高い方
```
>sleepi3ctl ： slee-Pi3を操作するための実行ファイル
get　　　： パラメータを取得

CN1がメインの電源コネクタでCN2を補助電源コネクタとしていますが、回路的には等価です（どちらを使っても良い）。CN1及びCN2は6～24VのDC入力に対応しています。

※CN1とCN2のうち電圧の高い方がメイン電源として認識されるため、補助として使いたい電源(今回はモバイルバッテリー)はメインとして使いたい電源(今回はACアダプタ)より電圧が低いものを使用してください。

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


# 二つの電源端子に同時に電源供給したらどうなるか？
電圧が高い方の電源が採用されます。具体的には19VのACアダプタとモバイルバッテリー(700-BTL049,12V)をそれぞれCN1とCN2に接続して電源供給した場合、slee-Piは19VのACアダプタを電源として使用します。（モバイルバッテリーは接続はされていますが使用されません）

19VのACアダプタが何らかの理由で電源供給を停止した場合（ブレーカ落ちた？停電？断線？などなど）、モバイルバッテリーの電力でラズパイは稼動を継続できます。一方、当然ながら稼動継続時間はモバイルバッテリーの容量とラズパイの消費電力次第となりますので、モバイルバッテリーに切り替わったタイミングでシャットダウンコマンドを実行し正常終了したいところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/0e83191e-5bbc-196d-f64a-6951ca72875d.png)
※電源復旧まで稼働を維持したい場合、復旧までの時間を何時間に想定するか次第ですが、管理者にメール等で警告だけ実行してシャットダウン処理を行わないことも可能です（後述のsleepi3-monitorの設定次第です）。

※※モバイルバッテリーに自動オフ機能がついている場合は、モバイルバッテリーからの電源供給が止まってしまうため補助電源として使うことはできません。本記事で使用しているSANWA-SUPPLY製700-BTL049は自動オフ機能が無いため使用できます。

※※※モバイルバッテリーとslee-Piの接続はDCジャック - XHP-2コネクタ変換ハーネスを使用しています。DCジャックの外形・内径に注意です。

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

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

```/etc/sleepi3-monitor/monitor.yml
#監視の間隔
common:
  interval: 1

#外部入力の設定
extin:
  history_size: 1
  commands:    
    - exec: /etc/sleepi3-monitor/extin.d/
      condition: over
      threshold: 3
      oneshot: true

#物理スイッチの設定
pushsw:
  history_size: 1
  commands:    
    - exec: /etc/sleepi3-monitor/pushsw.d/
      condition: over
      threshold: 3
      oneshot: true

#電圧の設定
    #CN1,CN2の電圧値が高い方の設定
voltage:
  history_size: 3
  commands:
    - exec: /etc/sleepi3-monitor/voltage.d/ 
      condition: under
      threshold: 0
      oneshot: true

    #CN1の設定
voltage1:
  history_size: 3
  commands:
    - exec: /etc/sleepi3-monitor/voltage-1.d/ 
      condition: under
      threshold: 0
      oneshot: true

    #CN2の設定
voltage2:
  history_size: 3
  commands:
    - exec: /etc/sleepi3-monitor/voltage-2.d/
      condition: under
      threshold: 0
      oneshot: true
```
>interval　　： 秒単位の監視間隔
history_size ： 履歴に保持する値の数
exec 　　　： 条件を満たした場合に実行されるコマンド
　　　　　　 ディレクトリ指定の場合はディレクトリ内のファイルを実行
condition　： コマンドを実行する条件(閾値以下を監視⇒「under」, 閾値以上を監視⇒[over], 機能をオフ⇒[none])
threshold　： 電圧[mV]の閾値
oneshot　 ： 条件が満たされた際の「exec」の実行コマンドの繰り返し(一度のみ実行⇒「true」、繰り返し実行⇒「false」)

これらの設定項目のうち電源電圧に関係するものは下記の3つです。
　・voltage：CN1とCN2の電圧値が高い方の設定
　・voltage1：CN1の設定
　・voltage2：CN2の設定
ここではメイン電源が停電(ACアダプタを引っこ抜く)したと想定し、その際にCN2の補助電源を作動させつつシャットダウンを開始するように設定値を下記の通り変更し、シャットダウンファイルを作成します。
　・voltage1→condition=under
　・voltage1→threshold=10000
　・voltage→condition=none
　・voltage2→condition=none

```/etc/sleepi3-monitor/voltage-1.d/shutdown_test.sh
#!/bin/bash
sudo shutdown -h now
```
忘れずに実行権限も付与してください、、、
```
sudo chmod +x /etc/sleepi3-monitor/voltage-1.d/shutdown_test.sh
```
最後に設定ファイルを反映させるためにプログラムを再起動します。
```
sudo systemctl restart sleepi3-monitor
```
この結果、電源電圧が10V以下になった場合は[voltage1]のexecで指定されているディレクトリに保存されたファイルが実行されるので、"sudo shutdown -h now" が実行されることになります。

※ここではシャットダウンさせていますが、ディレクトリに置くファイルによって電源断警告のメール送信のみ、もしくは送信後シャットダウン等の任意のプログラムを実行可能です。

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

※※※さらに余談ですが、ラズパイに擬似的な間欠動作（スリープ動作）を付与できることから寝る（sleep）って意味でslee-Pi（スリーピー）って名前です、スリーパイではありません。(笑)

# 簡易UPSとして実際に動かしてみる
上述の設定を反映した状態では、ACアダプタの電圧がモバイルバッテリーよりも高いので電源電圧は19Vとして稼動しています。
※slee-Piを使用した場合、起動にはSW1（起動用スイッチ）の押下が必要です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/6x3owE6DHHg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
上記動画では、ACアダプタを抜くとモバイルバッテリーに電源が自動で切り替わります。と同時にsleepi3-monitorが設定された電源電圧閾値voltage1→threshold 10V以下になったことを検知して、シャットダウンコマンドを実行します。このシャットダウンコマンド実行の為の電力はモバイルバッテリーから供給されています。

※ラズパイはシャットダウンしていますが、[slee-Pi3](https://mechatrax.com/products/slee-pi/)のRTCは搭載されているボタン電池で動作継続してます。

# 注意！これはあくまで簡易的なUPSです。
まずは突然の電源断時にラズパイを正常終了（シャットダウン）させたいというだけであれば上記で対応可能ですが、あくまで簡易的なUPSになります。そのため、以下のような条件に限定すればそこそこ使える程度とお考え下さい。

・電源復旧までの稼動維持は求めない（電源断⇒シャットダウン出来ればOK）
~~・電源復帰後の自動復帰は求めない（電源復帰時に自動起動はできません）~~
→[slee-Pi3](https://mechatrax.com/products/slee-pi/)はrestore-voltage機能があるので、電源復帰時に自動起動ができます。下記ブログで電源復帰後の自動起動について記載しているので、興味がある方はご参照ください。（2023/7/26加筆修正）

https://mechatrax.com/blog/building-raspberrypi-ups-with-sleepi3/



上記ご留意の上ご検討を御願い致します。以上で解説は終わりになります。