2020/03/22 部屋の温度を監視したい4 -discordに通知-
部屋の温度を監視したいその4
前回の続き。
一部修正した。
5分間隔で実行→10分間隔で実行
5分間隔では多すぎてグラフが読みにくい。
15分でもいいけどとりあえず10分で様子見。
PHPの改修
今のページではすべてのデータがグラフ化されるため見にくい。
なので日付フォーム部分を作ってGETクエリに日付を追加して、日付指定をできるようにした。
コードは割愛。
ここまでである程度室内の温度を監視する仕組みは完成した。
監視したところで通知が来なければ意味がない。
そこでWebhookを利用してDiscordに通知させる。
これは10分ごとに実行されるPythonのコード内に、取得した値がしきい値を超えていた場合、
DiscordのWebhookURLにリクエストをすればいいだけなので簡単。
get_temp.pyを編集モクモク
code:get_temp.py
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from dht11 import dht11
import time
import datetime
import sqlite3
import requests
READPIN = 14
discord_webhook_url = "webhookURL"
# 緊急連絡
emergency_temp = 35
# 警告
warn_temp = 30
# 初期化
# cleanupされていなくても場合にエラーを表示しない。
GPIO.setwarnings(False)
# BCMモード。
GPIO.setmode(GPIO.BCM)
# 読み込みピンの設定
instance = dht11.DHT11(pin=READPIN)
# 温度読み取り
# エラー10回までは5秒間隔で再受信
def GetTemp():
error_cnt = 0
while True:
error_cnt += 1
result = instance.read()
if result.is_valid():
return result.temperature, result.humidity
elif error_cnt >= 10:
return 0, 0
time.sleep(5)
try:
if __name__ == "__main__":
temp, hum = GetTemp()
print ('温度=%s, 湿度=%s' % (temp, hum))
connect = sqlite3.connect('/home/izumin/python/get_temp_project/get_tmp.db')
connect.row_factory = sqlite3.Row
connect.text_factory = str
cursor = connect.cursor()
nowtime = datetime.datetime.now()
nowtime2 = nowtime.strftime('%m/%d %H:%M')
datas = (nowtime2, temp, hum)
cursor.execute('insert into data values (?,?,?)', datas)
cursor.execute('delete from data where date < (select min(date) from data where date in(select date from data order by date desc limit 4464))')
connect.commit()
connect.close()
if temp >= emergency_temp:
discord_content = {
"content": ":fire: !!!!温度が上昇しています!!!!\r現在の室温は「" + str(temp) + "℃」です。※" + str(nowtime2) + "\rすぐに確認してください→http://URL", "avatar_url": "hoge.png"
}
requests.post(discord_webhook_url, discord_content)
pass
elif temp >= warn_temp:
discord_content = {
"content": "現在の室温は「" + str(temp) + "℃」です。"
}
requests.post(discord_webhook_url, discord_content)
pass
else:
pass
GPIO.cleanup()
except KeyboardInterrupt:
print('Ctrl+Cにより中断')
pass
これで実際に通知が届くようになった。
実際の通知↓
これは一時的に警告温度を下げたので通知が来た。
実際は35℃以上あたりにしておけばいいだろう。
https://gyazo.com/748d3115d01398ead4b05ad24488c489