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のトピック名を入れるだけで一通りの設定を自動作成してくれた。
これでデータ入出力の設定ができたので、QuickSightを開くとIoTのデータセットが選択できるようになっている。
QuickSightはリアルタイムデータ分析のツールではないので今回は少し試して終了。
CloudWatchにデータを送信する
やりたかったのはこちら。
IoT AnalyticsではなくIoT Coreの方のACT => Ruleを作成 or 作成済みのRuleを選択(Analyticsのクイック作成時に自動作成されていた)
Rule詳細の「アクションを追加」に「CloudWatch にメッセージデータを送信する」というのがあるので、ここから設定できる。
下記記事を参考に気温、湿度、気圧、不快指数を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でモニタリングできるようになった。
ChatbotでSlackに送信
Chatbotは現在のところ通知専用機能しか提供されていない。(Slackのコマンドを元にCloudWatchのグラフを表示する、というのはできない)
まずは、CloudWatchのアラーム作成を行い、不快指数が80を超えた場合にアラート状態になるように設定する。
期間は1分未満に設定すると有料になるので1分を指定した。
OKとアラーム状態の2通りに対して、ChatbotというSNS トピックに通知を送信するように指定。
最後に、AWS Chatbotの管理画面を開いて、Slack認証をした後、チャンネルとSNSトピックを紐付ければ、CloudWatchのアラート時にSlack通知が飛ぶようになる。
今までは自分でLambdaを用意してSlack通知ができるようにする必要があったけどChatbotを使うと手軽に連携できるようになってだいぶ楽になった。
これで本格的な自宅IoTモニタリングができるようになったので満足。