前回までのDHT22
DHT11のライブラリーをあーじゃこうじゃして無事DHT22のデータを読み出すことに成功した。
-ラズパイで廉価だけどちょっと立派な温度センサDHT21(AM2302)をDHT11の気軽さで使いたい
そんで、
今回は温度情報を元にSlackに投稿します。
SLACKに投稿する準備
Tokenの取得からテストメッセージの投稿まで。
Tokenをゲット
SlackでAPI用のTokenを取得してください。
自分はちょっと昔にやったのでうろ覚えですが、こちらを参考にしました。
Slack API 推奨Tokenについて
Slackerの導入
PythonにSlack用ののライブラリSlackerを導入です。
本当にPythonって便利ですね。
僕はpip派
pipがインストールされてなければ
apt-get install python-pip
そんでpipを使ってSlackerを導入
pip install Slacker
試しに投稿してみる
# -*- coding: utf-8 -*-
from slacker import Slacker
#token
TOKEN="xxxxxxxxxxxxxxxx"
#投稿したいチャンネル名
POST_TARGET = "xxxxxxx"
slack = Slacker(TOKEN)
slack.chat.post_message( POST_TARGET, "test")
そんで
python Slacker_test.py
作る
そいじゃ作ります
設計
-設定した温度以上になったらSlackに投稿する。
-温度が安全なくらい下がったらSlackに投稿する。
-測定は600秒に一回
-測定に失敗したら1秒毎に最大20回リトライ(結構失敗する)
-20回失敗したらSlackに投稿する
# -*- coding: utf-8 -*-
from slacker import Slacker
import RPi.GPIO as GPIO
import dht22
import time
import datetime
GPIO_PIN = 4
TOKEN = "xxxxxxxxxxxxxxxxxx" #Slackのtoken
POST_TARGET = "xxxxxxx" #Slackの投稿したいチャンネル名
UPPER_THRESHOLD = 29 #暑くなったメッセージの温度
LOWER_THRESHOLD = 27 #涼しくなったメッセージの温度
MES_INTERVAL = 600 #計測間隔
RETRY_INTERVAL = 1 #失敗したときのリトライ感覚
RETRY_TIME = 20 #失敗したときのリトライ回数
Alart = False
Error_count = 0
# GPIO初期化
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
sens = dht22.DHT22(pin=GPIO_PIN)
slack = Slacker(TOKEN)
while True:
result = sens.read()
if result.is_valid():
print("Last valid input: " + str(datetime.datetime.now()))
print("Temperature: %s C" % result.temperature)
print("Humidity: %s %%" % result.humidity)
Error_count = 0
#Alart が Falseの時は温度が上がることを、trueのときは温度がさがることを監視。メッセージが連呼されるのを防ぐ
if not Alart:
if(result.temperature > UPPER_THRESHOLD):
temp = result.temperature
humi = result.humidity
alart_msg = 'あっついよー ' + str(temp) + 'C / ' + str(humi) + '%'
slack.chat.post_message(POST_TARGET, alart_msg)
Alart = True
else:
if(result.temperature < LOWER_THRESHOLD):
temp = result.temperature
humi = result.humidity
alart_msg = 'すずしくなったー ' + str(temp) + 'C / ' + str(humi) + '%'
slack.chat.post_message(POST_TARGET, alart_msg)
Alart = False
else :
#計測ミスはリトライ
Error_count+=1
print("Error count:" + str(Error_count))
time.sleep(RETRY_INTERVAL)
if(Error_count > RETRY_TIME):
slack.chat.post_message( POST_TARGET, "欠測しました%d秒後に再度計測します。" % MES_INTERVAL)
Error_count = 0
else:
continue
time.sleep(MES_INTERVAL)
そんで
python OndoBotSlack.py
Error count:1
Error count:2
Error count:3
Last valid input: 2019-05-30 02:45:02.000414
Temperature: 27.1 C
Humidity: 44.4 %
Error count:1
Last valid input: 2019-05-30 02:45:13.178282
Temperature: 27.1 C
Humidity: 43.3 %
Error count:1
Last valid input: 2019-05-30 02:45:24.357520
Temperature: 27.1 C
Humidity: 43.8 %
これから
とりあえずこいつで動くんですが、問題が。
Raspberry Pi Zero WHで動かそうとしたんですが、Motion(USBカメラを監視カメラにするやつ)のようなCPUとかIOとかバシバシ使うアプリと同居できない、、、全部読み取り失敗になってしまいます。もともと反応速度が遅いGPIOでシリアル通信をソフトで無理やり読んでるんだからそりゃ無理があるわけです。
とりあえず500円位のArduinoを間に挟んで解決できないかなと模索中です。
あとセンサーのむき出しっぷりがすごいので3Dプリンタでカバー作らなきゃ。