PiSugar 3 Plus で電源切断を監視する

PiSugar3 Plusのセットアップ

ソフトウェアのインストール

pi で次のスクリプトを実行します。

curl http://cdn.pisugar.com/release/pisugar-power-manager.sh | sudo bash

OTAファームウェアのアップグレード

curl https://cdn.pisugar.com/release/PiSugarUpdate.sh | sudo bash

i2cアドレスを確認する

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

0x57と0x68の2つのアドレスが確認できます。
0x57がPiSugarのi2cアドレス
0x68はRTCのi2cアドレス

Pythonで電源監視プログラムを作成します

Pythonでi2cを使用するために、smbusモジュールをインストールします。

pip install smbus

電源の切断を監視して、5秒後にRaspberry PiをシャットダウンさせるためのPythonプログラムを作成します

nano PiSugerPowerDown.py
#!/usr/bin/env python3

import smbus
import time
import os

#SMBusの引数に1を指定する。Raspberry Piのi2cバスの番号
i2c = smbus.SMBus(1)
#デバイスのアドレス 0x68
addr = 0x57

# シャットダウンまでの時間を指定(5秒)
THRESHOLD = 5

while True:
  cnt = 0
#  print("待機中")

  while True:
    state = i2c.read_byte_data(addr, 0x02)

    if not ((state & 0x80) == 0x80):
      print("電源切断")
      cnt += 0.05
      if cnt >= THRESHOLD:
        os.system("sudo shutdown -h now")
        break

    if cnt > 0 and ((state & 0x80) == 0x80):
      print("電源復旧")
      break

    if cnt == 0:
      break

    time.sleep(0.05)

systemdで自動起動させる

systemsを使用して、電源監視プログラムを自動起動させます。
/etc/systemd/systemにPiSugarPWDWN.serviceというファイルを作成します。

sudo nano /etc/systemd/system/PiSugarPWDWN.service
[Unit]
Description=PiSugar3 Plus PowerDown Check

[Service]
ExecStart=/usr/bin/python3 /home/trip/PiSugarPowerDown.py
Restart=always

[Install]
WantedBy=multi-user.target

以下のコマンドを使用して、systemdを使ってサービスを起動します

sudo systemctl start PiSugarPWDWN.service

サービスの起動が確認できたら、自動起動を設定します。
以下コマンドを実行します。

sudo systemctl enable PiSugarPWDWN.service

以下のコマンドを使用して、サービスの動作確認ができます。

sudo systemctl status PiSugarPWDWN.service
● PiSugerPWDWN.service - PiSugar3 Plus PowerDown Check
     Loaded: loaded (/etc/systemd/system/PiSugarPWDWN.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-09-20 11:37:05 JST; 57min ago
   Main PID: 596 (python3)
      Tasks: 1 (limit: 1624)
        CPU: 2min 23.874s
     CGroup: /system.slice/PiSugerPWDWN.service
             └─596 /usr/bin/python3 /home/trip/PiSugarPowerDown.py

 9月 20 11:37:05 pios systemd[1]: Started PiSugar3 Plus PowerDown Check.

 
 

電源の再接続で、起動できるようにPiSugar3 Plusの設定を行う

https://github.com/PiSugar/PiSugar/wiki/PiSugar-3-Seriesを見ると、0x02アドレスの4番目のビットにオン(1)にすると電源の再接続でPiSugarが起動するようになります。

0x02アドレスを読んでみて、現在の設定を確認します。

sudo i2cget -y 1 0x57 0x02
0xec

4ビット目はオフ(0)なので、設定を変更して動作を確認します。

0x0bを読み込んでみて書き込み可能かどうか確認します。

sudo i2cget -y 1 0x57 0x0b
0x00

0x00で書き込み不可

0x0bアドレスに0x29を書き込むとが書き込み保護が解除されて0x02アドレスに設定書き込むことができるようになります。

sudo i2cset -y 1 0x57 0x0b 0x29

もう一度、0x0bを読み込んでみて書き込み可能かどうか確認します。

sudo i2cget -y 1 0x57 0x0b
0x01

0x01で、書き込みができるようになっています。

0x02アドレスの4ビット目をオン(1)にして起動できるか確認を行います。

sudo i2cset -y 1 0x57 0x02 0x7c

もう一度、0x02アドレスを読んでみて、設定できているか確認します。

sudo i2cget -y 1 0x57 0x02
0xfc

4ビット目はオン(1)なって、設定ができています。

電源監視プログラムの動作確認を含めて確認をしてみます。
PiSugar3 Plusから電源(USB Type-C)を取り外します。
電源切断を認識して5秒後にRaspberry Piがシャットダウンされます。
PiSugar3 Plusに電源(USB Type-C)をつなげると起動します。

起動後、0x02アドレスを確認してみます。

sudo i2cget -y 1 0x57 0x02
0xec

4ビット目がオフ(0)に戻っていて設定は保持されないようなので、起動時に設定を行うようにします。

設定を行うPythonプログラムを作成します。

nano PiSugarStartup.py
#!/usr/bin/env python3
import smbus

# SMBusの引数に1を指定する。Raspberry Piのi2cバスの番号
i2c = smbus.SMBus(1)
# デバイスのアドレス 0x68
addr = 0x57

# 書き込み保護の解除
i2c.write_byte_data(addr, 0x0b, 0x29)

# Automatically resume booting when power is reconnected
i2c.write_byte_data(addr, 0x02, 0x7C)

# 書き込み保護
i2c.write_byte_data(addr, 0x0b, 0xFF)

#data = i2c.read_byte_data(addr, 0x02)
#print('hex: {:x}'.format(data))

作成したプログラムを起動時実行するようにします。
起動時に1度実行すればよいだけなので、cronで実行するように設定します。

n crontab -e

以下の内容を追記します

@reboot                  /home/pi/PiSugarStartup.py

再起動してみて、0x02アドレスの4ビット目がオン(1)になっていることを確認しす。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です