本日は 『エラーが出たら通知する』 というものを意識して作りました。
使えそうなデータとしては、最近ラズパイで取ってる部屋の温度と湿度のデータ。
だんだん涼しくなってきたのが、グラフで分かりますね。
昼間は窓を開けてるので湿度が下がって、夕方に窓を閉めると湿度が上がっています。
特にここ2日は湿度が低め。
これからもっと温度も湿度も下がってくると予想されます。
そんなときに、加湿器やエアコンを付けるとかをしたいわけですよ。
できれば自動で。
その第一歩として、とりあえず通知だけを出してみる。
今回はそういう設定で頑張ってみました。
参考にしたのはこちらの本。
こちらの本、実はPython2系で書かれているものがあることがあって少し躓きました。
確かに3年ほど前の本ですが、3年で使えなくなるって凄いスピードの世界だなと改めて感じました。
LINEと連携するには、まず「LINE Notify」への登録が必要です。
https://notify-bot.line.me/ja/
自分のLINEアカウントがあれば登録できます。
次に、トークンを発行します。
トークン発行の為に、必要な情報を入れます。
トークン名は、この部分になるやつです。
あとは、このメッセージを送る相手を選ぶのですが、とりあえず自分だけにしたいので「1:1でLINE Notifyから通知を受け取る」を選びます。
ライングループに通知とかもできますので、その際は新たにトークンを発行すれば良いと思います。
発行したトークンをコピペしてメモ帳などに保管します。
このトークンはプログラムを作る際に必要になりますので必ず記録しておいてください。
LINE連携の準備はここまで。
次に、Pythonでプログラムを書いていきます。
今回は2箇所ほど躓いた部分があるので、まずそこを補足します。
1.pycurlがimportできない
sudo apt install python3-pycurl
上記コマンドでうまくいきました。
ググってみると、
pip install pycurl
というのを良く見かけるのですが、これだとpython2系にインストールされるっぽい。
この辺りの仕組みがまだ良くわかっていない・・・。
(参考) How to Install python3-pycurl in Ubuntu 18.04
https://www.howtoinstall.me/ubuntu/18-04/python3-pycurl/
2.urllib.urlencodeのコマンドでエラー
これはpython2系の命令文らしく、python3だと
urllib.parse.urlencode
になるらしい。
先人たちのアドバイスには感謝しかない…!
(参考) teratail
https://teratail.com/questions/51894
そんなこんなで出来上がったプログラムがこちら。
ラズパイで温湿度のデータを取って、IFTTTでスプレッドシートにデータを送り、湿度に異常が出たらLINEに通知するプログラムです!
import RPi.GPIO as GPIO
import dht11
import datetime
import requests
import urllib
import pycurl
tempGpio = 4
GPIO.setmode(GPIO.BCM)
dhtStat = dht11.DHT11(pin=tempGpio)
while True:
stat = dhtStat.read()
now = str(datetime.datetime.now())[0:16]
if stat.temperature == stat.humidity == 0:
continue
# IFTTT + Spreadsheet
data2 = {"value1":now, "value2":stat.temperature, "value3":stat.humidity}
requests.post("https://maker.ifttt.com/trigger/XXXXXXX/with/key/YYYYYYYYYYYYYYYYYYYYY", json = data2)
# LINE連携ここから
temp = stat.temperature
humi = stat.humidity
if humi < 50:
mes = "alert:[ Too dry! " + str(temp) + ", " + str(humi) + "%]"
curl = pycurl.Curl()
curl.setopt(pycurl.URL, 'https://notify-api.line.me/api/notify')
field_data = urllib.parse.urlencode({'message':mes})
curl.setopt(pycurl.POSTFIELDS, field_data)
header = ["Authorization: Bearer ZZZZZZZZZZZ(発行したトークン)ZZZZZZZZZZZZZ"]
curl.setopt(pycurl.HTTPHEADER, header)
curl.perform()
if humi > 70:
mes = "alert:[ Too humid! " + str(temp) + ", " + str(humi) + "%]"
curl = pycurl.Curl()
curl.setopt(pycurl.URL, 'https://notify-api.line.me/api/notify')
field_data = urllib.parse.urlencode({'message':mes})
curl.setopt(pycurl.POSTFIELDS, field_data)
header = ["Authorization: Bearer ZZZZZZZZZZZ(発行したトークン)ZZZZZZZZZZZZZ"]
curl.setopt(pycurl.HTTPHEADER, header)
curl.perform()
# LINE連携ここまで
break
GPIO.cleanup()
湿度は50%以下、70%以上でエラーを通知するようにしました。
とりあえずLINEに通知が届くかテストしたかったので、数値は適当に変えながら動作確認。
ちゃんと届きました!!!
(16:15以降の通知)
湿度とか応答性の悪いものなので、1回通知が来たらずっと通知が鳴りっぱなしな気もするけど、そのあたりの運用はいくらでもやりようがあるかなと思ってます。
日常生活だと、ポストに何かが投函されたら通知してくれたら嬉しいかな。
あとは鍵の開閉の通知とか。
「あれ?鍵かけたっけ??」ってなったとき(よくある)に役立ちそう。
1つできることが増えて、あれこれ考えるのは楽しいですね!
温度や湿度以外にも色々と測定してみて、面白いものを思いついたら何か作ってみようと思います。