AWS IoT SiteWise ルールアクションの設定 - AWS IoT SiteWise

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS IoT SiteWise ルールアクションの設定

AWS IoT SiteWise ルールアクションは、ルールを開始した MQTT メッセージのデータを内のアセットプロパティに送信します。 AWS IoT SiteWise複数のデータエントリを異なるアセットプロパティに同時にアップロードして、デバイスのすべてのセンサーの更新を 1 つのメッセージで送信できます。また、各データ入力に一度に複数のデータポイントをアップロードすることもできます。

注記

AWS IoT SiteWise ルールアクションを使用してにデータを送信する場合、BatchPutAssetPropertyValueデータは操作のすべての要件を満たしている必要があります。たとえば、現在の UNIX エポック時間から 7 日以上前ののタイムスタンプをデータで使用することはできません。詳細については、「AWS IoT SiteWise API を使用したデータの取り込み」を参照してください。

ルールアクションの各データエントリについて、アセットプロパティを識別し、そのアセットプロパティの各データポイントのタイムスタンプ、品質、および値を指定します。ルールアクションには、すべてのパラメータに対する文字列を指定します。

エントリ内のアセットのプロパティを識別するには、以下のいずれかを指定します。

  • データを送信するアセットプロパティの [アセット ID] (assetId) と [プロパティ ID] (propertyId)。アセット ID とプロパティ ID は、を使用して確認できます AWS IoT SiteWise コンソール。アセット ID がわかっている場合は、を使用してプロパティ ID を検索できます。 AWS CLI DescribeAsset

  • [Property alias (プロパティエイリアス) ] (propertyAlias)。これは、データストリームのエイリアス (/company/windfarm/3/turbine/7/temperature など) です。このオプションを使用するには、最初にアセットプロパティのエイリアスを設定する必要があります。プロパティのエイリアスを設定する方法については、「アセットプロパティへの産業データストリームのマッピング」を参照してください。

各エントリのタイムスタンプには、機器から報告されたタイムスタンプまたはから提供されたタイムスタンプを使用してください。 AWS IoT Coreタイムスタンプは 2 つのパラメータがあります。

  • [Time in seconds] (時間 (秒)) (timeInSeconds) - センサーまたは機器がデータを報告した UNIX エポック時間 (秒)。

  • [Offset in nanos] (オフセット (ナノ秒)) (offsetInNanos) -(オプション) 時間 (秒) からのオフセット (ナノ秒)。

重要

タイムスタンプが文字列であったり、小数部があったり、秒単位でない場合、 AWS IoT SiteWise はリクエストを拒否します。タイムスタンプを秒とナノ秒のオフセットに変換する必要があります。 AWS IoT ルールエンジンの機能を使用してタイムスタンプを変換します。詳細については、次を参照してください。

アクションのいくつかのパラメータに置換テンプレートを使用して、コンピューティングを実行したり、関数を呼び出したり、メッセージペイロードから値を引き出したりすることができます。詳細については、[AWS IoT Developer Guide] (デベロッパーガイド) の[Substitution templates] (置換テンプレート) を参照してください。

注記

置換テンプレート内の式は SELECT ステートメントとは別に評価されるため、AS 句を使用して作成されたエイリアスは置換テンプレートを使用して参照することはできません。サポートされている関数と演算子に加えて、元のペイロードに存在する情報のみを参照できます。

正確な時間を報告しないデバイスのタイムスタンプを取得する。

センサーや機器が正確な時間データを報告しない場合は、timestamp () AWS IoT を使用してルールエンジンから現在の Unix エポック時間を取得します。この関数は、ミリ秒単位で時間を出力するので、時間を秒単位、オフセットをナノ秒単位に変換する必要があります。そのためには、次の変換を使用します。

  • [Time in seconds (時間 (秒)) ] (timeInSeconds) には、${floor(timestamp() / 1E3)} を使用して、時間をミリ秒から秒に変換します。

  • [Offset in nanos (オフセット (ナノ秒)) ] (offsetInNanos) には、${(timestamp() % 1E3) * 1E6} を使用して、タイムスタンプオフセット (ナノ秒) をコンピューティングします。

文字列形式のタイムスタンプを変換する

センサーまたは機器が時間データを文字列形式 (例:) で報告する場合は、time_to_epoch (String, String2020-03-03T14:57:14.699Z) を使用してください。この関数は、タイムスタンプとフォーマットパターンをパラメータとして入力し、時刻をミリ秒単位で出力します。次に、時間を秒単位で、オフセットをナノ秒単位で変換する必要があります。そのためには、次の変換を使用します。

  • [Time in seconds] (秒単位の時間) (timeInSeconds) の場合、${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)} でタイムスタンプ文字列をミリ秒に変換し、さらに秒に変換します。

  • [Offset in nanos](オフセット (ナノ秒)) (offsetInNanos) には、${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6} を使用して、タイムスタンプ文字列オフセット (ナノ秒) をコンピューティングします。

注記

time_to_epoch 関数は、最大ミリ秒精度のタイムスタンプ文字列をサポートします。文字列をマイクロ秒またはナノ秒の精度で変換するには、 AWS Lambda タイムスタンプを数値に変換するためにルールが呼び出す関数を設定します。詳細については、「ナノ秒精度のタイムスタンプ文字列を変換する。」を参照してください。

ナノ秒精度のタイムスタンプ文字列を変換する。

デバイスがナノ秒精度のタイムスタンプ情報を文字列形式 (2020-03-03T14:57:14.699728491Z など) で送信する場合、次のステップでルールアクションを設定します。タイムスタンプを文字列の時間 (秒)、オフセット (nanostimeInSeconds) () AWS Lambda に変換する関数を作成できます。 offsetInNanos次に、ルールアクションパラメータで aws_lambda (functionArn、inputJson) を使用してその Lambda 関数を呼び出し、その出力をルールで使用します。

注記

このセクションでは、次のリソースの作成方法を熟知していることを前提とした高度な手順について説明します。

AWS IoT SiteWise タイムスタンプ文字列を解析するルールアクションを作成するには
  1. 次のプロパティを持つ Lambda 関数を作成します。

    • [Function name] (関数名) - わかりやすい関数名を使用します (例: ConvertNanosecondTimestampFromString)。

    • ランタイム — Python 3.11 (python3.11) などの Python 3 ランタイムを使用してください。

    • 権限 — 基本的な Lambda 権限を持つロールを作成します () AWS LambdaBasicExecutionRole

    • レイヤー — Lambda AWS関数が使用できるように SDKPandas-Python311 レイヤーを追加します。numpy

    • [Function code] (関数コード) - 次の関数コードを使用します。この関数コードでは、timestamp という文字列引数を消費し、そのタイムスタンプの timeInSecondsoffsetInNanos 値を出力します。

      import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }

      この Lambda 関数は、から datetime64 を使用して ISO 8601 形式のタイムスタンプ文字列を入力します。 NumPy

      注記

      タイムスタンプ文字列が ISO 8601 形式でない場合、タイムスタンプ形式を定義した pandas で解決策を実装することが可能です。詳しくはpandas.to_datetimeを参照してください。

  2. AWS IoT SiteWise ルールに合わせてアクションを設定するときは、「秒単位の時間 ()」と「ナノ秒単位のオフセット ()」(timeInSeconds) に次の代替テンプレートを使用します offsetInNanosこれらの置換テンプレートは、メッセージペイロードに timestamp のタイムスタンプ文字列が含まれていることを前提としています。この aws_lambda 関数は 2 番目のパラメータに JSON 構造消費するため、必要に応じて以下の置換テンプレートを変更できます。

    • [Time in seconds (時間 (秒)) ] (timeInSeconds) には、次の置換テンプレートを使用します。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).timeInSeconds}
    • Offset in nanos (オフセット (ナノ秒)) ] (offsetInNanos) には、次の置換テンプレートを使用します。

      ${aws_lambda('arn:aws:lambda:region:account-id:function:ConvertNanosecondTimestampFromString', {'timestamp': timestamp}).offsetInNanos}

    各パラメータについて、リージョンと account-id を自分のリージョンとアカウント ID に置き換えてください。 AWS Lambda 関数に別の名前を使用した場合は、それも変更してください。

  3. AWS IoT その権限で関数を呼び出すための権限を付与します。lambda:InvokeFunction詳細については、「aws_lambda (functionArn, inputJson) 」を参照してください。

  4. ルールをテスト (たとえば AWS IoT MQTT テストクライアントを使用) し、 AWS IoT SiteWise 送信したデータを受信することを確認します。

    ルールが期待どおりに動作しない場合は、「AWS IoT SiteWise ルールアクションのトラブルシューティング」を参照してください。

注記

このソリューションは、タイムスタンプ文字列ごとに Lambda 関数を 2 回呼び出します。ルールが各ペイロードで同じタイムスタンプを持つ複数のデータポイントを処理する場合、別のルールを作成して Lambda 関数呼び出し回数を減らすことができます。

そのためには、Lambda を呼び出し、タイムスタンプ文字列を timeInSecondsoffsetInNanos に変換して元のペイロードをパブリッシュする再パブリッシュアクションを含むルールを作成します。次に、 AWS IoT SiteWise 変換されたペイロードを使用するルールアクションを含むルールを作成します。このアプローチでは、ルールが Lambda を呼び出す回数を減らしますが、 AWS IoT 実行するルールアクションの数は増やします。このソリューションをユースケースに適用する場合は、各サービスの価格を考慮してください。

ルール設定の例。

このセクションには、アクションを含むルールを作成するためのルール設定の例が含まれています。 AWS IoT SiteWise

例 プロパティエイリアスをメッセージトピックとして使用するルールアクションの例

次の例では、アセットのプロパティを識別するプロパティエイリアスとして (topic () から) AWS IoT SiteWise トピックを使用するアクションを含むルールを作成します。この例を使用して、すべての風力発電所のすべての風力タービンにダブルタイプのデータを取り込むための 1 つのルールを定義します。この例では、すべてのタービンアセットのプロパティにプロパティエイリアスを定義する必要があります。整数型データを取り込むには、同様のルールをもう一つ定義する必要があります。

aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json のペイロードの例には、次のコンテンツが含まれています。

{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

このルールアクションでは、データを取り込むトピックとして次のメッセージを風力タービンのプロパティエイリアス (例:/company/windfarm/3/turbine/7/temperature) に送信します。

{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
例 timestamp () を使用して時刻を決定するルールアクションの例

次の例では、ID でアセットプロパティを識別し、timestamp () AWS IoT SiteWise を使用して現在の時刻を決定するアクションを含むルールを作成します。

aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json

sitewise-rule-payload.json のペイロードの例には、次のコンテンツが含まれています。

{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::account-id:role/MySiteWiseActionRole" } } ] }

このルールアクションでは、次のメッセージをに送信してデータを取り込みます。my/asset/property/topic

{ "type": "double", "value": "38.3" }

ルールアクションのトラブルシューティング

AWS IoT SiteWise でルールアクションをトラブルシューティングするには AWS IoT Core、 CloudWatch ルールにログを設定するか、再公開エラーアクションを設定します。詳細については、「AWS IoT SiteWise ルールアクションのトラブルシューティング」を参照してください。