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 のジョイスティックを上に押して数値を増やす(または下に押して減らす)ことができます。

家庭用ラジエーターをシミュレートするRaspberry Pi

図1. Raspberry Pi – 家庭用ラジエーターのシミュレーション

アーキテクチャの概要
図2. アーキテクチャの概要

このブログ投稿に従うことで、デバイスの状態をどこからでも管理するための IoT ソリューションの構築とテストをすぐに開始できます。

前提条件

このブログ記事を通して進めるには、次のものが必要です:

ハードウェア:

ソフトウェア:

ウォークスルー

ステップ1: Raspberry Pi に AWS IoT Greengrass コアソフトウェアをインストールおよび構成します。

Raspberry Pi を AWS IoT Greengrass コアデバイスとして設定するには、AWS IoT Greengrass のスタートガイドのステップ1からステップ3に従ってください。私は次の構成でデバイスを作成しました:

  • コアデバイス名: PiWithSenseHat
  • モノのグループ: RaspberryPiGroup

これでこのデバイスをあなたの AWS コンソール上で確認できるはずです。


AWS IoT Greengrass コアデバイスがコンソールに表示されています

図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 コアデバイスとそのコンポーネントに関する情報を表示するローカルダッシュボードを提供します。

手順:

  1. AWS IoT Greengrass コンソール に移動してください
  2. Greengrass デバイスデプロイ に移動し、新しいデプロイメントを作成してください
  3. デプロイターゲットは、モノのグループ RaspberryPiGroup または コアデバイスのいずれかにできます
  4. パブリックコンポーネント からこれら3つのコンポーネントを選択してください

Select the prebuilt components
図4. プリビルドコンポーネントの選択

  1. aws.greengrass.ShadowManagerコンポーネントの設定

コンポーネントの構成の手順で、aws.greengrass.ShadowManagerを選択し、コンポーネントを設定をクリックしてください。

aws.greengrass.ShadowManagerの設定
図5. aws.greengrass.ShadowManagerの設定

  1. aws.greengrass.ShadowManager のコンポーネントバージョンと構成  json を設定してください

aws.greengrass.ShadowManager の詳細を設定
図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 の詳細を確認してください。

  1. デプロイウィザードを完了してデプロイを終了してください。

ステップ2の最後に、Raspberry Pi は、 AWS IoT Greengrass コアソフトウェアとプリビルドコンポーネントを使用して、デバイスとクラウド間で名前付きシャドウ NumberLEDNamedShadow
を同期する準備ができています。

ステップ3: ローカル制御を備えたスマートホームラジエーターをシミュレートするための AWS IoT Greengrass コンポーネントを作成する

これで、ローカル制御を備えたスマートホームラジエータをシミュレートするための2つの AWS IoT Greengrass コンポーネントを作成します。 プロセス間通信(IPC)を利用して、コンポーネント間の内部通信を行うことができます。
カスタム AWS IoT Greengrass コンポーネントの構築方法に不案内な場合は、スタートガイド のステップ4を参照してください。
このブログでは、それらをローカルで作成およびテストします。

  1. コンポーネント example.sensehat.joystick: ジョイスティックからイベントをキャプチャし、IPCトピック
    “ipc/joystick”(レシピで変数として定義されています) にイベントをパブリッシュします
  2. コンポーネント 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 を介してジョイスティックイベントトピックをサブスクライブする
  • 受信したジョイスティックイベントに基づき、数値を増減させる
  • 定期的にシャドウをチェックする。シャドウドキュメントに新しい数値があれば、その数値でデバイスを更新する

com.example.sensehat.ledコンポーネントのワークフロー
図7.
com.example.sensehat.ledコンポーネントのワークフロー

デモ: アクションでデバイスの状態を管理する

これで Raspberry Pi はシミュレータとして使用する準備が整いました。

2種類のイベントに対応しています:

  • 新しいジョイスティックイベント: デバイスのローカル制御
  • 新しいクラウドシャドウドキュメント: デバイスのリモート制御

ローカルまたはリモートからデバイスを制御するロジック

図8: ローカルまたはリモートからデバイスを制御するロジック

デバイスシャドウを実際に動作させるには:

  1. AWS IoT Greengrass コンソール に移動してください
  2. モノ に移動し、PiWithSenseHat を選択してください
  3. Device Shadow で、 NumberLEDNamedShadow が見つかります。 このシャドウを手動で作成する必要はないことに注意してください。
    デバイスが最初にシャドウを報告したときに、不足している場合は作成します。


AWSコンソールでデバイスシャドウを見つける

図9. AWS コンソールでデバイスシャドウを見つける

デモ1: ジョイスティックを使用してローカルでデバイスを更新する

  1. ジョイスティックを使用して、ローカルの数字を増減させます(初期数値は6でした。最初に0まで減らし、次に2まで増やしました)。
  2. リアルタイムで AWS コンソール内のデバイスシャドウドキュメントが更新されるのを観察します。 変更はリアルタイムでクラウドシャドウに同期されます。
    • status は “device updated by local” に変更される
    • number はローカルからの新しい値に変更される

ジョイスティックを使用して数値を更新
図10: ジョイスティックを使用して数値を更新し、リアルタイムでクラウドに新しい値を報告

デモ2: クラウド上のデバイスシャドウドキュメントを更新することによるリモートからのデバイスの更新

  1. このデモの初めではデバイスの LED は 0 を表示しており、デバイスシャドウドキュメントは次のとおりでした。
    
      {
        "state": {
          "desired": {
            "number": 0
          },
          "reported": {
            "status": "device is updated by local",
            "number": 0
          }
        }
      }
      
  2. AWS IoT Core コンソールのシャドウドキュメントを次の JSON
    編集し(「reported」セクションは省略可)、更新をクリックしてください。

    
      {
        "state": {
          "desired": {
            "number": 9
          }
        }
      }
      
  1. 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 コアソフトウェアをアンインストールしてください。

まとめ

この投稿では、AWS IoT デバイスシャドウサービスと AWS IoT Greengrass を使用して、デバイスの状態をローカルまたはリモートで管理するための堅牢なソリューションを構築する方法を学びました。ビジネスロジックに集中し、これらの2つの AWS サービスにデバイス状態の管理を任せることができます。 現在、これらの2つのカスタムコンポーネントは、デバイス内でローカルに作成およびデプロイされています。次のステップは、それらを AWS IoT Greengrass で利用できるようにすることでしょう。そうすることで、それらをより多くのデバイスにデプロイできます。 そのためには、AWS IoT Greengrass のドキュメントのステップ5とステップ6に従えばよいでしょう。

著者について

Feng Lu

Feng Luは、18年の専門経験を持つAWSのシニアソリューションアーキテクトです。組織のビジネス上の問題に対処するスケーラブルでフレキシブルかつレジリエントなアーキテクチャを策定するのを支援することに情熱を注いでいます。現在の焦点は、IoTテクノロジーを使って物理世界とクラウドを接続し、コンピューティングおよびAIのケイパビリティを結集して、私たちの物理的環境をよりスマートで良いものにすることです。

この記事は Feng Luによって書かれた Manage IoT device state anywhere using AWS IoT Device Shadow service and AWS IoT Greengrass の日本語訳です。Solutions Architect の 原田裕平 が翻訳しました。