Amazon Web Services ブログ
AWS IoT デバイスシャドウサービスと AWS IoT Greengrass を利用してどこからでも IoT デバイスの状態を管理する
はじめに
IoT (Internet of Things) 開発者はしばしば、ローカルまたはリモートで IoT デバイスの状態を管理するための堅牢なメカニズムを実装する必要があります。典型的な例は、スマートホーム用ラジエーターです。IoT デバイスで、ビルトインのコントロールパネルを使用して温度(デバイスの状態)を調整したり、クラウドで実行されているソフトウェアアプリケーションから温度調整メッセージをリモートでトリガーしたりできます。
このメカニズムを迅速に構築するには、AWS IoTデバイスシャドウサービスを使用できます。AWS IoTデバイスシャドウサービスにより、デバイスの状態をビジネスロジックで利用できるようになります。これには、断続的なネットワーク接続の場合も含まれます。
加えて、デバイスのソフトウェアライフサイクルを効率的に管理し、開発作業を加速するために、AWS IoT Greengrassをそのプリビルトコンポーネントとともに使用できます。AWS IoT Greengrass は、デバイスソフトウェアのビルド、デプロイ、管理のためのオープンソースのエッジランタイムとクラウドサービスです。 AWS IoT Greengrass のコンポーネントの1つである シャドウマネージャーは、コアデバイス上にローカルシャドウサービスを有効にします。 ローカルシャドウサービスにより、コンポーネントがプロセス間通信(IPC)を使用して、ローカルシャドウ相互作用できます。
シャドウマネージャーコンポーネントは、ローカルシャドウドキュメントのストレージを管理するとともに、ローカルシャドウステートと AWS IoT デバイスシャドウサービス間の同期も処理します。
このブログ投稿では、AWS IoTデバイスシャドウサービスと AWS IoT Greengrass を Raspberry Pi および Sense HAT ハードウェアと組み合わせて、スマートホーム用ラジエーターをシミュレートしています。このデモンストレーションでは、出力パワーをシミュレートするために1桁の数字(0-9)を使用しています。この数字は、ローカルおよびリモートのどちらからでも管理したいデバイスの状態です。ユーザーは、ローカルのハードウェアスイッチ(Sense HAT に組み込まれたジョイスティック)とクラウドベースのアプリケーションからこの数字を変更できます。
Raspberry Pi は Sense HAT LED ディスプレイに数値を表示し、放熱器の出力電力を示します。ユーザーは Sense HAT のジョイスティックを上に押して数値を増やす(または下に押して減らす)ことができます。
図1. Raspberry Pi – 家庭用ラジエーターのシミュレーション
図2. アーキテクチャの概要
このブログ投稿に従うことで、デバイスの状態をどこからでも管理するための IoT ソリューションの構築とテストをすぐに開始できます。
前提条件
このブログ記事を通して進めるには、次のものが必要です:
ハードウェア:
- Raspberry Pi (デモでは Raspberry Pi 3B を使用)
- Raspberry Pi Sense HAT
ソフトウェア:
- Raspberry Pi にインストール済みの Raspberry Pi OS (64ビット版) (こちらのリンクを参照してインストール方法を確認してください)
- Raspberry Pi にインストール済みの Sense HAT SDK
- AWS アカウント とAWS IoT CoreおよびAWS IoT Greengrassへのアクセス権限
ウォークスルー
ステップ1: Raspberry Pi に AWS IoT Greengrass コアソフトウェアをインストールおよび構成します。
Raspberry Pi を AWS IoT Greengrass コアデバイスとして設定するには、AWS IoT Greengrass のスタートガイドのステップ1からステップ3に従ってください。私は次の構成でデバイスを作成しました:
- コアデバイス名: PiWithSenseHat
- モノのグループ: RaspberryPiGroup
これでこのデバイスをあなたの AWS コンソール上で確認できるはずです。
図3. コンソールのAWS IoT Greengrassコアデバイス
ステップ2: デバイスにプリビルドされた AWS IoT Greengrass コンポーネントをデプロイする
次のステップでは、プリビルドされた AWS IoT Greengrass コンポーネントをデバイスにデプロイします。AWS IoT Greengrass は、開発を加速できる事前構築されたコンポーネントのセットを提供し、メンテナンスしています。このデモンストレーションでは、次のコンポーネントをデプロイしています:
- greengrass.Cli:
コアデバイス上でローカルコマンドラインインターフェイスを提供します。これを使用して、コンポーネントをローカルで開発およびデバッグできます。
- greengrass.ShadowManager
コアデバイス上にローカルシャドウサービスを有効にし、ローカルシャドウステートと AWS IoT デバイスシャドウサービス間の同期を処理します。
- greengrass.LocalDebugConsole (任意)
AWS IoT Greengrass コアデバイスとそのコンポーネントに関する情報を表示するローカルダッシュボードを提供します。
手順:
- AWS IoT Greengrass コンソール に移動してください
- Greengrass デバイス の デプロイ に移動し、新しいデプロイメントを作成してください
- デプロイターゲットは、モノのグループ RaspberryPiGroup または コアデバイスのいずれかにできます
- パブリックコンポーネント からこれら3つのコンポーネントを選択してください
図4. プリビルドコンポーネントの選択
- aws.greengrass.ShadowManagerコンポーネントの設定
コンポーネントの構成の手順で、aws.greengrass.ShadowManagerを選択し、コンポーネントを設定をクリックしてください。
図5. aws.greengrass.ShadowManagerの設定
- aws.greengrass.ShadowManager のコンポーネントバージョンと構成 json を設定してください
図6. aws.greengrass.ShadowManager の詳細設定
- バージョン: 2.3.1
- マージする設定:
{
"synchronize": {
"coreThing": {
"classic": true,
"namedShadows": [
"NumberLEDNamedShadow"
]
},
"shadowDocuments": [],
"direction": "betweenDeviceAndCloud"
},
"rateLimits": {
"maxOutboundSyncUpdatesPerSecond": 100,
"maxTotalLocalRequestsRate": 200,
"maxLocalRequestsPerSecondPerThing": 20
},
"shadowDocumentSizeLimitBytes": 8192
}
jsonの設定は、この例では NumberLEDNamedShadow という名前付きシャドウを betweenDeviceAndCloud オプションにより両方向で同期させています。実際のアプリケーションでは、複数の名前付きシャドウを使用でき、1方向または双方向の同期が可能です。 ドキュメントの aws.greengrass.ShadowManager の詳細を確認してください。
- デプロイウィザードを完了してデプロイを終了してください。
ステップ2の最後に、Raspberry Pi は、 AWS IoT Greengrass コアソフトウェアとプリビルドコンポーネントを使用して、デバイスとクラウド間で名前付きシャドウ NumberLEDNamedShadow
を同期する準備ができています。
ステップ3: ローカル制御を備えたスマートホームラジエーターをシミュレートするための AWS IoT Greengrass コンポーネントを作成する
これで、ローカル制御を備えたスマートホームラジエータをシミュレートするための2つの AWS IoT Greengrass コンポーネントを作成します。 プロセス間通信(IPC)を利用して、コンポーネント間の内部通信を行うことができます。
カスタム AWS IoT Greengrass コンポーネントの構築方法に不案内な場合は、スタートガイド のステップ4を参照してください。
このブログでは、それらをローカルで作成およびテストします。
- コンポーネント example.sensehat.joystick: ジョイスティックからイベントをキャプチャし、IPCトピック
“ipc/joystick”(レシピで変数として定義されています) にイベントをパブリッシュします - コンポーネント example.sensehat.led: IPCトピック “ipc/joystick” をサブスクライブし、ローカルシャドウを更新し、Sense HAT
LEDディスプレイを更新します
3.1 コンポーネント com.example.sensehat.joystick を作成する
このコンポーネントは、組み込みジョイスティックのイベントを AWS IoT Greengrass コア IPC にパブリッシュしています。イベントは次のような形式です。
{
"timemillis":1669202845134,
"direction":"down",
"action":"released"
}
コンポーネントのレシピとアーティファクトは、ブログのソースコードリポジトリから見つけることができます。
ソースコード内に IPCトピックをハードコーディングする代わりに、レシピ内で変数として定義されています。
3.2 コンポーネント com.example.sensehat.led を作成する
ここで2つ目のコンポーネントであるcom.example.sensehat.led を作成します。
コンポーネントのレシピとアーティファクトはソースコードリポジトリで見つけることができます。
レシピでは、IPC とシャドウドキュメントへのアクセス許可を定義しています。
このコンポーネント:
- デバイスの状態として数値を保持し、LED に表示する
- IPC を介してジョイスティックイベントトピックをサブスクライブする
- 受信したジョイスティックイベントに基づき、数値を増減させる
- 定期的にシャドウをチェックする。シャドウドキュメントに新しい数値があれば、その数値でデバイスを更新する
図7.
com.example.sensehat.ledコンポーネントのワークフロー
デモ: アクションでデバイスの状態を管理する
これで Raspberry Pi はシミュレータとして使用する準備が整いました。
2種類のイベントに対応しています:
- 新しいジョイスティックイベント: デバイスのローカル制御
- 新しいクラウドシャドウドキュメント: デバイスのリモート制御
図8: ローカルまたはリモートからデバイスを制御するロジック
デバイスシャドウを実際に動作させるには:
- AWS IoT Greengrass コンソール に移動してください
- モノ に移動し、PiWithSenseHat を選択してください
- Device Shadow で、 NumberLEDNamedShadow が見つかります。 このシャドウを手動で作成する必要はないことに注意してください。
デバイスが最初にシャドウを報告したときに、不足している場合は作成します。
図9. AWS コンソールでデバイスシャドウを見つける
デモ1: ジョイスティックを使用してローカルでデバイスを更新する
- ジョイスティックを使用して、ローカルの数字を増減させます(初期数値は6でした。最初に0まで減らし、次に2まで増やしました)。
- リアルタイムで AWS コンソール内のデバイスシャドウドキュメントが更新されるのを観察します。 変更はリアルタイムでクラウドシャドウに同期されます。
-
- status は “device updated by local” に変更される
- number はローカルからの新しい値に変更される
図10: ジョイスティックを使用して数値を更新し、リアルタイムでクラウドに新しい値を報告
デモ2: クラウド上のデバイスシャドウドキュメントを更新することによるリモートからのデバイスの更新
- このデモの初めではデバイスの LED は 0 を表示しており、デバイスシャドウドキュメントは次のとおりでした。
{ "state": { "desired": { "number": 0 }, "reported": { "status": "device is updated by local", "number": 0 } } }
- AWS IoT Core コンソールのシャドウドキュメントを次の JSON
で編集し(「reported」セクションは省略可)、更新をクリックしてください。{ "state": { "desired": { "number": 9 } } }
- Raspberry Pi の LED に表示される数字が更新されるのを観察してください。変更はクラウドからローカルデバイスにプッシュされます。現在、デバイスは数字9を表示しています:
-
- “status” の値が “device updated by shadow” に変更された
- “number” が 0 から 9 に変更された
図11. クラウド内のデバイスシャドウドキュメントを更新することにより、リモートからデバイスを更新する
表示番号はローカルのジョイスティックまたは AWS コンソールからリモートで更新できるため、最新の更新が優先されます。
したがって、更新がローカルで行われた場合、クラウドのリモートシャドウに「desired」値を設定し直すことが重要です。これにより、リモートシャドウは新しい「desired」値を認識し、次のシャドウ同期サイクルで更新しないようになります。詳細はドキュメント device-shadow-empty-fields を参照してください。
クリーンアップ
-
- Raspberry Pi に AWS IoT Greengrass コアソフトウェアをインストールするために使用した IAM ユーザーを削除/無効化する
- AWS IoTコンソールで、Greengrass デバイスに移動する
- コアデバイスでデバイス PiWithSenseHat を選択し、右上の削除をクリックする
- モノのグループで RaspberryPiGroup を削除する
- Raspberry Pi から以下の2つのカスタムコンポーネントを削除する
- Raspberry Pi のターミナルで以下のコマンドを実行します
sudo /greengrass/v2/bin/greengrass-cli --ggcRootPath /greengrass/v2 deployment create --remove "com.example.sensehat.led"
sudo /greengrass/v2/bin/greengrass-cli --ggcRootPath /greengrass/v2 deployment create --remove "com.example.sensehat.joystick"
- Raspberry Pi から AWS IoT Greengrass コアソフトウェアをアンインストールする
- 本ドキュメントの手順に従って、Raspberry
Pi から AWS IoT Greengrass コアソフトウェアをアンインストールしてください。
- 本ドキュメントの手順に従って、Raspberry
- Raspberry Pi のターミナルで以下のコマンドを実行します
まとめ
この投稿では、AWS IoT デバイスシャドウサービスと AWS IoT Greengrass を使用して、デバイスの状態をローカルまたはリモートで管理するための堅牢なソリューションを構築する方法を学びました。ビジネスロジックに集中し、これらの2つの AWS サービスにデバイス状態の管理を任せることができます。 現在、これらの2つのカスタムコンポーネントは、デバイス内でローカルに作成およびデプロイされています。次のステップは、それらを AWS IoT Greengrass で利用できるようにすることでしょう。そうすることで、それらをより多くのデバイスにデプロイできます。 そのためには、AWS IoT Greengrass のドキュメントのステップ5とステップ6に従えばよいでしょう。
著者について
この記事は Feng Luによって書かれた Manage IoT device state anywhere using AWS IoT Device Shadow service and AWS IoT Greengrass の日本語訳です。Solutions Architect の 原田裕平 が翻訳しました。