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

#前回までのDHT22
DHT11のライブラリーをあーじゃこうじゃして無事DHT22のデータを読み出すことに成功した。
   [-ラズパイで廉価だけどちょっと立派な温度センサDHT21(AM2302)をDHT11の気軽さで使いたい](https://qiita.com/HondaYoshimi/items/401644f17ec1c547bffd)



そんで、

今回は温度情報を元にSlackに投稿します。

##SLACKに投稿する準備
Tokenの取得からテストメッセージの投稿まで。
###Tokenをゲット
SlackでAPI用のTokenを取得してください。
自分はちょっと昔にやったのでうろ覚えですが、こちらを参考にしました。
[Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)

###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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388857/f22547c0-4303-40d0-8740-6940d2a4eb8c.png)
さすが世界のスラック、楽です。

##作る
そいじゃ作ります
###設計
-設定した温度以上になったらSlackに投稿する。
-温度が安全なくらい下がったらSlackに投稿する。
-測定は６００秒に一回
-測定に失敗したら１秒毎に最大２０回リトライ（結構失敗する）
-２０回失敗したら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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388857/e5056ee8-033b-3dc2-aee0-59678712d691.png)

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

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