【IoT入門】AWS IoT CoreとCloudWatchメトリクスを使用して部屋の温度と湿度を可視化してみた
こんにちは!
製造ビジネステクノロジー部のたかみです。
製造現場では品質管理のために温湿度の計測が欠かせないケースが多くあります。
今回はそのような現場を想定して自室の温度および湿度を計測し、AWS IoT CoreとCloudWatchメトリクスを使用して可視化してみました。
また、今回ご紹介する検証環境のソースコードは以下のGitHubにて公開しております。
お手元で実際に操作してみたい方はぜひご参照ください。
構成図
今回の検証では以下のような構成図でシステムを作成してみます。

取得したデータを可視化するためにはいくつかの選択肢がありますが、今回は計測したデータを可視化できることを確認したいだけなので、なるべくミニマムな構成になるようにCloudWatchメトリクスを使用してみました。
クラウド環境の作成
CDKを使用してクラウド環境(AWS)を構築しました。
ソースコードは前述のGitHubの/cdkフォルダにありますが、主要な箇所を抜き出して以下に記載します。
# cdkディレクトリに移動
cd cdk
# 証明書の発行(certificateArnを取得)
aws iot create-keys-and-certificate \
--set-as-active \
--certificate-pem-outfile ../certs/device.pem.crt \
--private-key-outfile ../certs/private.pem.key \
--public-key-outfile ../certs/public.pem.key
# IoT スタックのデプロイ(Thing / Policy / アタッチ + IoT Rule)
npx cdk deploy HomeSensorIotStack \
-c certificateArn=xxx
# モニタリングスタック(ダッシュボード)のデプロイ
npx cdk deploy HomeSensorMonitoringStack
次項以降では作成されたAWSリソースをコンソール上から詳しくみていこうと思います。
作成されたリソースの確認
CDKによって作成されたAWSリソースを確認していきましょう。
【モノの確認】
AWS IoT Core→すべてのデバイス→モノの画面からhome-sensor-01が作成されていることが確認できました。

【ルールの確認】
AWS IoT Core→メッセージのルーティング→ルールからhome_sensor_telemetry_to_cloudwatchが作成されていることが確認できました。

またhome_sensor_telemetry_to_cloudwatchの中身も想定通り作成されていそうです。

SQLステートメントの内容は以下です。これにより、デバイスからpublishされたデータから温度と湿度を取得します。
SELECT temperature, humidity FROM 'home/sensor/+/telemetry'
また、実際にデバイスから送信されるデータは以下のような形式のjsonです。
Wi-Fiの電波強度確認用にrssiも送っていますが、今回は可視化対象外としました。
{
"temperature": 22.0,
"humidity": 50.0,
"rssi": -40
}
温度と湿度という2つのデータをそれぞれCloudWatchメトリクスに送信するため、アクションが2つ作成されています。
温度データを送信するアクションの中身は以下のようになっています。

これにより、SQLステートメントで指定したデータのうちtemperatureがTemperatureメトリクスへと送信されるようになったことがわかります(割愛しますが湿度に関しても同様のアクションが作成されています)。
【ダッシュボード】
今回はHomeSensorMonitoringStackを使用してモニタリング用のダッシュボードを作成しました。CloudWatch→ダッシュボードからhome-sensor-dashboardが作成されていることを確認しましょう。

まだデータが送信されていないのでグラフは描画できていませんが、温度と湿度を一覧で見られるダッシュボードが作成されていることがわかります。

ここまででクラウド側の準備は終了です。
次はデバイス側の準備をしていきましょう。
使用するデバイス
- ESP32 Board(マイコン)
- DHT11 Temperature and Humidity Module(温湿度センサー)
- ブレッドボード
- ジャンパーワイヤ
デバイス側の準備
デバイス側で行うことは以下のとおりです。
- 温度と湿度を1分ごとに測定
- 測定した温度と湿度をpublish
- これを繰り返す
今回はArduino IDEを使用してデバイス側の実装を行いました。
実装の主要な箇所を以下に記載します。全容はGitHubをご覧ください。
void setup() {
Serial.begin(115200);
Serial.printf("TELEMETRY_TOPIC = %s\n", TELEMETRY_TOPIC);
dht.begin();
connectWiFi();
syncTime();
wifiClientSecure.setCACert(AWS_CERT_CA);
wifiClientSecure.setCertificate(AWS_CERT_CRT);
wifiClientSecure.setPrivateKey(AWS_CERT_PRIVATE);
mqttClient.setServer(AWS_IOT_ENDPOINT, 8883);
mqttClient.setBufferSize(MQTT_BUFFER_SIZE);
reconnectMqttIfNeeded();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
reconnectMqttIfNeeded();
mqttClient.loop();
unsigned long nowMs = millis();
if (nowMs - lastPublishMs >= PUBLISH_INTERVAL_MS) {
lastPublishMs = nowMs;
publishTelemetry();
}
}
では、実際に動かしてみてグラフがどう描かれるのかみてみましょう。
可視化したデータを見てみる
可視化したデータが以下です。

温度変化を可視化するため、計測を開始してすぐに部屋のエアコン(クーラー)をOFFにしました。
想定通り、部屋の温度が徐々に上昇しているように見えます。
また、温度の変化に伴って湿度も変化していることがわかります。空気中の水分量はほぼ変わらないまま室温だけが上がったため、相対湿度が下がったのだと推測しています。
さらに温度変化を可視化するため、再度エアコンの電源を入れてみました。その結果が以下です。

22時15分ごろにエアコンのスイッチを入れましたが、想定通り温度が下がっています。
以上より、部屋の温度・湿度が想定通り可視化できていることがわかりました。
課題
最小構成で部屋の温度・湿度を可視化することには成功しましたが、いくつか課題も見つかりました。
【取得したデータは長期保存できない】
取得したデータはCloudWatchメトリクス上で確認が可能ですが、保持期間は有限です。そのため、データを長期保存しておく必要がある場合はCloudWatchメトリクスを使用するのは不適切となります。
【グラフの表現力が弱い】
CloudWatchのグラフ機能は監視用途に最適化されているため、細かいカスタマイズはできません。
【生データが残らない】
集約された統計値をグラフで可視化することはできましたが、今回の検証では生データをどこにも保存していません。取得したデータをExcelで分析したい、AIの学習データに使用したいなどというユースケースが出てきた際に対応が難しくなることが予想されます。
【そもそもセンサーの精度があまり良くない】
今回使用したDHT11は以下の誤差を含みます。そのため、測定されたデータに対する信頼性はあまり高くないと言えるでしょう。
- 温度:±2℃
- 湿度:±5%RH
今回は自宅で手軽に試せるIoT技術の検証ということでシンプルな構成・安価なセンサーを選択しましたが、より精密な可視化を行うためには構成の見直しが必要なことがわかりました。
まとめ
今回はESP32+DHT11→IoT Core→CloudWatchメトリクスの構成で部屋の温度と湿度を可視化してみました。
その中で、CloudWatchメトリクスやDHT11では不足する部分があることも明らかになりました。手軽に可視化を試してみる分には十分ですが、目的に応じてクラウド・デバイスともに構成を見直す必要があることがわかりました。






