

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

# AWS IoT SiteWise ルールアクションを設定する
<a name="configure-rule-action"></a>

 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 がわかっている場合は、 を使用して [DescribeAsset](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAsset.html) AWS CLI を呼び出し、プロパティ ID を見つけることができます。
+ [**Property alias (プロパティエイリアス) **] (`propertyAlias`)。これは、データストリームのエイリアス (`/company/windfarm/3/turbine/7/temperature` など) です。このオプションを使用するには、最初にアセットプロパティのエイリアスを設定する必要があります。プロパティのエイリアスを設定する方法については、「[のデータストリームを管理する AWS IoT SiteWise](manage-data-streams.md)」を参照してください。

各エントリーのタイムスタンプには、お使いの機器から報告されたタイムスタンプ、または AWS IoT Coreから提供されたタイムスタンプを使用できます。タイムスタンプは 2 つのパラメータがあります。
+ **[Time in seconds]** (時間 (秒)) (`timeInSeconds`) - センサーまたは機器がデータを報告した UNIX エポック時間 (秒)。
+ **[Offset in nanos]** (オフセット (ナノ秒)) (`offsetInNanos`) -(オプション) 時間 (秒) からのオフセット (ナノ秒)。

**重要**  
タイムスタンプが文字列であったり、小数部があったり、秒単位でない場合、 AWS IoT SiteWise はリクエストを拒否します。タイムスタンプを秒とナノ秒のオフセットに変換する必要があります。 AWS IoT ルールエンジンの機能を使用して、タイムスタンプを変換します。詳細については次を参照してください:  
[正確な時間を報告しないデバイスのタイムスタンプを取得する。](#rule-timestamp-function)
[文字列形式のタイムスタンプを変換する](#rule-time-to-epoch-function)

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

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

**Topics**
+ [正確な時間を報告しないデバイスのタイムスタンプを取得する。](#rule-timestamp-function)
+ [文字列形式のタイムスタンプを変換する](#rule-time-to-epoch-function)
+ [ナノ秒精度のタイムスタンプ文字列を変換する。](#rule-convert-precise-timestamp-string)
+ [ルール設定の例。](#rule-action-examples)
+ [ルールアクションのトラブルシューティング](#troubleshoot-rule-action)

## 正確な時間を報告しないデバイスのタイムスタンプを取得する。
<a name="rule-timestamp-function"></a>

センサーまたは機器が正確な時間データを報告しない場合は、[timestamp()](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-timestamp) を使用して AWS IoT ルールエンジンから現在の Unix エポック時間を取得します。この関数は、ミリ秒単位で時間を出力するので、時間を秒単位、オフセットをナノ秒単位に変換する必要があります。そのためには、次の変換を使用します。
+ [**Time in seconds (時間 (秒)) **] (`timeInSeconds`) には、**${floor(timestamp() / 1E3)}** を使用して、時間をミリ秒から秒に変換します。
+ [**Offset in nanos (オフセット (ナノ秒)) **] (`offsetInNanos`) には、**${(timestamp() % 1E3) \* 1E6}** を使用して、タイムスタンプオフセット (ナノ秒) をコンピューティングします。

## 文字列形式のタイムスタンプを変換する
<a name="rule-time-to-epoch-function"></a>

センサーや機器が時刻データを文字列形式で報告する場合 (例えば、`2020-03-03T14:57:14.699Z`)、[time\_to\_epoch(String, String)](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-time-to-epoch) を使用します。この関数は、タイムスタンプとフォーマットパターンをパラメータとして入力し、時刻をミリ秒単位で出力します。次に、時間を秒単位で、オフセットをナノ秒単位で変換する必要があります。そのためには、次の変換を使用します。
+ **[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 関数を設定します。詳細については、「[ナノ秒精度のタイムスタンプ文字列を変換する。](#rule-convert-precise-timestamp-string)」を参照してください。

## ナノ秒精度のタイムスタンプ文字列を変換する。
<a name="rule-convert-precise-timestamp-string"></a>

デバイスがナノ秒精度のタイムスタンプ情報を文字列形式 (`2020-03-03T14:57:14.699728491Z` など) で送信する場合、次のステップでルールアクションを設定します。文字列のタイムスタンプを**秒単位の時間** (`timeInSeconds`) と**ナノ単位のオフセット** () に変換する AWS Lambda 関数を作成できます`offsetInNanos`。次に、ルールのアクションパラメータで [aws\_lambda(functionArn, inputJson)](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-func-aws-lambda) を使用して、その Lambda 関数を呼び出し、その出力をルールで使用します。

**注記**  
このセクションでは、次のリソースの作成方法を熟知していることを前提とした高度な手順について説明します。  
Lambda 関数。詳細については、「*AWS Lambda デベロッパーガイド*」の「[初めての Lambda 関数の作成](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)」を参照してください。
AWS IoT ルールアクションを持つ AWS IoT SiteWise ルール。詳細については、「[AWS IoT Core ルール AWS IoT SiteWise を使用して にデータを取り込む](iot-rules.md)」を参照してください。

**タイムスタンプ文字列を解析する AWS IoT SiteWise ルールアクションを作成するには**

1. 次のプロパティを持つ Lambda 関数を作成します。
   + **[Function name]** (関数名) - わかりやすい関数名を使用します (例: **ConvertNanosecondTimestampFromString**)。
   + **ランタイム** - **Python 3.11** (`python3.11`) など、Python 3 ランタイムを使用します。
   + **[Permissions]** (アクセス許可) — 基本的な Lambda アクセスアクセス許可を持つロール (**AWS LambdaBasicExecutionRole**) を作成します。
   + **レイヤー** — `numpy` を使用する Lambda 関数用に **AWS SDKPandas-Python311** レイヤーを追加します。
   + **[Function code]** (関数コード) - 次の関数コードを使用します。この関数コードでは、`timestamp` という文字列引数を消費し、そのタイムスタンプの `timeInSeconds` と `offsetInNanos` 値を出力します。

     ```
     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 関数は、NumPy から[datetime64](https://numpy.org/doc/stable/reference/arrays.datetime.html)を使用して[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)形式のタイムスタンプ文字列を入力します。
**注記**  
タイムスタンプ文字列が ISO 8601 形式でない場合、タイムスタンプ形式を定義した pandas で解決策を実装することが可能です。詳しくは[pandas.to\_datetime](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)を参照してください。

1. ルールの 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}
     ```

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

1. アクセス AWS IoT 許可を使用して 関数を呼び出すアクセス`lambda:InvokeFunction`許可を付与します。詳細については、「[aws\_lambda (functionArn, inputJson) ](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-func-aws-lambda)」を参照してください。

1. ルールをテストし ( AWS IoT MQTT テストクライアントを使用するなど）、 が送信したデータ AWS IoT SiteWise を受信することを確認します。

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

**注記**  
このソリューションは、タイムスタンプ文字列ごとに Lambda 関数を 2 回呼び出します。ルールが各ペイロードで同じタイムスタンプを持つ複数のデータポイントを処理する場合、別のルールを作成して Lambda 関数呼び出し回数を減らすことができます。  
そのためには、Lambda を呼び出し、タイムスタンプ文字列を `timeInSeconds` と `offsetInNanos` に変換して元のペイロードをパブリッシュする再パブリッシュアクションを含むルールを作成します。次に、変換されたペイロードを消費するルールアクションを使用して AWS IoT SiteWise ルールを作成します。この方法では、ルールが Lambda を呼び出す回数を減らしますが、 AWS IoT ルールアクションの実行回数を増やします。このソリューションをユースケースに適用する場合は、各サービスの価格を考慮してください。

## ルール設定の例。
<a name="rule-action-examples"></a>

このセクションでは、 AWS IoT SiteWise アクションでルールを作成するためのルール設定の例を示します。

**Example プロパティエイリアスをメッセージトピックとして使用するルールアクションの例**  
次の例では、 トピック ([topic()](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-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"
}
```

**Example timestamp () を使用して時刻を決定するルールアクションの例**  
次の例では、IDs でアセットプロパティを識別し、[timestamp()](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-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"
}
```

## ルールアクションのトラブルシューティング
<a name="troubleshoot-rule-action"></a>

で AWS IoT SiteWise ルールアクションをトラブルシューティングするには AWS IoT Core、CloudWatch Logs を設定するか、ルールの再発行エラーアクションを設定します。詳細については、「[AWS IoT SiteWise ルールアクションのトラブルシューティング](troubleshoot-rule.md)」を参照してください。