

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# AWS IoT TwinMaker exemple de connecteur de séries chronologiques de Cookie Factory
<a name="time-series-data-connectors-example"></a>

Le [code complet de la fonction Lambda de la fabrique de cookies](https://github.com/aws-samples/aws-iot-twinmaker-samples/blob/main/src/modules/timestream_telemetry/lambda_function/udq_data_reader.py) est disponible sur. GitHub Bien que vous puissiez toujours mettre à jour l'implémentation après avoir lié le connecteur au type de composant, nous vous recommandons vivement de vérifier le connecteur Lambda avant de l'intégrer. AWS IoT TwinMaker Vous pouvez tester votre fonction Lambda dans la console Lambda ou localement dans le. AWS CDK[Pour plus d'informations sur le test de vos fonctions Lambda, consultez Tester les fonctions [Lambda et Tester les](https://docs.aws.amazon.com//lambda/latest/dg/testing-functions.html) applications localement. AWS CDK](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-cdk-testing.html) 

## Exemples de types de composants de Cookie Factory
<a name="time-series-data-connectors-example-ct"></a>

Dans un type de composant, nous définissons des propriétés communes partagées entre les composants. Dans l'exemple de la fabrique à cookies, les composants physiques du même type partagent les mêmes mesures. Nous pouvons donc définir le schéma des mesures dans le type de composant. À titre d'exemple, le type de mixeur est défini dans l'exemple suivant.

```
{
    "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
        }
    }
}
```

Par exemple, un composant physique peut avoir des mesures dans une base de données Timestream, des enregistrements de maintenance dans une base de données SQL ou des données d'alarme dans des systèmes d'alarme. La création de plusieurs composants et leur association à une entité relient différentes sources de données à l'entité et renseigne le graphe entité-composant. Dans ce contexte, chaque composant a besoin d'une `telemetryId` propriété pour identifier la clé unique du composant dans la source de données correspondante. La spécification de la `telemetryId` propriété présente deux avantages : la propriété peut être utilisée dans le connecteur de données comme condition de filtre pour interroger uniquement les valeurs du composant donné et, si vous incluez la valeur de la `telemetryId` propriété dans la réponse de l'API du plan de données, le côté client prend l'ID et peut effectuer une recherche inversée si nécessaire.

Si vous ajoutez le `TelemetryId` au type de composant en tant qu'identifiant externe, il identifie le composant dans le `TimeStream` tableau.

```
{
    "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
        }
    }
}
```

De même, nous avons le type de composant pour le`WaterTank`, comme indiqué dans l'exemple JSON suivant.

```
{
  "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`Il s'agit d'une propriété facultative dans le type de composant si elle vise à interroger les valeurs des propriétés dans le périmètre de l'entité. Pour un exemple, consultez les types de composants définis dans le [ GitHub référentiel AWS IoT TwinMaker d'échantillons](https://github.com/aws-samples/aws-iot-twinmaker-samples/tree/main/src/workspaces/cookiefactory/component_types). Certains types d'alarmes sont également intégrés dans la même table. Ils sont donc définis et vous pouvez extraire des propriétés communes, telles que le `TelemetryId` et `TelemetryType` vers un type de composant parent pour que d'autres types d'enfants puissent les partager. `TelemetryType`

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

Le connecteur Lambda doit accéder à la source de données, générer l'instruction de requête en fonction de l'entrée et la transmettre à la source de données. Un exemple de demande envoyée au Lambda est illustré dans l'exemple JSON suivant.

```
{
    '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'
}
```

L'objectif de la fonction Lambda est d'interroger les données de mesure historiques pour une entité donnée. AWS IoT TwinMaker fournit une carte des propriétés des composants, et vous devez spécifier une valeur instanciée pour l'ID du composant. Par exemple, pour traiter la requête au niveau du type de composant (ce qui est courant dans les cas d'utilisation des alarmes) et renvoyer l'état d'alarme de tous les composants de l'espace de travail, la carte des propriétés contient des définitions des propriétés des types de composants.

Dans le cas le plus simple, comme dans la demande précédente, nous voulons une série d'échantillons de température pendant la fenêtre temporelle donnée pour le composant donné, par ordre chronologique croissant. L'instruction de requête peut être résumée comme suit :

```
...
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}
...
```