AWS IoT TwinMaker exemple de connecteur de séries chronologiques de Cookie Factory - AWS IoT TwinMaker

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

Le code complet de la fonction Lambda de la fabrique de cookies 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 CDKPour plus d'informations sur le test de vos fonctions Lambda, consultez Tester les fonctions Lambda et Tester les applications localement. AWS CDK

Exemples de types de composants de Cookie Factory

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 leWaterTank, 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 } } }

TelemetryTypeIl 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. 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

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