Amazon Web Services ブログ

AWS IoT SiteWiseを使用した大規模な産業データの収集、整理、監視、分析(パート3)

こちらはAWS Professional Service の IoT Global Specialty Practice に所属するシニアデータアーキテクト Asim Kumar Sasmal、IoT SiteWiseのシニアプロダクトマネージャーSaras Kaulによる投稿になります。

[この投稿を読む前に、シリーズのパート1パート2を読んでください。]

このシリーズのパート1で、AWS IoT SiteWiseを使用して、安全で費用対効果の高い信頼できる方法で産業アセットをモデル化し、産業現場からデータを取り込む方法を学びました。

このシリーズのパート2では、AWS IoT SiteWiseの新機能であるSiteWise Monitorを使用して、アセットの主要な測定値とメトリクスを監視し、必要に応じてニアリアルタイムで必要なアクションを実行する方法を学習しました。

パート3(この投稿)では、次の方法を学習します。

  • モデル化された機器データをAWS IoT SiteWiseからリアルタイムでストリーミングして、AWS IoT Coreのルールエンジンを介してカスタムアプリケーションで使用する
  • 状態のモニタリングを有効にし、AWS IoT Eventsを使用してニアリアルタイムで通知またはアラートを送信する
  • Amazon QuickSightを使用してヒストリカルデータに関するビジネスインテリジェンス(BI)レポートを有効にする

AWS IoT SiteWiseは現在プレビュー中です。プレビュー中は、AWS IoT SiteWiseの使用に対して料金は発生せず、サービスは変更される可能性があります。

AWS IoT Events について

AWS IoT EventsはIoTセンサーやアプリケーションからのイベントを簡単に検出して応答できるフルマネージドサービスです。これにより、機器またはデバイスのフリートを監視して、運用上の障害や変更を監視できます。また、このようなイベントが発生したときにアクションをトリガーできます。詳細については、AW​​S IoT Eventsコンソールの使用開始を参照してください。

Amazon QuickSight について

Amazon QuickSightは、以下のことに使用できる高速なビジネス分析サービスです。

  • 可視化の構築
  • アドホック分析の実行
  • セルフサービス方式でデータからビジネスの洞察をすばやく取得

フルマネージドにホストされるサービスであり、管理するクライアント-サーバはありません。Amazon QuickSightを使用すると、ビルトインのML Insightsを含むインタラクティブなダッシュボードを簡単に作成および公開できます。任意のデバイスからダッシュボードにアクセスし、カスタムアプリケーション、ポータル、およびWebサイトに埋め込みます。Pay-Per-Sessionの価格設定により、Amazon QuickSightを使用すると、必要なデータにすべてのユーザーがアクセスできるようになり、使用した分のみに料金を支払うことができます。

ソリューションの概要

AWS IoT SiteWiseは、MQTT publish-subscribe メッセージブローカーを介してAWS IoTにアセットデータをpublishできるため、他のAWSサービスに対しアセットデータをやり取りできます。AWS IoT Coreルールエンジンを使用すると、条件付きでデータを他のサービスにルーティングできます。この投稿では、AWS IoT SiteWiseモデルデータをAWS IoT Analyticsチャネルに取り込み、AWS IoT Analyticsデータストアからのクエリ用にJSONメッセージをわずかに変換します(主にそれらをフラット化します)。次に、2つのAWS IoT Analyticsデータセットをセットアップします。1つのデータセットは、機器の主要な集約メトリクスの状態監視用のAWS IoT Events 探知器モデルにフィードし、もう1つのデータセットはAmazon QuickSightを使用したBIレポート用です。

次の図は、この複数パートに及ぶ投稿で説明されているハイレベルのエンドツーエンドソリューションを示し、関連するAWSサービスを示しています。

ウェークスルー

このチュートリアルには6つのセクションがあります。

  • AWS IoT Analyticsチャネル、パイプライン、およびデータストアのセットアップ
  • SiteWiseモデルデータをAWS IoT Analyticsに取り込むためのAWS IoT Coreルールのセットアップ
  • 状態監視用のAWS IoT Events 探知器モデルのセットアップ
  • AWS IoT Events 探知器モデルへのAWS IoT Analyticsデータセットコンテンツ配信のセットアップ
  • Amazon QuickSightで可視化するためのAWS IoT Analyticsデータセットのセットアップ
  • Amazon QuickSightでAWS IoT Analyticsデータセットを可視化する

前提条件

  • パート1の前提条件を使用します。
  • メール通知を受信するためのiote_send_email_sns_topicという名前のAmazon SNSトピックを用意します。後で使用するため、SNSトピックARNをメモします。
  • iotevents.amazonaws.comiotanalytics.amazonaws.com、およびiot.amazonaws.comの信頼関係を持つiote_equip_temp_roleという名前のIAMロールを用意します。ロールには、SNSトピックに関する次のアクセス許可を持つIAMポリシーもあります。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "sns:Publish",
                "Resource": "arn:aws:sns:us-west-2:<AWS-Account-ID>:iote_send_email_sns_topic"
            }
        ]
    }

AWS IoT Analyticsチャネル、パイプライン、およびデータストアのセットアップ

以下は、AWS IoT Analyticsチャネル、パイプライン、およびデータストアをセットアップする手順です。

  1. AWS IoT Analyticsで次のアクセス許可を持つsitewise_blogpost_iotaという名前のIAMポリシーを作成し、既存のIAMロールiote_equip_temp_roleにアタッチします:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "iotanalytics:BatchPutMessage",
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
  2. 次のPython 3.7コードを使用して、sitewise_blogpost_transform_functionという名前のAWS Lambda関数を作成します。
    import json
    import logging
    import sys
    import time
    
    # Configure logging
    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)
    
    def lambda_handler(event, context):
        logger.info("event: {}".format(event))
        print(json.dumps(event, indent=2))
        transformed = []
        
        for e in event:
            logger.info("e: {}".format(json.dumps(e, indent=2)))
            swtype=e['type']
            asset_id = e['payload']['assetId']
            property_id = e['payload']['propertyId']
            logger.info("type: {} asset_id: {} property_id: {}".format(swtype, asset_id, property_id))
            row = {"type": swtype, "asset_id": asset_id, "property_id": property_id}
            for v in e['payload']['values']:
                logger.info("v: {}".format(v))
                    
                time_in_seconds = int(time.time())
                if 'timestamp' in v and 'timeInSeconds' in v['timestamp']:
                    logger.debug("timeInSeconds in payload")
                    time_in_seconds = v['timestamp']['timeInSeconds']
                    
                value = ""
                if 'doubleValue' in v['value']:
                    logger.debug("doubleValue in payload")
                    value = v['value']['doubleValue']
                    valuetype= "double" 
                if 'integerValue' in v['value']:
                    logger.debug("integerValue in payload")
                    value = v['value']['integerValue']
                    valuetype= "integer" 
                if 'booleanValue' in v['value']:
                    logger.debug("booleanValue in payload")
                    value = v['value']['booleanValue']
                    valuetype= "boolean" 
                if 'stringValue' in v['value']:
                    logger.debug("stringValue in payload")
                    value = v['value']['stringValue']
                    valuetype= "string" 
                    
                quality = ""
                if 'quality' in v:
                    logger.debug("quality in payload")
                    quality = v['quality']
                    
                row['timestamp'] = time_in_seconds
                row['quality'] = quality
                row['value'] = value
                row['valuetype'] = valuetype
                logger.debug("row: {}".format(row))
                transformed.append(row)
                    
        logger.info("transformed: {}\n".format(json.dumps(transformed, indent=2)))
    
        return transformed
  3. 次のAWS CLIコマンドを使用して、AWS IoT Analyticsサービスに上記のLambda関数を実行するアクセス許可を必ず付与してください。
    aws lambda add-permission --function-name 'sitewise_blogpost_transform_function' --region 'us-west-2' --statement-id 1234 --principal iotanalytics.amazonaws.com --action lambda:InvokeFunction --profile default
  4. ストレージタイプとしてサービスマネージド型Amazon S3バケットを使用して、sitewise_blogpost_channelという名前のAWS IoT Analyticsチャネルを作成します(デフォルト)。独自のAmazon S3バケットをストレージタイプとして選択することもできます。
    aws iotanalytics create-channel --cli-input-json file://mychannel.json --region 'us-west-2' --profile default

    ファイルmychannel.jsonには次のコードが含まれています。

    {
        "channelName": "sitewise_blogpost_channel"
    }

    サンプル実行出力:

    {
        "channelArn": "arn:aws:iotanalytics:us-west-2:<AWS-Account-ID>:channel/sitewise_blogpost_channel", 
        "channelName": "sitewise_blogpost_channel", 
        "retentionPeriod": {
            "unlimited": true
        }
    }
  5. サービスマネージド型 Amazon S3バケットをストレージタイプとして使用して、sitewise_blogpost_datastoreという名前のAWS IoT Analyticsデータストアを作成します(デフォルト)。独自のAmazon S3バケットをストレージタイプとして選択することもできます。
    aws iotanalytics create-datastore --cli-input-json file://mydatastore.json --region 'us-west-2' --profile default

    ファイルmydatastore.jsonには次のコードが含まれています。

    {
        "datastoreName": "sitewise_blogpost_datastore"
    }

    サンプル実行出力:

    {
        "datastoreName": "sitewise_blogpost_datastore", 
        "datastoreArn": "arn:aws:iotanalytics:us-west-2:<AWS-Account-ID>:datastore/sitewise_blogpost_datastore", 
        "retentionPeriod": {
            "unlimited": true
        }
    }
  6. パイプラインの入力をsitewise_blogpost_channel、出力をsitewise_blogpost_datastoreとする sitewise_blogpost_pipeline という名前のAWS IoT Analytics パイプラインを作成します。
    aws iotanalytics create-pipeline --cli-input-json file://mypipeline.json --region 'us-west-2' --profile default

    ファイルmypipeline.jsonには次のコードが含まれています。

    {
        "pipelineName": "sitewise_blogpost_pipeline",
        "pipelineActivities": [
            {
                "channel": {
                    "name": "mychannelactivity",
                    "channelName": "sitewise_blogpost_channel",
                    "next": "mylambdaactivity"
                }
            },
            {"lambda": {
                    "name": "mylambdaactivity",
                    "lambdaName": "sitewise_blogpost_transform_function",
                    "batchSize": 10,
                    "next": "mydatastoreactivity"
                }
            },
            {
                "datastore": {
                    "name": "mydatastoreactivity",
                    "datastoreName": "sitewise_blogpost_datastore"
                }
            }
        ]
    }

    サンプル実行出力:

    {
        "pipelineArn": "arn:aws:iotanalytics:us-west-2:<AWS-Account-ID>:pipeline/sitewise_blogpost_pipeline", 
        "pipelineName": "sitewise_blogpost_pipeline"
    }

    Lambda呼び出しのバッチサイズは10に設定されていることに注意してください。これは、SLAレイテンシ要件とストリーミングデータの速度に基づいて最大1000まで増やすことができます。

SiteWiseモデルデータをAWS IoT Analyticsに取り込むためのAWS IoT Coreルールのセットアップ

前に作成したチャネルにメッセージを送信するAWS IoT Analyticsルールを作成します。

IAMロールARNをiote_equip_temp_role ARNに置き換えます。

aws iot create-topic-rule --rule-name sitewise_blogpost_rule_for_iota --topic-rule-payload file://rule.json --region 'us-west-2' --profile default

ファイルrule.jsonには次のコードが含まれています。

{
     "sql": "SELECT * FROM '$aws/sitewise/asset-models/+/assets/+/properties/+'",
     "ruleDisabled": false,
     "awsIotSqlVersion": "2016-03-23",
     "actions": [
         {
             "iotAnalytics": {
                 "channelName": "sitewise_blogpost_channel",
                 "roleArn": "arn:aws:iam::<AWS-ACCOUNT-ID>:role/iote_equip_temp_role"
             }
         }
     ]
 }

ルールの作成後、AWS IoT Analyticsに移動し、以下のようにsitewise_blogpost_datastoreから10個のレコードのサンプルを選択してテストデータセットを作成し、AWS IoT Analytics データセットSQLクエリを使用してクエリが処理され、利用できることを確認します。

状態監視のためのAWS IoT Events 探知器モデルのセットアップ

ここで、3つの風力タービンのすべてのユニット2 PLCの過去5分間のEquipment Temperature の平均を監視するために、iote_equip_temp_detector_modelという名前のAWS IoT Events 探知器モデルを作成します。

探知器モデルには、GoodおよびCriticalという2つの状態があります。Equipment Temperatureの平均が70ºF(製造元の仕様)のしきい値を3回連続で超える場合があります。その場合、対応する風力タービンのユニット2 PLCの探知器モデルインスタンスは、状態をGoodからCriticalに切り替えます。

同様に、探知器モデルインスタンスは、Equipment Temperatureの平均が70ºFを3回連続で下回ったときに、状態をクリティカルから良好に切り替えます。各状態遷移は、Amazon SNSを介して運用チームにEメール通知を送信し、必要なアクションを実行します。

次の手順を使用して、探知器モデルを作成します。

  1. iote_equip_tempという名前のAWS IoT Events入力を作成します。
    aws iotevents create-input --cli-input-json file://iote_equip_temp_input.json --region 'us-west-2' --profile default

    ファイルiote_equip_temp_input.jsonには次のコードが含まれています。

    {
        "inputName": "iote_equip_temp",
        "inputDescription": "IoT Events Equipment Temperature Monitoring",
        "inputDefinition": {
            "attributes": [
                {
                    "jsonPath": "name"
                },
                {
                    "jsonPath": "avg_value"
                }
            ]
        }
    }

    サンプル実行出力:

    {
        "inputConfiguration": {
            "status": "ACTIVE", 
            "inputArn": "arn:aws:iotevents:us-west-2:<AWS-ACCOUNT-ID>:input/iote_equip_temp", 
            "lastUpdateTime": 1574882105.027, 
            "creationTime": 1574882105.027, 
            "inputName": "iote_equip_temp", 
            "inputDescription": "IoT Events Equipment Temperature Monitoring"
        }
    }
  2. iote_equip_temp_detector_modelという名前のAWS IoT Events 探知器モデルを作成します。
    aws iotevents create-detector-model --cli-input-json file://iote_equip_temp_detector_model.json --region 'us-west-2' --profile default

    ファイルiote_equip_temp_detector_model.jsonには次のコードが含まれています(iote_equip_temp_roleの IAMロールARNとiote_send_email_sns_topicの SNSトピックARN を置き換えることを忘れないでください)。

    {
        "detectorModelName": "iote_equip_temp_detector_model",
        "detectorModelDescription": "AWS IoT Events Equipment Temperature Monitoring Detector Model",
        "detectorModelDefinition": {
            "states": [
                {
                    "stateName": "Critical",
                    "onInput": {
                        "events": [
                            {
                                "eventName": "DecrementcriticalCounter",
                                "condition": "convert(Decimal,$input.iote_equip_temp.avg_value) <= 70",
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "criticalCounter",
                                            "value": "$variable.criticalCounter - 1"
                                        }
                                    }
                                ]
                            }
                        ],
                        "transitionEvents": [
                            {
                                "eventName": "to_Good",
                                "condition": "$variable.criticalCounter <= 1",
                                "actions": [
                                    {
                                        "sns": {
                                            "targetArn": "arn:aws:sns:us-west-2:<AWS-ACCOUNT-ID>:iote_send_email_sns_topic"
                                        }
                                    }
                                ],
                                "nextState": "Good"
                            }
                        ]
                    },
                    "onEnter": {
                        "events": []
                    },
                    "onExit": {
                        "events": []
                    }
                },
                {
                    "stateName": "Good",
                    "onInput": {
                        "events": [
                            {
                                "eventName": "IncrementcriticalCounter",
                                "condition": "convert(Decimal,$input.iote_equip_temp.avg_value)  > 70",
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "criticalCounter",
                                            "value": "$variable.criticalCounter + 1"
                                        }
                                    }
                                ]
                            },
                            {
                                "eventName": "ResetcriticalCounter",
                                "condition": "convert(Decimal,$input.iote_equip_temp.avg_value) <= 70",
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "criticalCounter",
                                            "value": "0"
                                        }
                                    }
                                ]
                            }
                        ],
                        "transitionEvents": [
                            {
                                "eventName": "to_Critical",
                                "condition": "$variable.criticalCounter >= 2",
                                "actions": [
                                    {
                                        "sns": {
                                            "targetArn": "arn:aws:sns:us-west-2:<AWS-ACCOUNT-ID>:iote_send_email_sns_topic"
                                        }
                                    }
                                ],
                                "nextState": "Critical"
                            }
                        ]
                    },
                    "onEnter": {
                        "events": [
                            {
                                "eventName": "Initialization",
                                "condition": "true",
                                "actions": [
                                    {
                                        "setVariable": {
                                            "variableName": "criticalCounter",
                                            "value": "0"
                                        }
                                    }
                                ]
                            }
                        ]
                    },
                    "onExit": {
                        "events": []
                    }
                }
            ],
            "initialStateName": "Good"
        },
        "roleArn": "arn:aws:iam::<AWS-ACCOUNT-ID>:role/iote_equip_temp_role",
        "key": "name"
    }

    サンプル実行出力:

    {
        "detectorModelConfiguration": {
            "status": "ACTIVATING", 
            "detectorModelDescription": "AWS IoT Events Equipment Temperature Monitoring Detector Model", 
            "lastUpdateTime": 1574882287.039, 
            "roleArn": "arn:aws:iam::<AWS-ACCOUNT-ID>:role/iote_equip_temp_role", 
            "creationTime": 1574882287.039, 
            "detectorModelArn": "arn:aws:iotevents:us-west-2:<AWS-ACCOUNT-ID>:detectorModel/iote_equip_temp_detector_model", 
            "key": "name", 
            "detectorModelName": "iote_equip_temp_detector_model", 
            "detectorModelVersion": "1"
        }
    }

    「> = 3」であるはずの遷移イベント「to_Critical」の条件「$ variable.criticalCounter> = 2」について疑問に思うかもしれません、これはAWS IoT Eventsの現在の制限によるものです。

  3. AWS IoT Eventsコンソールで、「探知器モデル」を選択し、iote_equip_temp_detector_modelを選択します。「編集」を選択し、AWS CLIで作成した探知器モデルを確認します。
  4. 新しいIAMポリシーを作成するか、以前に作成したAWS IoT Events入力(iote_equip_temp)で次のアクセス許可を持つIAMロールiote_equip_temp_roleの既存のポリシーを変更します。
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "iotevents:BatchPutMessage",
                "Resource": [
                    "arn:aws:iotevents:us-west-2:<AWS-ACCOUNT-ID>:input/iote_equip_temp"
                ]
            }
        ]
    }

    前述のAWS IoT Events入力iote_equip_tempのIAMロールARNを忘れずに置き換えてください。

AWS IoT Events探知器モデルへのAWS IoT Analyticsデータセットコンテンツ配信のセットアップ

AWS IoT Events探知器モデルを作成したので、iote_equip_temp_datasetという名前のAWS IoT Analyticsデータセットを作成します。コンテンツ配信ターゲットは、AWS IoT Events 探知器モデル入力–  iote_equip_tempです。

IAMロールARNと 、環境のassed_idおよびproperty_idを忘れずに置き換えてください。asset_idproperty_idを取得するには、list-assetを使用してすべてのアセットを一覧表示してからdescribe-assetを使用します。describe-asset API からアセットプロパティの可読性ある名前を取得することもできます。

aws iotanalytics create-dataset --cli-input-json file://mydataset.json --region 'us-west-2' --profile default

ファイルmydataset.jsonには次のコードが含まれています。

{
    "datasetName": "iote_equip_temp_dataset",
    "actions": [
        {
            "actionName": "myaction",
            "queryAction": {
                "sqlQuery": "SELECT Replace(Replace(asset_property_name, '/', '-'), ' ') name, avg_value FROM   (SELECT CASE WHEN asset_id = '4be96ade-55ec-40fd-b2ed-277bdcb83a4e' and property_id = '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc' THEN '/Wind Turbine 1/Unit 2 PLC/Equipment Temperature' WHEN asset_id = '6390c711-86ea-4d58-a97a-3b52f43388aa' and property_id = '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc' THEN '/Wind Turbine 2/Unit 2 PLC/Equipment Temperature' WHEN asset_id = 'a5642995-b599-4449-a0db-ea5de7e074af' and property_id = '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc' THEN '/Wind Turbine 3/Unit 2 PLC/Equipment Temperature' ELSE 'unknown' END                        asset_property_name, Avg(Cast(value AS DOUBLE)) AS avg_value FROM   sitewise_blogpost_datastore WHERE  From_unixtime(timestamp) > current_timestamp - interval '5' minute AND asset_id IN ( '4be96ade-55ec-40fd-b2ed-277bdcb83a4e', '6390c711-86ea-4d58-a97a-3b52f43388aa', 'a5642995-b599-4449-a0db-ea5de7e074af' ) AND property_id IN ( '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc') GROUP  BY 1)temp"
            }
        }
    ],
    "contentDeliveryRules": [
        {
            "destination": {
                "iotEventsDestinationConfiguration": {
                    "inputName": "iote_equip_temp",
                    "roleArn": "arn:aws:iam::<AWS-ACCOUNT-ID>:role/iote_equip_temp_role"
                }
            }
        }
    ],
    "triggers": [
        {
            "schedule": {
                "expression": "cron(0/5 * * * ? *)"
            }
        }
    ]
}

サンプル実行出力:

{
    "datasetName": "iote_equip_temp_dataset", 
    "datasetArn": "arn:aws:iotanalytics:us-west-2:<AWS-ACCOUNT-ID>:dataset/iote_equip_temp_dataset"
}

データセットの作成後、データセットがスケジュールどおりに実行されるまで5分間待つか、次のようにAWS CLIから手動で実行します。

aws iotanalytics create-dataset-content --dataset-name "iote_equip_temp_dataset" --region 'us-west-2' --profile default

サンプル実行出力:

{
    "versionId": "f2ade0be-092f-4686-a4aa-8ecbc967cb5c"
}

次のコマンドを実行して、コンテンツが作成されるのを待ちます。 データセットコンテンツがAmazon S3で利用できるようにするには、状態が成功と表示されている必要があります。

aws iotanalytics get-dataset-content --dataset-name "iote_equip_temp_dataset" --region 'us-west-2' --profile default

サンプル実行出力:

{
    "status": {
        "state": "SUCCEEDED"
    }, 
    "timestamp": 1574642608.767, 
    "entries": [
        {
            "dataURI": "https://aws-iot-analytics-dataset-cb3a5eef-4a9f-423c-8fd7-beb9ee6210d5xxxxxxxxxxxxx"
        }
    ]
}

AWS IoT Analyticsデータセットの結果は、AWS IoT Events探知器モデルに送信されます。

AWS IoT Eventsコンソールで「探知器モデル」から、iote_equip_temp_detector_modelを選択して、3つのすべての風力タービンの各ユニット2 PLCに対応する3つの探知器モデルインスタンスを表示します。

AWS IoT Analyticsデータセットがスケジュールどおりに数回実行された後、以下に示すように、3つの風力タービンからの3つのUnit 2 PLCすべてがGood状態からCritical状態に移行しました。ユニット2 PLCのクリティカルな状態を知らせる以下と同様のメールを受信して​​いるはずです。

Amazon QuickSightで可視化するためのAWS IoT Analyticsデータセットのセットアップ

エンドツーエンドのユースケースの要件の1つは、Amazon QuickSightで過去1時間の3つの風力タービンすべてのEquipment Temperature の測定値を最低粒度で可視化することです。

次のように、3つの風力タービンすべてについて、過去1時間のequipment temperature の測定値を最低粒度で生成する、quicksight_equip_temp_datasetという名前のAWS IoT Analyticsデータセットを作成します。

環境のasset_idとproperty_idを忘れずに置き換えてください。asset_idとproperty_idを取得するには、list-assetを使用してすべてのアセットを一覧表示してからdescribe-assetを使用します。describe-assetAPI からアセットプロパティの可読性ある名前を取得することもできます。

aws iotanalytics create-dataset --cli-input-json file://mydataset2.json --region 'us-west-2' --profile default

ファイルmydataset2.jsonには次のコードが含まれています。

{
    "datasetName": "quicksight_equip_temp_dataset",
    "actions": [
        {
            "actionName": "myaction",
            "queryAction": {
                "sqlQuery": "SELECT timestamp, equip_temp, Replace(Replace(asset_property_name, '/', '-'), ' ') name FROM   (SELECT CASE WHEN asset_id = '4be96ade-55ec-40fd-b2ed-277bdcb83a4e' and property_id = '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc' THEN '/Wind Turbine 1/Unit 2 PLC/Equipment Temperature' WHEN asset_id = '6390c711-86ea-4d58-a97a-3b52f43388aa' and property_id = '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc' THEN '/Wind Turbine 2/Unit 2 PLC/Equipment Temperature' WHEN asset_id = 'a5642995-b599-4449-a0db-ea5de7e074af' and property_id = '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc' THEN '/Wind Turbine 3/Unit 2 PLC/Equipment Temperature' ELSE 'unknown' END                        asset_property_name, From_unixtime(timestamp) AS timestamp, Cast(value AS DOUBLE)    AS equip_temp FROM   sitewise_blogpost_datastore WHERE  From_unixtime(timestamp) > current_timestamp - interval '1' hour AND asset_id IN ( '4be96ade-55ec-40fd-b2ed-277bdcb83a4e', '6390c711-86ea-4d58-a97a-3b52f43388aa', 'a5642995-b599-4449-a0db-ea5de7e074af' ) AND property_id IN ( '912e4cc3-7ceb-4b1f-951e-ffacc618f7dc'))temp"
            }
        }
    ],
    "triggers": [
        {
            "schedule": {
                "expression": "cron(0 * * * ? *)"
            }
        }
    ]
}

サンプル実行出力:

{
    "datasetName": "quicksight_equip_temp_dataset", 
    "datasetArn": "arn:aws:iotanalytics:us-west-2:<AWS-ACCOUNT-ID>:dataset/quicksight_equip_temp_dataset"
}

前に説明したように、AWS IoT Analyticsデータセットの作成後、データセットがスケジュールどおりに実行されるのを待つか(この場合は1時間)、AWS CLIから手動で実行します。

Amazon QuickSightでAWS IoT Analyticsデータセットを可視化する

AWS IoT Analyticsは、Amazon QuickSightとの直接統合できます。AWS IoT Analyticsデータセットquicksight_equip_temp_datasetを可視化するには、QuickSight を使用した AWS IoT Analytics データの表示を参照してください。

AWS IoT Analyticsデータセット(quicksight_equip_temp_dataset)のAmazon QuickSightデータセットを作成したら、サンプル分析を作成できます。

まとめ

この複数パートに及ぶ投稿のパート3では、AWS IoT Coreルールエンジンを介してAWS IoT SiteWiseモデルデータをサブスクライブし、AWS IoT Eventsを使用してニアリアルタイムで状態監視を行い、通知またはアラートを送信し、最後にAmazon QuickSightを使用して、ヒストリカルデータのビジネスインテリジェンス(BI)レポートを有効にしました。

この複数パートに及ぶ投稿では、安全で費用効果が高く、信頼性の高いフィールドツークラウドソリューションについて説明しました。次の方法を学びました。

  • 数万のPLCとセンサーを持つ数百の産業現場からすべてのデータを取り込む
  • デバイス、プロセス、および機器の主要な測定値およびメトリクスをニアリアルタイムで可視化
  • 状態監視を有効にし、必要に応じてアクションを実行するために、ニアリアルタイムで通知とアラートを送信
  • レポートのためヒストリカルデータによるビジネスインテリジェンス(BI)を有効にする

この記事が参考になり、提案したソリューションウォークスルーが役立つことを願っています。いつものように、AWSはフィードバックを歓迎します。以下のコメントまたは質問を送信してください。

原文はこちら
翻訳はソリューションアーキテクト 園田が担当しました。