BME280センサ情報をAWS IoTで管理してChatbotでSlackに通知する

BME280センサ情報をAWS IoTで管理してChatbotでSlackに通知する
公開日時
更新日時

BME280センサ情報をMackerelを使って可視化するようにしたが、Mackerelは本来サーバの監視用であってIoTのデータ管理用ではないので 、IoTの管理に特化したAWS IoTを使ってみることにした。

せっかくなので、最近β版が公開されたAWS Chatbotを使って不快指数をCloudWatchでモニタリングして、しきい値を超えたらSlackに通知するところまで作ってみる。

RaspberryPiからAWS IoTにデータ送信

下記記事を参考に、AWS IoTの証明書をRaspberryPiに設置して、MQTTでデータ送信するところまで作成。

サンプルコードを一部変更して、不快指数とdatetimeを送信するようにした。

sudo apt install -y python-dev python-pip
sudo pip install AWSIoTPythonSDK
sudo pip install pytz

timezone指定ができるようにpytzをインストール。

# myBasicPubSub.py

from datetime import datetime, timedelta, timezone
import bme280

JST = timezone(timedelta(hours=+9), 'JST')

# ...

# Publish to the same topic in a loop forever
loopCount = 0
while True:
    if args.mode == 'both' or args.mode == 'publish':
        temperature, pressure, humidity, di = bme280.read_bme280()

        message = {}
        message['sequence']         = loopCount
        message['temperature']      = temperature
        message['pressure']         = pressure
        message['humidity']         = humidity
        message['discomfort_index'] = di
        messageJson = json.dumps(message)
        myAWSIoTMQTTClient.publish(topic, messageJson, 1)
        if args.mode == 'publish':
            print('Published topic %s: %s\n' % (topic, messageJson))
        loopCount += 1
    time.sleep(30)

ssh切断後もデータ送信し続けられるようにtmuxを起動してから下記を実行。

python myBasicPubSub.py \
--endpoint id-ats.iot.ap-northeast-1.amazonaws.com \
--rootCA ./cert/rootCA1.pem \
--cert ./cert/id-certificate.pem.crt \
--key ./cert/id-private.pem.key \
-t piz/bme280

ここまででAWS IoTにデータを蓄積できるようになった。

IoT Analyticsで収集したデータを管理

取得したデータの加工、蓄積をしてQuickSightで分析するにはIoT Analyticsを使う必要があった。

ただ単にCloudWatchメトリクスを作るのみであればAnalyticsを使う必要はなかった。(ということに後で気づいた)

CloudWatch Metrics の保存期間は15ヶ月らしいが、Analyticsの方は設定次第で無制限に蓄積できるので、長期のデータ保存が必要な場合はAnalyticsを使う必要がありそう。(個人用途であればCloudWatch Metricsでも十分)

なのでAnalyticsでやったことは備忘録として残しておく。

クイック作成に名前とMQTTのトピック名を入れるだけで一通りの設定を自動作成してくれた。

iot analytics

これでデータ入出力の設定ができたので、QuickSightを開くとIoTのデータセットが選択できるようになっている。

QuickSightはリアルタイムデータ分析のツールではないので今回は少し試して終了。

CloudWatchにデータを送信する

やりたかったのはこちら。

IoT AnalyticsではなくIoT Coreの方のACT => Ruleを作成 or 作成済みのRuleを選択(Analyticsのクイック作成時に自動作成されていた)

Rule詳細の「アクションを追加」に「CloudWatch にメッセージデータを送信する」というのがあるので、ここから設定できる。

下記記事を参考に気温、湿度、気圧、不快指数をCloudWatchに送信するように設定。

不快指数は下記のように指定した。

iot cloudwatch

ハマったのが単位の部分で、適当な単位を入れたらデータ計測がされなかった。

ドキュメントにある有効な単位を指定する必要があった。

Valid Values: Seconds | Microseconds | Milliseconds | Bytes | Kilobytes | Megabytes | Gigabytes | Terabytes | Bits | Kilobits | Megabits | Gigabits | Terabits | Percent | Count | Bytes/Second | Kilobytes/Second | Megabytes/Second | Gigabytes/Second | Terabytes/Second | Bits/Second | Kilobits/Second | Megabits/Second | Gigabits/Second | Terabits/Second | Count/Second | None

ここまででBME280のセンサ情報をCloudWatchでモニタリングできるようになった。

cloudwatch bme280

ChatbotでSlackに送信

Chatbotは現在のところ通知専用機能しか提供されていない。(Slackのコマンドを元にCloudWatchのグラフを表示する、というのはできない)

まずは、CloudWatchのアラーム作成を行い、不快指数が80を超えた場合にアラート状態になるように設定する。

期間は1分未満に設定すると有料になるので1分を指定した。

OKとアラーム状態の2通りに対して、ChatbotというSNS トピックに通知を送信するように指定。

cloudwatch alert

最後に、AWS Chatbotの管理画面を開いて、Slack認証をした後、チャンネルとSNSトピックを紐付ければ、CloudWatchのアラート時にSlack通知が飛ぶようになる。

cloudwatch slack

今までは自分でLambdaを用意してSlack通知ができるようにする必要があったけどChatbotを使うと手軽に連携できるようになってだいぶ楽になった。

これで本格的な自宅IoTモニタリングができるようになったので満足。

その後の追加対応

参考


Related #raspberry pi

ngrokの代わりにCloudflare Tunnelを使う

botやwebhookを利用するサービスの開発が捗る

Dockerのデータ保存場所を変更する

/etc/docker/daemon.jsonに追記

Alexaにゲーミングマシンと周辺環境を終了してもらう

「Alexa Steamを終了して」ができるようになった

Alexaにゲーミングマシンと周辺環境を起動してもらう

PC起動、TV起動、サウンドバー起動がまとめてできるようになった

docker-compose build時に「no Space Left on Device」が発生

1年前にも同じエラーにハマってた