

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

# AWS IoT TwinMaker クッキー ファクトリ時系列コネクタの例
<a name="time-series-data-connectors-example"></a>

[クッキーファクトリの Lambda 関数の完全なコード](https://github.com/aws-samples/aws-iot-twinmaker-samples/blob/main/src/modules/timestream_telemetry/lambda_function/udq_data_reader.py)は GitHub で公開されています。コネクタをコンポーネントタイプにリンクした後でも実装を更新することはできますが、 AWS IoT TwinMakerとインテグレートする前に Lambda コネクタを検証することを強くお勧めします。Lambda 関数のテストは、Lambda コンソールで行うか、 AWS CDKのローカルで行います。Lambda 関数のテストの詳細については、[「Lambda 関数のテスト](https://docs.aws.amazon.com//lambda/latest/dg/testing-functions.html)」および[「アプリケーションのローカルテスト」を参照してください AWS CDK](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-cdk-testing.html)。

## クッキーファクトリのコンポーネントタイプの例
<a name="time-series-data-connectors-example-ct"></a>

コンポーネントタイプでは、コンポーネント間で共有される共通のプロパティを定義します。Cookie Factory の例では、同じタイプの物理コンポーネントが同じ測定値を共有するため、コンポーネントタイプで測定値スキーマを定義できます。一例として、以下の例ではミキサータイプを定義しています。

```
{
    "componentTypeId": "com.example.cookiefactory.mixer"
    "propertyDefinitions": {
        "RPM": {
            "dataType": { "type": "DOUBLE" },
            "isTimeSeries": true,
            "isRequiredInEntity": false,
            "isExternalId": false,
            "isStoredExternally": true
        },
        "Temperature": {
            "dataType": { "type": "DOUBLE" },
            "isTimeSeries": true,
            "isRequiredInEntity": false,
            "isExternalId": false,
            "isStoredExternally": true
        }
    }
}
```

たとえば、物理コンポーネントには Timestream データベースの測定値、SQL データベースのメンテナンスレコード、アラームシステムのアラームデータが含まれる場合があります。複数のコンポーネントを作成してエンティティに関連付けると、さまざまなデータソースがエンティティにリンクされ、エンティティコンポーネントグラフにデータが入力されます。このコンテキストでは、各コンポーネントには、対応するデータソース内のコンポーネントの一意のキーを識別するための `telemetryId`プロパティが必要です。`telemetryId` プロパティを指定すると、2 つの利点があります。 プロパティをフィルター条件としてデータコネクタで使用して、特定のコンポーネントの値をクエリできます。また、データプレーン API レスポンスに `telemetryId`プロパティ値を含めると、クライアント側は ID を受け取り、必要に応じて逆引き検索を実行できます。

`TelemetryId` を外部 ID としてコンポーネントタイプに追加すると、`TimeStream`テーブル内のコンポーネントが識別されます。

```
{
    "componentTypeId": "com.example.cookiefactory.mixer"
    "propertyDefinitions": {
        "telemetryId": {
            "dataType": { "type": "STRING" },
            "isTimeSeries": false,
            "isRequiredInEntity": true,
            "isExternalId": true,
            "isStoredExternally": false
        },
        "RPM": {
            "dataType": { "type": "DOUBLE" },
            "isTimeSeries": true,
            "isRequiredInEntity": false,
            "isExternalId": false,
            "isStoredExternally": true
        },
        "Temperature": {
            "dataType": { "type": "DOUBLE" },
            "isTimeSeries": true,
            "isRequiredInEntity": false,
            "isExternalId": false,
            "isStoredExternally": true
        }
    }
}
```

同様に、以下の JSON の例に示すように、`WaterTank` のコンポーネントタイプがあります。

```
{
  "componentTypeId": "com.example.cookiefactory.watertank",
  "propertyDefinitions": {
    "flowRate1": {
      "dataType": { "type": "DOUBLE" },
      "isTimeSeries": true,
      "isRequiredInEntity": false,
      "isExternalId": false,
      "isStoredExternally": true
    },
    "flowrate2": {
      "dataType": { "type": "DOUBLE" },
      "isTimeSeries": true,
      "isRequiredInEntity": false,
      "isExternalId": false,
      "isStoredExternally": true
    },
    "tankVolume1": {
      "dataType": { "type": "DOUBLE" },
      "isTimeSeries": true,
      "isRequiredInEntity": false,
      "isExternalId": false,
      "isStoredExternally": true
    },
    "tankVolume2": {
      "dataType": { "type": "DOUBLE" },
      "isTimeSeries": true,
      "isRequiredInEntity": false,
      "isExternalId": false,
      "isStoredExternally": true
    },
    "telemetryId": {
      "dataType": { "type": "STRING" },
      "isTimeSeries": false,
      "isRequiredInEntity": true,
      "isExternalId": true,
      "isStoredExternally": false
    }
  }
}
```

エンティティスコープ内のプロパティ値のクエリを目的としている場合、`TelemetryType` はコンポーネントタイプのオプションプロパティです。例については、[AWS IoT TwinMaker サンプル GitHub リポジトリ](https://github.com/aws-samples/aws-iot-twinmaker-samples/tree/main/src/workspaces/cookiefactory/component_types)で定義されているコンポーネントタイプを参照してください。同じテーブルにはアラームタイプも埋め込まれているので、`TelemetryType` が定義され、`TelemetryId` や `TelemetryType` などの共通プロパティを親コンポーネントタイプに抽出して、他の子タイプと共有できます。

## Lambda の例
<a name="time-series-data-connectors-example-lam"></a>

Lambda コネクタは、データソースにアクセスし、入力に基づいてクエリステートメントを生成し、それをデータソースに転送する必要があります。Lambda に送信されるリクエスト例を、次の JSON 例で示すことができます。

```
{
    'workspaceId': 'CookieFactory', 
    'selectedProperties': ['Temperature'], 
    'startDateTime': 1648796400, 
    'startTime': '2022-04-01T07:00:00.000Z', 
    'endDateTime': 1650610799, 
    'endTime': '2022-04-22T06:59:59.000Z', 
    'properties': {
        'telemetryId': {
            'definition': {
                'dataType': { 'type': 'STRING' },
                'isTimeSeries': False, 
                'isRequiredInEntity': True, 
                'isExternalId': True, 
                'isStoredExternally': False, 
                'isImported': False, 
                'isFinal': False, 
                'isInherited': True, 
            }, 
            'value': {
                'stringValue': 'Mixer_22_680b5b8e-1afe-4a77-87ab-834fbe5ba01e'
            }
        }
        'Temperature': {
            'definition': {
                'dataType': { 'type': 'DOUBLE' }, 
                'isTimeSeries': True, 
                'isRequiredInEntity': False, 
                'isExternalId': False, 
                'isStoredExternally': True, 
                'isImported': False, 
                'isFinal': False, 
                'isInherited': False
            }
        }
        'RPM': {
            'definition': {
                'dataType': { 'type': 'DOUBLE' }, 
                'isTimeSeries': True, 
                'isRequiredInEntity': False, 
                'isExternalId': False, 
                'isStoredExternally': True, 
                'isImported': False, 
                'isFinal':False, 
                'isInherited': False
            }
        }, 
    'entityId': 'Mixer_22_d133c9d0-472c-48bb-8f14-54f3890bc0fe', 
    'componentName': 'MixerComponent', 
    'maxResults': 100, 
    'orderByTime': 'ASCENDING'
}
```

Lambda 関数の目的は、特定のエンティティの履歴測定データをクエリすることです。 はコンポーネントプロパティマップ AWS IoT TwinMaker を提供するため、コンポーネント ID にインスタンス化された値を指定する必要があります。たとえば、コンポーネントタイプレベルのクエリ (アラームのユースケースで一般的) を処理し、ワークスペース内のすべてのコンポーネントのアラームステータスを返すには、プロパティマップにコンポーネントタイププロパティ定義があります。

最も簡単なケースとして、前述のリクエストと同様に、特定のコンポーネントの特定の時間枠内の一連の温度サンプルを昇順で取得する必要があります。このクエリステートメントは、以下のように要約できます。

```
...
SELECT measure_name, time, measure_value::double
    FROM {database_name}.{table_name} 
    WHERE time < from_iso8601_timestamp('{request.start_time}')
    AND time >= from_iso8601_timestamp('{request.end_time}')
    AND TelemetryId = '{telemetry_id}'
    AND measure_name = '{selected_property}'
    ORDER BY time {request.orderByTime}
...
```