IoT センサーデータを AWS IoT Core 経由で SiteWise に送ってみた

センサーデータの可視化が捗りまくりです。IoT Core 経由でも簡単に SiteWise へデータ送信可能です。
2022.04.06

AWS IoT SiteWise では API や SiteWise ゲートウェイの他に、IoT Core 経由でデータを書き込む事もできます。今回はその方法を紹介したいと思います。

構成

構成は単純です。IoT Core で受け取ったデータを 専用のルールアクションを使って SiteWise に転送します。

00-sitewise-monitor-mqtt

作業の流れ

  • クライアントプログラムの作成
  • IAM 権限の設定
  • IoT Core の設定
    • ルールの作成
  • SiteWise の設定
    • アセットモデル、アセットの作成
    • アセットプロパティとデータストリームの関連付け

クライアントプログラムの作成

今回も擬似デバイス用のプログラムを用意します。疑似デバイスが送るデータの内容は下記のとおりです。

  • 温度
    • プロパティエイリアス:/MyDevice/1/Temperature
  • 湿度
    • プロパティエイリアス:/MyDevice/1/Humidity

コードは下記になります。( sitewise-send-data-http.py というファイル名で保存)
19 行目の endpoint_url はご利用の環境のものに修正して下さい。

sitewise-send-data-http.py

import boto3
import json
import logging
import random
import sys
import time
import uuid
import math

logger = logging.getLogger()
logger.setLevel(logging.INFO)
streamHandler = logging.StreamHandler(stream=sys.stdout)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
streamHandler.setFormatter(formatter)
logger.addHandler(streamHandler)

client = boto3.client('iot-data', endpoint_url='https://xxxxxx-ats.iot.ap-northeast-1.amazonaws.com')
topic = 'sitewise/ingest'

def mqtt_pub_asset():
    start = time.time()

    while True:
        timestamp_float, timestamp_int = math.modf(time.time())
        MeasureValueTemp = random.uniform(20, 50)
        MeasureValueHumi = random.uniform(40, 80)
        logger.info("temperature: {}".format(MeasureValueTemp))
        logger.info("humidity: {}".format(MeasureValueHumi))

        try:
            entries=[
                {
                    'entryId': '{}'.format(uuid.uuid4()),
                    'propertyAlias': '/MyDevice/1/Temperature',
                    'value': MeasureValueTemp,
                    'timeInSeconds': int(timestamp_int),
                    'offsetInNanos': int(round((timestamp_float * 1000000000), 0)),
                    'quality': 'GOOD'
                },
                {
                    'entryId': '{}'.format(uuid.uuid4()),
                    'propertyAlias': '/MyDevice/1/Humidity',
                    'value': MeasureValueHumi,
                    'timeInSeconds': int(timestamp_int),
                    'offsetInNanos': int(round((timestamp_float * 1000000000), 0)),
                    'quality': 'GOOD'
                }
            ]

            for e in entries:
                response = client.publish(
                    topic=topic,
                    qos=0,
                    payload=json.dumps(e)
                )
                logger.info("response: {}\n".format(json.dumps(response, indent=2)))
        except Exception as e:
            logger.error("{}".format(e))
            logger.error("temperture: {} humidity: {}".format(MeasureValueTemp, MeasureValueHumi))


        time.sleep(5)

try:
    mqtt_pub_asset()
except KeyboardInterrupt:
    print('\nstopped putting value.')

コードにあるとおり、IoT Core へパブリッシュされるデータは下記のような内容になります。

{
  "entryId": "99efc234-117c-4b0b-b04b-1a726b94c1bb",
  "propertyAlias": "/MyDevice/1/Humidity",
  "value": 75.03000095999147,
  "timeInSeconds": 1649183630,
  "offsetInNanos": 883272886,
  "quality": "GOOD"
}

IAM 権限の設定

次に IoT Coreのルールで利用する IAM Role を下記の通り作成します。
権限は緩いので本番で利用する場合はさらに権限を絞るようにして下さい。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iotsitewise:BatchPutAssetPropertyValue",
            "Resource": "*"
        }
    ]
}

14-iam-role-policy

信頼関係は次のとおりです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "iot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

15-trust-relation

IoT Core の設定

次に IoT Core で受け取ったデータを SiteWise に転送するルールを作成します。

01-iot-core-rules

適当なルール名をつけて下記のようなクエリをセットします。

SELECT entryId, propertyAlias, value, timeInSeconds, offsetInNanos, quality
FROM 'sitewise/ingest'

02-name-and-query

次に「アクションの追加」をクリックします。

03-set-action

アクションの一覧から「AWS IoT SiteWise」を選択します。

04-sitewise-rule

「アクションの設定」画面では下記の通り設定します。
propertyAliastimeInSeconds などいずれも IoT Core にパブリッシュされるデータ項目に存在するので、それらをマッピングする形で設定します。

05-config-action

最後に先程作成した IAM Role (test-mqtt-sitewise-rule)を選択して「アクションの追加」をクリックして完了です。

06-select-role-and-add-action

SiteWise の設定

次に SiteWise 側でアセットモデルとアセットを作成します。

07-make-asset-model

適当なモデル名をつけて下さい。
「測定の定義」には送られてくるデータに合わせて humiditytemperature の 2 つをダブル型で定義します。

08-model-detail

次にアセットを作成します。

09-make-asset

先程作成したモデル mqtt-publish-test を指定して作成します。 名前は適当なものを付けて下さい。今回は mqtt-device-1 としました。

10-make-new-asett

アセットプロパティとデータストリームの関連付け

ここまで設定できたら先程のスクリプトを実行して、IoT Core へのデータ送信を開始します。

$ python sitewise-send-data-http.py

なお、スクリプトを実行する環境(パソコンや EC2 など)では必要な権限を追加して実行して下さい。今回は AWS 管理ポリシーである AWSIoTDataAccess を利用しました。

16-iam-data-put

データが正常に IoT Core 経由で SiteWise に届いていれば、下記のように SiteWise のデータストリームにエイリアスが出現しているはずなので、データストリームエイリアスとアセットプロパティの関連付けを行います。

11-list-data-stream-alias

前回と同じ要領でデータストリームエイリアスとアセットプロパティの関連付けを行います。

12-assign-alias

ここまでの作業が正常に完了していれば、アセット mqtt-device-1 の画面でデータが届いていることが確認できると思います。

13-latest-data

SiteWise までデータが届けば SiteWise Monitor でのデータの可視化は同じ手順で実現可能です。
具体的な手順については下記を参考にして下さい。

最後に

AWS IoT Core 経由でデータを送ってみましたが「IoT Coreのルールアクションの設定」が今回のポイントになります。その他の部分はこれまで紹介した SiteWise の記事の内容とほとんど変わりません。

(ちなみにコードを見ていただければ分かりますが、今回は 横着をしてデバイス証明書を使わずにデータを送っています。デバイス証明書を使って MQTT で送る場合でも手順は同じになります。)

さて、これまでに 3 つの方法で SiteWise にデータ書込みを行いましたが、製造業データでも一般的なセンサーデータでも SiteWise を利用して簡単に可視化できることが分かりました。

  • SiteWise ゲートウェイ経由で OPC UAプロトコルでデータ書き込み
  • SiteWise API でデータ書込み
  • IoT Core 経由でデータ書込み

これからガンガン活用していきたいと思います。

参考