Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Configure la acción de la AWS IoT SiteWise regla
La acción de la AWS IoT SiteWise regla envía los datos del MQTT mensaje que inició la regla a las propiedades del activo AWS IoT SiteWise. Puede cargar varias entradas de datos en diferentes propiedades de activos al mismo tiempo para enviar actualizaciones de todos los sensores de un dispositivo en un solo mensaje. También puede cargar varios puntos de datos a la vez para cada entrada de datos.
nota
Al enviar datos AWS IoT SiteWise con la acción de la regla, estos deben cumplir todos los requisitos de la BatchPutAssetPropertyValue
operación. Por ejemplo, los datos no pueden tener una marca temporal anterior a 7 días a partir de la hora actual en formato Unix. Para obtener más información, consulte Ingesta de datos con. AWS IoT SiteWise
API
Para cada entrada de datos de la acción de regla, se identifica una propiedad de activo y se especifica la marca temporal, la calidad y el valor de cada punto de datos para esa propiedad de activo. La acción de regla espera cadenas para todos los parámetros.
Para identificar una propiedad de activo en una entrada, puede especificar uno de los elementos siguientes:
-
El Asset ID (ID de activo) (
assetId
) y Property ID (ID de propiedad) (propertyId
) de la propiedad del activo al que está enviando los datos. Puede encontrar el ID de activo y el ID de propiedad utilizando el Consola de AWS IoT SiteWise. Si conoce el identificador del activo, puede utilizar el AWS CLI para llamar y DescribeAssetbuscar el identificador de la propiedad. -
El Property alias (Alias de propiedad) (
propertyAlias
), que es un alias de flujo de datos (por ejemplo,/company/windfarm/3/turbine/7/temperature
). Para utilizar esta opción, primero debe establecer el alias de la propiedad del activo. Para aprender a configurar los alias de las propiedades, consulte Asigne flujos de datos industriales a propiedades de activos.
Para la marca de tiempo de cada entrada, usa la marca de tiempo indicada por tu equipo o la marca de tiempo proporcionada por. AWS IoT Core La marca temporal tiene dos parámetros:
-
Tiempo en segundos (
timeInSeconds
): la hora en formato Unix, en segundos, a la que el sensor o el equipo notificó los datos. -
Desfase en nanosegundos (
offsetInNanos
): (opcional) el desfase en nanosegundos respecto al tiempo en segundos.
importante
Si la marca temporal es una cadena, tiene una parte decimal o no está en segundos, AWS IoT SiteWise rechaza la solicitud. Debe convertir la marca temporal en segundos y el desfase en nanosegundos. Usa las funciones del motor de AWS IoT reglas para convertir la marca de tiempo. Para más información, consulte los siguientes temas:
Puede utilizar plantillas de sustitución para varios parámetros para realizar cálculos, invocar funciones y extraer valores de la carga útil del mensaje. Para obtener más información, consulte Plantillas de sustitución en la Guía para desarrolladores de AWS IoT .
nota
Dado que una expresión de una plantilla de sustitución se evalúa por separado de la instrucción SELECT
, no se puede utilizar una plantilla de sustitución para hacer referencia a un alias creado mediante una cláusula AS
. Solo puede hacer referencia a la información presente en la carga original, además de a las funciones y operadores compatibles.
Temas
Obtener marcas temporales para dispositivos que no indican la hora exacta
Si su sensor o equipo no proporciona datos de tiempo precisos, obtenga la época actual de Unix desde el motor de AWS IoT reglas con timestamp (). Esta función muestra la hora en milisegundos, por lo que debe convertir el valor a tiempo en segundos y desfase en nanosegundos. Para ello, utilice las siguientes conversiones:
-
En Time in seconds (Hora en segundos) (
timeInSeconds
), utilice${floor(timestamp() / 1E3)}
para convertir la hora de milisegundos a segundos. -
En Offset in nanos (Desfase en nanosegundos) (
offsetInNanos
), utilice${(timestamp() % 1E3) * 1E6}
para calcular el desfase en nanosegundos de la marca temporal.
Convertir las marcas temporales que están en formato de cadena
Si su sensor o equipo informa los datos de tiempo en formato de cadena (por ejemplo,2020-03-03T14:57:14.699Z
), utilice time_to_epoch (String, String). Esta función introduce la marca temporal y el patrón de formato como parámetros y genera el tiempo en milisegundos. A continuación, debe convertir el tiempo en tiempo en segundos y el desfase en nanosegundos. Para ello, utilice las siguientes conversiones:
-
En Hora en segundos (
timeInSeconds
), utilice${floor(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)}
para convertir la cadena de marca temporal a milisegundos, y luego a segundos. -
En Desfase en nanosegundos (
offsetInNanos
), utilice${(time_to_epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) * 1E6}
para calcular el desfase en nanosegundos de la cadena de la marca temporal.
nota
La función time_to_epoch
admite cadenas de marcas temporales con una precisión de hasta milisegundos. Para convertir cadenas con una precisión de microsegundos o nanosegundos, configure una AWS Lambda función que la regla invoque para convertir la marca de tiempo en valores numéricos. Para obtener más información, consulte Convertir cadenas de marcas temporales con una precisión de nanosegundos.
Convertir cadenas de marcas temporales con una precisión de nanosegundos
Si su dispositivo envía información de marca temporal en formato de cadena (por ejemplo, 2020-03-03T14:57:14.699728491Z
), siga este procedimiento para configurar su acción de la regla. Puedes crear una AWS Lambda función que convierta la marca temporal de una cadena en Tiempo en segundos (timeInSeconds
) y Offset en nanos (). offsetInNanos
A continuación, utilice aws_lambda (functionArn,inputJson) en los parámetros de acción de la regla para invocar esa función Lambda y utilice el resultado en la regla.
nota
En esta sección se incluyen instrucciones avanzadas que suponen que está familiarizado con la forma de crear estos recursos:
-
Funciones de Lambda. Para obtener más información, consulte Crear su primera función Lambda en la Guía para AWS Lambda desarrolladores.
-
AWS IoT reglas con la acción de AWS IoT SiteWise regla. Para obtener más información, consulte Ingiera datos mediante reglas AWS IoT Core.
Para crear una acción de AWS IoT SiteWise regla que analice cadenas de marcas de tiempo
-
Cree una función de Lambda con las siguientes propiedades:
-
Nombre de la función: utilice un nombre de función descriptivo (por ejemplo,
ConvertNanosecondTimestampFromString
). -
Tiempo de ejecución: utilice un entorno de ejecución de Python 3, como Python 3.11 (
python3.11
). -
Permisos: cree un rol con permisos Lambda básicos () AWS LambdaBasicExecutionRole.
-
Capas: añada la capa AWS SDKPandas-Python311 para que la utilice la función Lambda.
numpy
-
Código de función: utilice el siguiente código de función, que consume un argumento de cadena denominado
timestamp
y las salidastimeInSeconds
yoffsetInNanos
los valores de esa marca temporal.import json import math import numpy # Converts a timestamp string into timeInSeconds and offsetInNanos in Unix epoch time. # The input timestamp string can have up to nanosecond precision. def lambda_handler(event, context): timestamp_str = event['timestamp'] # Parse the timestamp string as nanoseconds since Unix epoch. nanoseconds = numpy.datetime64(timestamp_str, 'ns').item() time_in_seconds = math.floor(nanoseconds / 1E9) # Slice to avoid precision issues. offset_in_nanos = int(str(nanoseconds)[-9:]) return { 'timeInSeconds': time_in_seconds, 'offsetInNanos': offset_in_nanos }
Esta función Lambda introduce cadenas de marcas de tiempo en formato ISO8601
mediante datetime64 from. NumPy nota
Si las cadenas de marca de tiempo no están en el formato ISO 8601, puede implementar una solución que defina el formato de marca de tiempo. pandas Para obtener más información, consulte pandas.to_datetime
..
-
-
Cuando configures la AWS IoT SiteWise acción de tu regla, usa las siguientes plantillas de sustitución para Time in seconds (
timeInSeconds
) y Offset in nanos ().offsetInNanos
Estas plantillas de sustitución suponen que su carga de mensaje contiene la cadena de marca temporal entimestamp
. Laaws_lambda
función utiliza una JSON estructura para su segundo parámetro, por lo que puedes modificar las siguientes plantillas de sustitución si es necesario.-
En Time in seconds (Tiempo en segundos) (
timeInSeconds
), use la siguiente plantilla de sustitución.${aws_lambda('arn:aws:lambda:
region
:account-id
:function:ConvertNanosecondTimestampFromString
', {'timestamp': timestamp}).timeInSeconds} -
En Offset in nanos (Desfase en nanosegundos) (
offsetInNanos
), use la siguiente plantilla de sustitución.${aws_lambda('arn:aws:lambda:
region
:account-id
:function:ConvertNanosecondTimestampFromString
', {'timestamp': timestamp}).offsetInNanos}
Para cada parámetro, sustituya
region
yaccount-id
con tu región y tu ID de AWS cuenta. Si ha usado otro nombre para su función de Lambda, cámbielo también. -
-
Concede AWS IoT permisos para invocar tu función con el
lambda:InvokeFunction
permiso. Para obtener más información, consulte aws_lambda (,). functionArn inputJson -
Pruebe la regla (por ejemplo, utilice el cliente de AWS IoT MQTT prueba) y compruebe que AWS IoT SiteWise recibe los datos que envía.
Si su regla no funciona según lo previsto, consulte Solucionar problemas con una acción de AWS IoT SiteWise regla.
nota
Esta solución invoca la función de Lambda dos veces para cada cadena de marca temporal. Puede crear otra regla para reducir el número de invocaciones de funciones de Lambda si su regla gestiona varios puntos de datos que tienen la misma marca temporal en cada carga.
Para ello, cree una regla con una acción de volver a publicar que invoca Lambda y publica la carga original con la cadena de marca temporal convertida en timeInSeconds
y offsetInNanos
. A continuación, crea una regla con una acción de AWS IoT SiteWise regla para consumir la carga útil convertida. Con este enfoque, se reduce el número de veces que la regla invoca la Lambda, pero se aumenta el número de acciones AWS IoT de la regla que se ejecutan. Considere los precios de cada servicio si aplica esta solución a su caso de uso.
Ejemplo de configuraciones de regla
Esta sección contiene ejemplos de configuraciones de reglas para crear una regla con una AWS IoT SiteWise acción.
ejemplo Acción de regla de ejemplo que utiliza alias de propiedad como temas de mensaje
En el siguiente ejemplo, se crea una regla con una AWS IoT SiteWise acción que utiliza el tema (a través del tema ()) como alias de la propiedad para identificar las propiedades de los activos. Utilice este ejemplo para definir una regla para transferir datos de tipo doble a todas las turbinas eólicas de todos los parques eólicos. Este ejemplo requiere que defina alias de propiedad en todas las propiedades de los activos de la turbina. Necesitaría definir una segunda regla similar para ingerir datos de tipo entero.
aws iot create-topic-rule \ --rule-name SiteWiseWindFarmRule \ --topic-rule-payload file://sitewise-rule-payload.json
La carga de ejemplo en sitewise-rule-payload.json
contiene el siguiente contenido.
{ "sql": "SELECT * FROM '/company/windfarm/+/turbine/+/+' WHERE type = 'double'", "description": "Sends data to the wind turbine asset property with the same alias as the topic", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "propertyAlias": "${topic()}", "propertyValues": [ { "timestamp": { "timeInSeconds": "${timeInSeconds}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::
account-id
:role/MySiteWiseActionRole
" } } ] }
Con esta acción de regla, envíe el siguiente mensaje a un alias de propiedad de una turbina eólica (por ejemplo,/company/windfarm/3/turbine/7/temperature
) como tema para ingerir datos.
{ "type": "double", "value": "38.3", "timeInSeconds": "1581368533" }
ejemplo Ejemplo de acción de regla que utiliza timestamp() para determinar la hora
En el siguiente ejemplo, se crea una regla con una AWS IoT SiteWise acción que identifica una propiedad de activo mediante timestamp () IDs y utiliza la función timestamp () para determinar la hora actual.
aws iot create-topic-rule \ --rule-name SiteWiseAssetPropertyRule \ --topic-rule-payload file://sitewise-rule-payload.json
La carga de ejemplo en sitewise-rule-payload.json
contiene el siguiente contenido.
{ "sql": "SELECT * FROM 'my/asset/property/topic'", "description": "Sends device data to an asset property", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "iotSiteWise": { "putAssetPropertyValueEntries": [ { "assetId": "a1b2c3d4-5678-90ab-cdef-22222EXAMPLE", "propertyId": "a1b2c3d4-5678-90ab-cdef-33333EXAMPLE", "propertyValues": [ { "timestamp": { "timeInSeconds": "${floor(timestamp() / 1E3)}", "offsetInNanos": "${(timestamp() % 1E3) * 1E6}" }, "value": { "doubleValue": "${value}" } } ] } ], "roleArn": "arn:aws:iam::
account-id
:role/MySiteWiseActionRole
" } } ] }
Con esta acción de regla, envía el siguiente mensaje al para que ingiera my/asset/property/topic
los datos.
{ "type": "double", "value": "38.3" }
Solución de problemas de la acción de regla de
Para solucionar la acción de la AWS IoT SiteWise regla AWS IoT Core, configura CloudWatch los registros o configura una acción de error al volver a publicar la regla. Para obtener más información, consulte Solucionar problemas con una acción de AWS IoT SiteWise regla.