ysdyt.net for tech memo

Twitter APIを使ってRaspberry PiにCPU温度と現在時刻を呟かせる

こんな感じで一時間(任意の時間)に一回、Rapberry PiのCPU温度をツイートさせる。

これが何の役に立つかだって?自己満足だよ!強いて言うなら、ラズパイの定期生存確認が出来る。

必要なパッケージをインストールする

1
2
3
4
$ sudo apt-get update
$ sudo apt-get install python-setuptools
$ sudo easy_install pip #pipコマンドのインストール
$ sudo pip install twython #twythonをpipコマンドでインストール

TwitterのAPI情報を取得

Twitterのアカウントを作成し、http://apps.twitter.com/ にアクセス。
「Create New App」をクリックしてアプリケーション名や説明を入力し、登録後の画面で「Access level」を「Read and Write」に変更。

twythonプログラムに与える権限の認証情報は「Keys and Access Tokens」タブにある。
「Create my access token」をクリックし、「API Key」「API Secret」「Access Token」「Access Token Secret」を取得。

twythonを使ってツイートするプログラムの作成

pythonスクリプトを新規作成し、下記を書き込む。

1
$ nano raspi_bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# coding: utf-8

import os
from twython import Twython

#twitterの認証情報を入力
CONSUMER_KEY = '取得したAPI Key'
CONSUMER_SECRET = '取得したAPI Secret'
ACCESS_KEY = '取得したAccess Token'
ACCESS_SECRET = '取得したAccess Token Secret'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

#CPU温度を取得
cmd = '/opt/vc/bin/vcgencmd measure_temp'
line = os.popen(cmd).readline().strip()
temp = line.split('=')[1].split("'")[0]

#取得したCPU温度をツイート
api.update_status(status= 'CPU温度は '+temp+' ℃です。')

作成したファイルに実行権限を与える。

1
$ chmod +x raspi_bot.py

その後、一度実行してみてtwitterに投稿されるかを確認してみる。

1
$ python raspi_bot.py

twitterのタイムライン上で温度の投稿が確認できれば、次はこれを定期実行するようにする。

raspi_bot.pyを定期実行させる

“cron”にてraspi_bot.pyを自動的に定期実行させる。cronについてはこちら

1
$ crontab -e

これで新たに開くウィンドウの下部に、次の一文を書き込み保存。

1
00 * * * *  python /home/pi/raspi_bot.py

この一文の意味はこちらを参照して欲しいが、

00 * * * * -> 一時間に一回、指示したジョブを自動実行
python /home/pi/raspi_bot.py -> 自動実行させるジョブ

を表している。定期実行させる間隔は任意に指定できる。

ひとまずこれで完了。時間を置いて様子を見てみると、指定した時間間隔で自動的にツイートされているハズ。

しかしここで問題が、、、

1時間に一回タイムラインに流れるはずのツイートだが、投稿されていない時間があることを発見…
原因を調べるべく、手動でraspi_bot.pyを何度が実行していたところ、下記のようなエラーがたまに出ることがわかった。

1
Twitter API returned a 403 (Forbidden), Status is a duplicate.

エラー曰く、重複した投稿(過去に全く同じ内容のツイートをした場合)はツイート出来ないようになっているらしい。知らなかった…どうやら同じCPU温度を取得しているツイートが弾かれていた模様。

現在時間を取得する(タイムスタンプを取得)

これを回避するべく、タイムスタンプ(現在時刻)を入れることにする。これでツイート内容の重複を回避できる。
例: 「2015-03-11_12:00:03」という部分の情報


こちらを参考にしながら上記のraspi_bot.pyにタイムスタンプを取得するコードを追加する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
# coding: utf-8

import os
from twython import Twython

#twitterの認証情報を入力
CONSUMER_KEY = '取得したAPI Key'
CONSUMER_SECRET = '取得したAPI Secret'
ACCESS_KEY = '取得したAccess Token'
ACCESS_SECRET = '取得したAccess Token Secret'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

#CPU温度を取得
cmd = '/opt/vc/bin/vcgencmd measure_temp'
line = os.popen(cmd).readline().strip()
temp = line.split('=')[1].split("'")[0]

#現在時間を取得
timestamp = 'date +%F_%H:%M:%S'
current_time = os.popen(timestamp).readline().strip()

#取得したCPU温度をツイート
api.update_status(status= current_time+'現在、CPU温度は '+temp+' ℃です。')

これで、タイムスタンプが追加されツイートの内容重複が回避される。

自動スリープを解除する

またまた動作を観察していると、どこかの段階から全くツイートされなくなっていた… 調べてみるとラズパイはデフォルトでは自動でスリープする設定になっているらしい。 こちらを参考にして自動スリープを解除した。これでようやく完成。

[訂正] 上記の自動スリープの話はただ単にモニター出力が自動でスリープするという話だった。 ラズパイを起動し続けると(具体的には2日半くらい)自動でシャットダウン?する減少はまだ解決できていない…熱暴走が原因か?

Comments