はじめに
前回記事の続編でアプリケーション利用時の消費電力を計測します。
具体的には定期的なツイートと間欠動作を行います。
仕組みはざっくりと以下のようにラズパイの電源ON状態を減らすことで電力削減を図ります。
結論
1日当たりの消費電力量は、ツイート間欠動作(1サイクル60分)で「通常稼働させる場合」と比較して約98%削減されます。
前回よりも消費電力が低下しましたが、理由は稼働時間が大幅に短くなったことにあります。
前回の稼働時間 = 1分間
今回の稼働時間 = 1秒程度(ツイートした瞬間に待機状態へ移行のため短時間稼働)
検証方法・結果は以下記事をご覧ください。
計測器
前回同様、zmart デジタル電圧電流電力量計のワットチェッカーを使用して計測します。
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を利用するためのパッケージをインストールします。
sudo apt-get -y install python3-pip
sudo pip3 install tweepy
ツイートするプログラムを作成します。
#!/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の仕組上、プログラムでツイートする際に同文は重複として扱われるため投稿できません。
日付等をツイートに追記して重複しない文章とする必要があります。
プログラムができましたら一度実行してみましょう。
python3 /home/pi/tweet.py
登録したアカウント上に以下のようにツイートできればOKです。
自動起動&ツイート&自動シャットダウンの設定構築
今回のやりたいことを簡単に実現できるsystemdを使用します。
[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を使用するために以下システムを有効化します。
sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-networkd-wait-online
ツイートプログラムを実行する権限を与えます。
sudo chmod 0755 /home/pi/tweet.py
先程作成したsystemdの設定を有効化します。
sudo systemctl enable tweetSystem.service
再起動させると60分ごとのツイートが開始されます。
sudo reboot
より実用的な運用方法
上記設定ではネットワーク遮断された場合には、シャットダウンされずシステムは停止してしまいます。例えば、停電時やネットワークのトラブル時にはシステムは停止してしまいます。
そこでネットワークに接続できなかった場合でも、3分経過したら強制的にシャットダウンを行う設定を追加します。
①タイマの設定ファイルを作成
[Unit]
Description = shutdown system timer
[Timer]
OnBootSec = 3 minutes
[Install]
WantedBy = timers.target
②systemdファイルの作成
[Unit]
Description = shutdown system service
[Service]
Type = oneshot
ExecStartPre = sleepi3alarm set "+56min"
ExecStart = poweroff
systemdの設定を有効化します。
sudo systemctl enable shutdownSystem.timer
再起動させると3分経過したら強制的にシャットダウンを行います。
#実測値
今回のプログラム実行時の実測値を以下に記します。
|ラズパイの状況|消費電力量|
| --- | --- | --- |---|
|起動時|0.04Wh|
|シャットダウン時|0.01Wh|
|ツイート時(1秒程度)|0.01Wh|
間欠動作時の消費電力量について
1分あたり消費電力量0.000002Whとして考えます。
※計算方法は前回記事参照
間欠動作なしの連続稼働
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が正しい情報です。
誤った情報を発信してしまい大変申し訳ありませんでした。。。