M5StickC with ENV HatでAWS IoT Device Shadowを利用してみる

はじめに

前回の続きとなります。
https://www.skyarch.net/blog/?p=18393

前回までで、AWS IoTサービスへセンサ値をPublish出来たため
今回はShadowを利用して、LED状態の管理をしてみます。

出来たもの

Shadowドキュメントを更新する事でDeltaを発生させデバイス側LEDを制御

左側のウィンドウ

AWS IoT ⇢ モノ ⇢ シャドウ
にて下記シャドウステータスの desired 内、led_status を 1 に更新すると、deltaが発生しデバイスが受信してLEDを付ける
led_statusを 0 に更新すると、LEDが消えます。

右側のウィンドウ

テスト ⇢ MQTTクライアントにて下記トピックをサブスクライブしています。
このため delta が発生した際に、デバイス側が受信(Subscribeしている)するトピック内容となります。

$aws/things/M5Stick01/shadow/update/delta

デバイス側でLEDステータスを変化させてもDeltaが発生しShadowドキュメント状態に収束する

デバイス側では、自身のLED点灯/消灯情報をFlagのような形で持っており
およそ5秒に1回、その状態を Shadowに reportedとして通知しています。

このため、Shadowドキュメント内では desired が 消灯 にも関わらず
デバイス側で点灯されると、desired と reportedに deltaが発生
受信したデバイスが desiredの状態にLEDを点灯/消灯し合わせるという形です。

このあたりの挙動はdesiredをnullとして送信する事で変更できそうですね。
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/device-shadow-document.html

左側のウィンドウ

AWS IoT ⇢ モノ ⇢ シャドウ
にてシャドウステータスを確認していますが、シャドウドキュメントの更新は行っていません。

右側のウィンドウ

テスト ⇢ MQTTクライアントにて下記トピックをサブスクライブしています。
手動でLED状態を変更すると、deltaが発生します。

$aws/things/M5Stick01/shadow/update/delta

目次

手順の概要

  1. AWS IoTで モノ/証明書/ポリシーを作成し適切な関連にAttach (AWS CLIにて実施) 前回までに実施
  2. AWS IoTで Shadowドキュメントを変更
  3. PubSubClientヘッダファイル変更
  4. コード書く/転送

M5StickCで利用するライブラリ等

前回と同様

参考にさせて頂いた記事

ESP32でAWS IoTに繋いでThing Shadowを弄る
https://blog.maripo.org/2017/07/esp32-aws-iot/

ESP32 Arduino: Timer interrupts
https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/

実行環境

MacOS上で実施しました。

手順

2. AWS IoTで Shadowドキュメントを変更

作成したモノのシャドウドキュメントで初期値は色々入っておりますが、シンプルにled_statusのみとします。
"welcome": "aws-iot" は消せなかったため。

3. PubSubClientヘッダファイル変更

私のPCでは下記場所にありました。
/Users/[自分のユーザ名]/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h

Mac/Linuxでしたら下記にて検索出来ると思います。

ファイル内の下記を書き換えます。
サイズオーバすると、Callback関数内も実行されずDebugが難しいためお気をつけ下さい。

4. コード書く/転送

下記の [] 括弧部分をご自身の物に書き換える必要があります。
詳細は前回の記事をご覧下さい。
https://www.skyarch.net/blog/?p=18393

コード

およそ5秒毎にデータをAWSIoTへ送信しております
タイマーを割り込みにて処理しています。

コード上のポイントとなる処理

  • センサ値取得は、ENV HAT用のサンプルスケッチからほぼ変えていません。
  • タイマーに関しては、参考ブログから拝借した内容となります。

Shadow Topicのパブリッシュ/サブスクライブ

clientIdを元にTopicエンドポイント名を生成しています。

パブリッシュ

現在のデバイス状態(LED点灯状況)をShadowにてレポートするため5秒毎に
LEDの点灯/消灯状態変数を元にJSONドキュメントを生成し、Publishしています。

生成されるJSONは下記のようになります。
{"state": {"reported" : {"led_status" : 0}}}

サブスクライブ

サブスクライブ設定を行うと、コールバック関数にトピック名、メッセージ、メッセージ長が通知されます。
通知されたメッセージを、char型からString型にキャストし、deserializeを実施しています。

取得したJSON内の数値を、booleanに変換し出力しています。
※M5StickのLED接続I/OピンがHighだと消灯/Lowだと点灯のため反転する必要あり

関連コード部分

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

ABOUTこの記事をかいた人

Japan AWS Ambassadors 2023, 2024 開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。