LoginSignup
4
1

More than 3 years have passed since last update.

ラズパイとDHT22で部屋が暑くなったらSlackにメッセージする

Posted at

前回までの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

試しに投稿してみる

Slacker_test.py
# -*- 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

すると
image.png
さすが世界のスラック、楽です。

作る

そいじゃ作ります

設計

-設定した温度以上になったらSlackに投稿する。
-温度が安全なくらい下がったらSlackに投稿する。
-測定は600秒に一回
-測定に失敗したら1秒毎に最大20回リトライ(結構失敗する)
-20回失敗したらSlackに投稿する

OndoBotSlack.py
# -*- 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 %

すると
image.png

これから

とりあえずこいつで動くんですが、問題が。
Raspberry Pi Zero WHで動かそうとしたんですが、Motion(USBカメラを監視カメラにするやつ)のようなCPUとかIOとかバシバシ使うアプリと同居できない、、、全部読み取り失敗になってしまいます。もともと反応速度が遅いGPIOでシリアル通信をソフトで無理やり読んでるんだからそりゃ無理があるわけです。
とりあえず500円位のArduinoを間に挟んで解決できないかなと模索中です。

あとセンサーのむき出しっぷりがすごいので3Dプリンタでカバー作らなきゃ。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1