Exemplo de conector AWS IoT TwinMaker de série temporal de fábrica de cookies - AWS IoT TwinMaker

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Exemplo de conector AWS IoT TwinMaker de série temporal de fábrica de cookies

O código completo da função Lambda da fábrica de cookies está disponível em. GitHub Embora você ainda possa atualizar a implementação depois de vincular o conector ao tipo de componente, é altamente recomendável verificar o conector Lambda antes de fazer a integração com AWS IoT TwinMaker. Você pode testar sua função do Lambda no console do Lambda ou localmente no AWS CDK. Para obter mais informações sobre como testar suas funções do Lambda, consulte Testando funções do Lambda e Testando aplicativos localmente. AWS CDK

Exemplos de tipos de componentes de fábrica de cookies

Em um tipo de componente, definimos propriedades comuns que são compartilhadas entre os componentes. Para o exemplo da fábrica de cookies, componentes físicos do mesmo tipo compartilham as mesmas medidas, para que possamos definir o esquema de medidas no tipo de componente. Como exemplo, o tipo de mixer é definido no exemplo a seguir.

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

Por exemplo, um componente físico pode ter medições em um banco de dados Timestream, registros de manutenção em um banco de dados SQL ou dados de alarme em sistemas de alarme. Criar vários componentes e associá-los a uma entidade vincula diferentes fontes de dados à entidade e preenche o gráfico de componente da entidade. Nesse contexto, cada componente precisa de uma telemetryId propriedade para identificar a chave exclusiva do componente na fonte de dados correspondente. Especificar a telemetryId propriedade tem dois benefícios: a propriedade pode ser usada no conector de dados como uma condição de filtro para consultar somente os valores do componente especificado e, se você incluir o valor da telemetryId propriedade na resposta da API do plano de dados, o lado do cliente obterá o ID e poderá realizar uma pesquisa inversa, se necessário.

Se você adicionar o TelemetryId ao tipo de componente como uma identificação externa, ele identificará o componente na TimeStream tabela.

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

Da mesma forma, temos o tipo de componente do WaterTank, conforme mostrado no exemplo JSON a seguir.

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

O TelemetryType é uma propriedade opcional no tipo de componente se for destinado a consultar valores de propriedades no escopo da entidade. Para ver um exemplo, consulte os tipos de componentes definidos no GitHub repositório de AWS IoT TwinMaker amostras. Existem tipos de alarme também incorporados na mesma tabela, portanto, TelemetryType é definido e você extrai propriedades comuns como TelemetryId e TelemetryType para um tipo de componente primário para outros tipos secundários compartilharem.

Exemplo de Lambda

O conector Lambda precisa acessar a fonte de dados e gerar a instrução de consulta com base na entrada e encaminhá-la para a fonte de dados. Um exemplo de solicitação enviada para o Lambda é mostrado no exemplo de JSON a seguir.

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

O objetivo da função Lambda é consultar dados históricos de medição de uma determinada entidade. AWS IoT TwinMaker fornece um mapa de propriedades do componente e você deve especificar um valor instanciado para o ID do componente. Por exemplo, para lidar com a consulta em nível de tipo de componente (que é comum em casos de uso de alarmes) e retornar o status do alarme de todos os componentes no espaço de trabalho, o mapa de propriedades tem definições de propriedades do tipo de componente.

Para o caso mais simples, como na solicitação anterior, queremos uma série de amostras de temperatura durante a janela de tempo determinada para o componente em questão, em ordem crescente. A declaração de consulta pode ser resumida da seguinte forma:

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