定期ツイートを間欠動作で実施してラズパイの消費電力を削減

# はじめに
![IMG_2115 - コピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/2eebf9c7-6738-0556-3b25-3f546d9c9a01.jpeg)


[前回記事](https://qiita.com/vascodagama/items/939ca054138b0409b2b3)の続編で**アプリケーション利用時の消費電力**を計測します。
具体的には定期的なツイートと間欠動作を行います。

仕組みはざっくりと以下のようにラズパイの電源ON状態を減らすことで電力削減を図ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/016769b4-329c-8de8-dfc2-71ed30eee77e.png)

# 結論

1日当たりの消費電力量は、ツイート間欠動作（1サイクル60分）で「通常稼働させる場合」と比較して**約98%削減**されます。

[前回](https://qiita.com/vascodagama/items/939ca054138b0409b2b3)よりも消費電力が低下しましたが、理由は稼働時間が大幅に短くなったことにあります。

前回の稼働時間 = **1分間**
今回の稼働時間 = **1秒程度**（ツイートした瞬間に待機状態へ移行のため短時間稼働）

検証方法・結果は以下記事をご覧ください。

# 計測器

前回同様、[zmart デジタル電圧電流電力量計](https://amzn.to/3D34C01)のワットチェッカーを使用して計測します。
0.01Whから積算電力値を計測できます。

# ソフトの環境構築
4GPiのセットアップを行います。

> ①OSのセットアップ & 4GPiのインストール手順
> https://qiita.com/vascodagama/items/114619c2bcf020226cd7#公式busterイメージのダウンロード
> ②SIMの情報登録方法
> https://qiita.com/vascodagama/items/114619c2bcf020226cd7#simカードの情報を登録

slee-Pi3のセットアップを行います。

> ①slee-Pi3のインストール手順
> https://qiita.com/vascodagama/items/6fae12853e861614635a#slee-pi3パッケージのインストール
> ②タイマー設定
> https://qiita.com/vascodagama/items/3e8fda53e8780056a7e7#タイマー動作


# ツイートプログラム
Twitterには簡単にツイートするプログラムを作成できるAPIがあるのでこちらを使用します。
使用にあたり、Twitterのアカウント登録とAPI利用申請が必要です。
> API利用申請の手順
> https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/

プログラミング言語はpythonを使用します。
pythonでtwitter APIを利用するためのパッケージをインストールします。

```bash
sudo apt-get -y install python3-pip
sudo pip3 install tweepy
```

ツイートするプログラムを作成します。

```python:/home/pi/tweet.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tweepy
import datetime
#twitter APIで得た各種キーを代入
APIKEY="取得したAPIKEYを入力"
APISCT="取得したAPISCTを入力"
ACSTKN="取得したACSTKNを入力"
ACSSCT="取得したACSSCTを入力"

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(APIKEY, APISCT)
auth.set_access_token(ACSTKN, ACSSCT)
api = tweepy.API(auth)

# ツイートの内容
api.update_status("tweet test：" + "{0:%Y-%m-%d %H:%M:%S}".format(datetime.datetime.now()))
```

**注意**
　Twitterの仕組上、プログラムでツイートする際に同文は重複として扱われるため投稿できません。
　日付等をツイートに追記して重複しない文章とする必要があります。

プログラムができましたら一度実行してみましょう。

```bash
python3 /home/pi/tweet.py
```
登録したアカウント上に以下のようにツイートできればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146895/91986658-a821-43dd-6724-40882955499b.png)

# 自動起動＆ツイート＆自動シャットダウンの設定構築
今回のやりたいことを簡単に実現できるsystemdを使用します。

```systemd:/etc/systemd/system/tweetSystem.service
[Unit]
Description = tweet program
# サービスの概要入力です。自由に入力してください。

After = network-online.target
Requires = network-online.target
# ツイートプログラム実行前にネットワークを起動が必要なのでAfterとRequiresにnetwork-online.targetを指定

[Service]
Type = oneshot
ExecStartPre = sleepi3alarm set "+59min"
# 事前実行するプログラム。ここでは59分後に自動起動するslee-Pi3のタイマ設定

ExecStart = /home/pi/tweet.py
# 本実行プログラム。ここではツイートプログラムのパスを指定

ExecStartPost = poweroff
# ExecStart成功後に実行するプログラム。ここではシャットダウン

[Install]
WantedBy = multi-user.target
# 自動起動させるのに必要な行です。
```
**補足**
　上記設定は、シャットダウンと起動を永遠と繰り返します。
　ExecStartが失敗すると、ExecStartPostは実行されませんので、ネットワークを遮断するとシャットダウンされないです。操作したいときはネットワークを遮断すればOKです。

network-online.targetを使用するために以下システムを有効化します。

```bash
sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-networkd-wait-online
```

ツイートプログラムを実行する権限を与えます。

```bash
sudo chmod 0755 /home/pi/tweet.py
```

先程作成したsystemdの設定を有効化します。

```sh
sudo systemctl enable tweetSystem.service
```

再起動させると60分ごとのツイートが開始されます。


```shell
sudo reboot
```

## より実用的な運用方法
上記設定ではネットワーク遮断された場合には、シャットダウンされずシステムは停止してしまいます。例えば、停電時やネットワークのトラブル時にはシステムは停止してしまいます。

そこで**ネットワークに接続できなかった場合でも、３分経過したら強制的にシャットダウンを行う**設定を追加します。

①タイマの設定ファイルを作成

```systemd:/etc/systemd/system/shutdownSystem.timer
[Unit]
Description = shutdown system timer
[Timer]
OnBootSec = 3 minutes
[Install]
WantedBy = timers.target
```

②systemdファイルの作成

```systemd:/etc/systemd/system/shutdownSystem.service
[Unit]
Description = shutdown system service
[Service]
Type = oneshot
ExecStartPre = sleepi3alarm set "+56min"
ExecStart = poweroff
```

systemdの設定を有効化します。

```bash
sudo systemctl enable shutdownSystem.timer
````

再起動させると**３分経過したら強制的にシャットダウンを行います。**

#実測値

今回のプログラム実行時の実測値を以下に記します。

|ラズパイの状況|消費電力量|
| --- | --- | --- |---|
|起動時|0.04Wh|
|シャットダウン時|0.01Wh|
|ツイート時(1秒程度)|0.01Wh|

# 間欠動作時の消費電力量について

1分あたり消費電力量0.000002Whとして考えます。
※計算方法は[前回記事](https://qiita.com/vascodagama/items/939ca054138b0409b2b3#間欠動作時の消費電力量について)参照

# 間欠動作なしの連続稼働

24時間の消費電力量：**64.8Wh**

# 1時間に一回ツイートする間欠動作

1サイクル（起動 + ツイート + シャットダウン + 59分待機）の消費電力量は
消費電力量：0.04Wh + 0.01Wh + 0.01Wh + 0.000002Wh × 59分 = 0.0601Wh
※起動時間 + ツイート + シャットダウン時間の合計は1分としてます

24時間（24サイクル）の消費電力量：0.0601Wh × 24 = **1.4428Wh**
#間欠動作時の消費電力の効果

通常稼働時とアプリケーション利用時では消費電力は大差はありませんでした。
待機時間が多い運用方法の場合、slee-Pi3(間欠動作の仕組み)を利用することで
大幅な消費電力削減(約98%程度)が見込めます。

#変更履歴

前回の記事同様に
間欠動作時における1分あたりの待機時消費電力の計算が間違っておりました。。。
以前は0.0072Whとしておりましたが、現状の0.000002Whが正しい情報です。
誤った情報を発信してしまい大変申し訳ありませんでした。。。