Amazon Web Services ブログ

IoT デバイスのデジタルツインを構築し、AWS IoT TwinMaker を使用してリアルタイムのセンサーデータを監視する (パート 1/2)

このブログは、Angelo Postiglione によって書かれた、Build a digital twin of your IoT device and monitor real-time sensor data using AWS IoT TwinMaker (Part 1 of 2)  を翻訳したものです。

イントロダクション

デジタルツインは、物理システムの生きたデジタル表現であり、物理システムの構造、状態、および動作を模倣してビジネスの成果を推進するために動的に更新されます。通常、これを構築するのは簡単なことではありません。この課題を解決するために、AWS IoT TwinMaker という新しいサービスを開始しました。AWS IoT TwinMaker は、機器センサー、ビデオ フィード、ビジネスアプリケーションなどのさまざまなソースからのデータを接続し、ナレッジグラフを作成して現実世界のシステムをモデル化し、デジタルツインからリアルタイムの洞察を生成します。

一部のお客様は、AWS IoT TwinMaker を使用して、機器とプロセスの異常を迅速に特定して対処することでメンテナンス スケジュールを最適化したり、フィールドワーカーにすべてのアセットと運用データの統合ビューを提供したりしています。もう 1 つの一般的なユースケースは、室内の温度、占有率、または空気の質に関するライブデータと履歴データを監視することにより、ユーザーエクスペリエンスを強化し、建物内の居住者の快適性を向上させることです。

この一連のブログ記事では、センサーの位置と状態を制御しながら部屋の温度と湿度をリアルタイムで監視するという最後のシナリオについて説明します。このシナリオをシミュレートするために、AWS IoT TwinMaker を使用して、温度と湿度のデータを収集するセンサーに接続された Raspberry Pi デバイスのデジタルツインを作成する方法を学習します。Amazon Managed Grafana ダッシュボードと統合して、デジタルツインが存在する 3D 環境を、デバイスのステータスと 3D モデル表現にリアルタイムで影響を与える収集データとともに視覚化します。

パート 1 (このブログ) では、ソリューションの概要、データをホストする時系列データベースのセットアップ、および IoT Thing の構成について説明します。また、Raspberry Pi デバイスへのセンサーの配線についても説明します。

パート 2 では、データの視覚化に使用される Amazon Managed Grafana ダッシュボードのセットアップを続けます。時系列データベースからデータを読み取る AWS Lambda 関数を作成します。最も重要なことは、AWS IoT TwinMaker をセットアップし、それを Amazon Managed Grafana ダッシュボードと統合して、収集するリアルタイムデータとともにデジタルツインを表示します。

ソリューションの概要

以下の図は、アーキテクチャの概要を示しています。Raspberry Pi デバイスに取り付けられたセンサーから生成されたデータは、Python スクリプトを介して AWS IoT Core に送信されます。AWS IoT Core は、MQTT および HTTPS プロトコルを介してデバイスを簡単かつ安全に接続します。ここから、AWS IoT Core ルールを使用して、データが Amazon Timestream データベースにストリーミングされます。AWS IoT TwinMaker 側では、仮想エンティティがその 3D モデル表現とともに定義されるワークスペース環境を作成します。Lambda 関数を使用して Amazon Timestream からデータを読み取るコンポーネントも作成し、デジタルツインはセンサーから到着するデータと同期するようにします。視覚化の部分では、AWS IoT TwinMaker Grafana ダッシュボード統合を活用して、3D モデルとともにデータを表示するダッシュボードを作成します。ダッシュボードは、AWS IAM Identity Center (AWS SSO の後継) を介して SSO でアクセスできます。最後に、AWS IoT TwinMaker ルールを作成して、温度または湿度が定義されたしきい値を下回ったり上回ったりするたびに、ダッシュボードで変化を簡単に確認できるようにします。


Architecture of our solution
図 1: ソリューションのアーキテクチャの概要

前提条件

  • AWS アカウント
  • Raspberry Pi 4 Model B(OSプリインスール済みのSDカードと電源ケーブルも準備ください)
  • DHTセンサー(または同様のもの、温度/湿度データを取得するため)
  • オス-オス (M2M) のジャンパー線と抵抗を備えたブレッドボード。私のように拡張ボードを使用しない場合は、メス-メス (F2F) のジャンパー線も必要です (セクション 3 – Raspberry Pi のセットアップの注を参照)

実装

以下は、このブログシリーズで実行するマクロステップです:

(Part1)

  1. 温度と湿度のデータを保存する時系列データベース Amazon Timestream のセットアップ
  2. 証明書による AWS IoT Thing とルールをセットアップし、収集したデータがデータベースに送信できることを確認する
  3. Raspberry Pi デバイスの構成: センサーの配線と AWS にデータを送信するための Python ファイルの作成

(Part2)

  1. データの視覚化に使用される Amazon Managed Grafana ダッシュボードの設定
  2. Timestream からデータを読み取る AWS Lambda 関数の作成
  3. AWS IoT TwinMaker ロール、ポリシー、バケット送信先、およびワークスペースのセットアップ。データベースから読み取るテレメトリコンポーネントの定義。3D モデルのインポートとシーンの定義
  4. AWS IoT TwinMaker プラグインを使用した Amazon Managed Grafana でのダッシュボードの作成

重要: 使用されているサービスの一部は、まだすべての AWS リージョンで利用できるわけではありません。すべてのリソースを us-east-1 または eu-west-1 に作成してください (US リージョンとヨーロッパリージョンのどちらを使用するかによって異なります)。

1. Amazon Timestream データベースのセットアップ

温度と湿度のデータ用にデータベースを構成することから始めましょう。ユースケースは明らかに時系列データの収集に関連しているため、この場合の適切な「ツール」は Amazon Timestream です。

データベースを作成するには:

  1. AWS マネジメントコンソールで Timestream を選択します。
  2. Create database を選択します。
  3. 次の情報を入力します:
    • Configuration: Standard database
    • Name: TempHumidityDatabase
  4. Create database を選択して確認します。


図 2: Timestream データベースの作成

次に、テーブルを作成します。

  1. Tables タブを選択し、Create table を選択します。
  2. 次の値を設定します:
    • Database name: TempHumidityDatabase
    • Table name: TempHumidity
    • Data retention:
      • Memory: 1 Day
      • Magnetic: 1 Month(s)
  3. Create table

これで、データベースはデータを受け取る準備ができました。

2. Raspberry Pi を AWS IoT Core へ接続

このセクションでは、ポリシーと証明書を作成し、デバイスを「モノ」として登録することで、Raspberry Pi デバイスと AWS IoT Core 間の「接続」を準備します。次に、データを Amazon Timestream データベースに送信し、潜在的なエラーを Amazon CloudWatch のログにルーティングするルールを定義します。

ポリシーを作成する

AWS IoT Core ポリシーは JSON ドキュメントであり、AWS Identity and Access Management (IAM) ポリシーと同じ規則に従います。AWS IoT Core ポリシーを使用すると、AWS IoT Core データプレーンへのアクセスを制御できます。AWS IoT Core データプレーンは、AWS IoT Core メッセージブローカーへの接続、MQTT メッセージの送受信、AWS IoT モノのデバイスシャドウの受信または更新を可能にするオペレーションで構成されています。

ここで、特定の IoT トピック (raspberry/temphumid) の公開とサブスクリプションを許可するポリシーを作成します。このポリシーは、AWS IoT Thing で使用される証明書に付与されます。

  1. AWS アカウントの AWS マネジメントコンソールを開きます。
  2. AWS IoT Core サービスに移動し、左側のメニューから Manage > Security > Policies セクションを選択します。
  3. Create Policy を選択します。
  4. 次の値を入力します:
    • Policy properties → Policy name: TempHumidityPolicy
    • Policy statements → Policy document → select JSON
  5. AWS リージョンと AWS アカウントを置き換えて、次の JSON を貼り付けます。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:[AWS_REGION]:[AWS_ACCOUNT]:topic/raspberry/temphumid"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "arn:aws:iot:[AWS_REGION]:[AWS_ACCOUNT]:topicfilter/raspberry/temphumid"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "*"
    }
  ]
}
  1. Create を選択します。

AWS IoT Thing を作成して証明書を生成する

  1. コンソールで、AWS IoT Core を選択します。
  2. 左側の Manage > All devices > Things セクションから、Create Things を選択します。
  3. Create a single thing を選択します。
  4. モノの名前 (例: RaspberryPi) を入力し、Device Shadow セクションを No Shadow のままにします。 Next を選択します。
  5. Configure Device Certificate で、Auto-generate a new certificate (recommended) を選択し、Next を選択します。
  6. Policies で、前に作成したポリシー (TempHumidityPolicy) を選択し、Create Thing を選択します
  7. デバイス証明書 (crt) を公開キーと秘密キー (pem.key) およびルート CA 1 証明書と共にローカルコンピューターのフォルダーにダウンロードします。証明書と秘密鍵は、後で Raspberry Pi デバイスで使用します。公開鍵や Amazon ルート CA 3 は必要ありません。
  8. ダウンロードが完了したら、Done を選択します。

Figure 3: An IoT Thing has been created to represent your Raspberry Pi
図 3: Raspberry Pi を表す IoT Thing の作成

データを Amazon Timestream に送信し、エラーを Amazon CloudWatch に送信するルールを作成する

  1. コンソールで AWS IoT Core を選択します。
  2. Manage > Message Routing > Rules セクションで、Create rule を選択し、次のように入力します:
    • Name: TempHumidityRule
    • Description: Rule to handle temperature and humidity message. Choose Next.
    • Rule query statement:
      SELECT * FROM 'raspberry/temphumid'
    • Next を選択します。
  3. Rule actions パネルで、Timestream table – Write a message into the Timestream table を選択します。 – Write a message into the Timestream table. 次に、前に作成した Timestream データベース TempHumidDatabase とテーブル TempHumidity を選択します。

Figure 4: The IoT Core rule to write data on Timestream
図 4: Amazon TimeStream にデータを書き込む IoT Core ルール

  1. dimension name を入力する必要があります (少なくとも 1 つが必要です)。ディメンション名 DeviceName とディメンション値 Rpi4 でディメンションを定義します。
  2. 次に、AWS IoT Core サービスがデータベースにアクセスできるように、IAM ロールを作成する必要があります。Create new role を選択し、次の名前を入力します: TempHumidityDBRole
  3. 「Error action」 パネルで、Add error action を選択します。CloudWatch logs – Send message data to CloudWatch logs を選択します。
  4. Create CloudWatch Log group を選択 – 新しいタブで CloudWatch にリダイレクトされます。TempHumidityRuleErrors という名前のロググループを作成します。左側のメニューの Logs > Logs group からロググループにアクセスできます。Expiration はデフォルトで never にしておくことができます。
  5. AWS IoT Core に戻り、Log group name リストを更新して、新しく作成したロググループを選択します。
  6. サービスが CloudWatch にアクセスできるようにする IAM ロールを作成します:Create new role を選択し、次の名前を入力します TempHumidityCloudwatchRole

Figure 5: The IoT Core error rule action will send errors to Amazon CloudWatch
図 5: IoT Core のエラールールアクションによる Amazon CloudWatch へのエラー送信

  1. Next を選択します。
  2. 入力を確認し、Create を選択してルールの作成を確認します。

これで、センサーから送信された温度と湿度のデータを Timestream データベースにルーティングする有効な IoT ルールが作成されました。エラーは Amazon CloudWatch logs に送信されます。

3. Raspberry Pi のセットアップ

データベースを定義し、Raspberry Pi を表す AWS IoT の準備ができたので、次はセンサーを Raspberry Pi に配線し、データを AWS IoT Core に送信します。

センサーの配線

この投稿では、DHT11 センサーを使用して、環境から温度と湿度のデータを収集します。DHT11 は、基本的な低コストのデジタル温度および湿度センサーです。静電容量式湿度センサーとサーミスタを使用して周囲の空気を測定し、データピンにデジタル信号を発生させます

: このブログは、ケースボックスキットに取り付けられた Raspberry Pi 4 Model B を使用して作成されました。このボックスキットは Raspberry Pi をきれいに梱包し、損傷を防ぎますが、必須ではありません。拡張ボードについても同じことが言えます。これにより、Raspberry Pi ピンを直接使用するよりも、ブレッドボードで作業する方が簡単になります。ワイヤをデバイスに直接接続する場合は必要ありません。

DHT11 センサーは、次の図に示すようにブレッドボードに接続されています。


Figure 6: Raspberry Pi wiring of the DHT11 sensor図 6: DHT11 センサーの Raspberry Pi 配線


Figure 7: Raspberry Pi with extension board and DHT11 sensor wired図 7: 拡張ボードと DHT11 センサーが配線された Raspberry Pi

Raspberry Pi から AWS IoT Core にデータを送信する

センサーを Raspberry Pi デバイスに正しく配線したので、温度と湿度のデータを AWS に送信してみます。まず、AWS IoT Thing を構成したときにダウンロードした Raspberry Pi 証明書をコピーして、Raspberry Pi が接続先と生成されたデータの送信先を認識できるようにする必要があります。Raspberry Pi に接続してファイルをコピーするには、いくつかのオプションがあります。SFTP を使用して、証明書を Raspberry Pi 安全なフォルダーに保存し、後でコードで参照できるようにすることができます。

証明書が整ったら、次のステップに進むことができます。DHT11 センサーからデータを収集するための以下の Python コードを含む Python ファイルを Raspberry Pi で作成します。このスクリプトはデータを収集し、AWS に送信します。

Raspberry Pi デバイスで、temphumid.py という名前のファイルを作成し、以下の Python コードを貼り付けます。

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import json
import time
import board
import adafruit_dht

# MQTT config (clientID must be unique within the AWS account)
clientID = "XXXX-XXXX-XXXXX-XXXXX"
endpoint = "XXXXXXXX.[AWS_REGION].amazonaws.com" #Use the endpoint from the settings page in the IoT console
port = 8883
topic = "raspberry/temphumid"

# Init MQTT client
mqttc = AWSIoTMQTTClient(clientID)
mqttc.configureEndpoint(endpoint,port)
mqttc.configureCredentials("certs/AmazonRootCA1.pem","certs/raspberry-private.pem.key","certs/raspberry-certificate.pem.crt")

# Send message to the iot topic
def send_data(message):
    mqttc.publish(topic, json.dumps(message), 0)
    print("Message Published")

# Loop until terminated
def loop():
     #Init the dht device with data pin connected
     dhtDevice = adafruit_dht.DHT11(board.D17)

     while(True):
          try:
               temperature = dhtDevice.temperature
               humidity = dhtDevice.humidity
               print("Temp: {:.1f} C    Humidity: {}% ".format(temperature, humidity)) 
               
               message = {
                         'temperature': temperature,
                         'humidity': humidity
                         }
                    
               # Send data to topic
               send_data(message)

               time.sleep(3)
          except RuntimeError as error:     # Errors happen fairly often, DHT's are hard to read, just keep going
               print(error.args[0])

# Main
if __name__ == '__main__':
    print("Starting program...")
    try:
        # Connect
        mqttc.connect()
        print("Connect OK!")

        # Main loop called
        loop()
    except KeyboardInterrupt:
        mqttc.disconnect()
        exit()

上記のコードを確認してみましょう:

  1. いくつかのライブラリ (time、json) と、DHT センサーに固有のライブラリ (この場合は Adafruit_DHT) をインポートしました。依存関係をインストールする必要があります (例: sudo pip3 install Adafruit_DHT)
  2. AWS アカウントに対して一意である必要がある MQTT クライアントの名前を設定して、Raspberry Pi を AWS IoT Core に接続しました。
  3. 証明書の提供元を定義しました。証明書がRaspberryデバイスにあることを確認してください。
  4. 次のループを作成しました:
    • 温度と湿度のデータを読み取ります。
    • 温度と湿度で構成されたメッセージを作成します。
    • MQTT トピックにデータを送信します。

お気づきかもしれませんが、一意の clientID (一意の文字列を選択できます) と最も重要な IoT endpointを含めるようにコードを調整する必要があります。 これを見つけるには、コンソールで AWS IoT Core を選択し、Settings > Device data endpoint に移動します。ページに表示されるエンドポイント URL をコピーして、Python スクリプトに貼り付けます。

上記の手順に従って temphumid.py ファイルを作成したら、忘れずに保存してから実行してください。すべてが正しく設定されている場合、次のようなメッセージが表示されます:


図 8: temp Humid.py python スクリプトの出力例

AWS IoT Core に送信されたデータが Amazon Timestream データベースに正しくルーティングされていることを確認するには、コンソールで Amazon Timestream を開き、TempHumidity テーブルにデータが含まれていることを確認します。Amazon Timestream の query editor に移動して、テーブル名の近くにある 3 つのドットを選択し、Preview Data を選択してデータのプレビューを表示できます。デフォルトでは、過去 15 分間のデータが取得されます。


Figure 9: Preview data in Amazon Timestream
図 9: Amazon Timestream でのデータのプレビュー


Figure 10: Humidity and temperature sent to Amazon Timestream via AWS IoT Core
図 10: AWS IoT Core 経由で Amazon Timestream に送信された湿度と温度

データがない場合は、以前に作成した CloudWatch ロググループにあるエラーログを参照してください。

とりあえず、Python スクリプトを停止しておきます。後でもう一度実行します。

まとめ

このシリーズのパート 1 では、デバイスのデジタルツインを作成するための基礎を築きました。Amazon Timestream データベースのセットアップを完了し、証明書とルールを使用して AWS IoT Thing を作成し、デバイスによって収集された温度と湿度のデータがデータベースに送信されるようにしました。また、センサーを配線し、Python スクリプトを使用してデータを AWS に送信することで、Raspberry デバイスを構成しました。

パート 2 では、データの視覚化に使用される Amazon Managed Grafana ダッシュボードのセットアップを続けます。Timestream データベースからデータを読み取る AWS Lambda 関数を作成します。最も重要なこととして、AWS IoT TwinMaker をセットアップし、Amazon Managed Grafana ダッシュボードと統合することで、デジタルツインの 3D モデルを、収集するリアルタイムデータと一緒に表示します。


About the author

Angelo Postiglione は、AWS のソリューションアーキテクトです。彼はイタリアのヘルスケアの顧客やパートナーと協力して、AWS を使用してスケーラブルで安全なソリューションを構築するためにクラウド技術を採用するのを支援しています。余暇には、世界の新しい場所を発見したり、自然の中で長い散歩をしたり、ギターやドラムを演奏したりするのが好きです。

このブログは、ソリューションアーキテクトの戸塚智哉が翻訳しました。