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
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 } } }
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'échantillonsTelemetryId
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} ...