

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.

# Ingiera datos para AWS IoT SiteWise usar reglas AWS IoT Core
<a name="iot-rules"></a>

Envíe datos AWS IoT SiteWise desde AWS IoT objetos y otros AWS servicios mediante las reglas de AWS IoT Core. Las reglas transforman los mensajes de MQTT y realizan acciones para interactuar con AWS los servicios. La acción de la AWS IoT SiteWise regla reenvía los datos de los mensajes a la [BatchPutAssetPropertyValue](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_BatchPutAssetPropertyValue.html)operación desde la AWS IoT SiteWise API. Para obtener más información, consulte [Reglas](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html) y [Acción AWS IoT SiteWise](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html#iotsitewise-rule) en la *Guía para desarrolladores de AWS IoT *.

Si desea consultar un tutorial con los pasos necesarios para configurar una regla que ingiera datos a través de sus sombras de dispositivo, vea [Transfiere datos AWS IoT SiteWise desde cosas AWS IoT](ingest-data-from-iot-things.md).

También puedes enviar datos desde AWS IoT SiteWise otros AWS servicios. Para obtener más información, consulte [Interactúa con otros AWS servicios](interact-with-other-services.md).

**Topics**
+ [Conceda AWS IoT el acceso requerido](grant-rule-access.md)
+ [Configure la acción de la AWS IoT SiteWise regla](configure-rule-action.md)
+ [Reduzca los costes con Basic Ingest in AWS IoT SiteWise](basic-ingest-rules.md)

# Conceda AWS IoT el acceso requerido
<a name="grant-rule-access"></a>

Las funciones de IAM se utilizan para controlar los AWS recursos a los que tiene acceso cada regla. Antes de crear una regla, debe crear una función de IAM con una política que permita a la regla realizar acciones en el recurso requerido AWS . AWS IoT asume esta función al ejecutar una regla.

Si crea la acción de la regla en la AWS IoT consola, puede elegir un activo raíz para crear un rol que tenga acceso a una jerarquía de activos seleccionada. Para obtener más información sobre cómo definir manualmente un rol para una regla, consulte [Otorgar AWS IoT el acceso necesario](https://docs.aws.amazon.com/iot/latest/developerguide/iot-create-role.html) y [transferir los permisos de rol](https://docs.aws.amazon.com/iot/latest/developerguide/pass-role.html) en la *Guía para AWS IoT desarrolladores*.

Para la acción de la AWS IoT SiteWise regla, debe definir una función que permita el `iotsitewise:BatchPutAssetPropertyValue` acceso a las propiedades de los activos a las que la regla envía los datos. Para mejorar la seguridad, puede especificar una ruta jerárquica de AWS IoT SiteWise activos en la `Condition` propiedad. 

La siguiente política de confianza de ejemplo permite el acceso a un activo específico y a sus secundarios.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iotsitewise:BatchPutAssetPropertyValue",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "iotsitewise:assetHierarchyPath": [
            "/root node asset ID",
            "/root node asset ID/*"
          ]
        }
      }
    }
  ]
}
```

------

Quite `Condition` de la política para permitir el acceso a todos sus activos. La política de confianza de ejemplo siguiente permite el acceso a todos los activos de la región actual.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iotsitewise:BatchPutAssetPropertyValue",
      "Resource": "*"
    }
  ]
}
```

------

# Configure la acción de la AWS IoT SiteWise regla
<a name="configure-rule-action"></a>

La acción de la AWS IoT SiteWise regla envía los datos del mensaje MQTT que inició la regla a las propiedades del activo. AWS IoT SiteWise Puede cargar varias entradas de datos a diferentes propiedades de activos al mismo tiempo para enviar actualizaciones para 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 a 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 la API AWS IoT SiteWise]().

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 Consola de AWS IoT SiteWise. Si conoce el identificador del activo, puede utilizar el AWS CLI para llamar y [DescribeAsset](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_DescribeAsset.html)buscar 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 [Gestione los flujos de datos para AWS IoT SiteWise](manage-data-streams.md).

Para la marca temporal de cada entrada, use la marca temporal proporcionada por AWS IoT Core o que notificó su equipo. 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. Utilice las funciones del motor de AWS IoT reglas para convertir la marca de tiempo. Para obtener más información, consulte los siguientes temas:  
[Obtener marcas temporales para dispositivos que no indican la hora exacta](#rule-timestamp-function)
[Convertir las marcas temporales que están en formato de cadena](#rule-time-to-epoch-function)

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](https://docs.aws.amazon.com/iot/latest/developerguide/iot-substitution-templates.html) en la *Guía para desarrolladores de AWS IoT *.

**nota**  <a name="substitution-template-limitations"></a>
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.

**Topics**
+ [Obtener marcas temporales para dispositivos que no indican la hora exacta](#rule-timestamp-function)
+ [Convertir las marcas temporales que están en formato de cadena](#rule-time-to-epoch-function)
+ [Convertir cadenas de marcas temporales con una precisión de nanosegundos](#rule-convert-precise-timestamp-string)
+ [Ejemplo de configuraciones de regla](#rule-action-examples)
+ [Solución de problemas de la acción de regla de](#troubleshoot-rule-action)

## Obtener marcas temporales para dispositivos que no indican la hora exacta
<a name="rule-timestamp-function"></a>

[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 ().](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-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 **\$1\$1floor(timestamp() / 1E3)\$1** para convertir la hora de milisegundos a segundos.
+ En **Offset in nanos (Desfase en nanosegundos)** (`offsetInNanos`), utilice **\$1\$1(timestamp() % 1E3) \$1 1E6\$1** para calcular el desfase en nanosegundos de la marca temporal.

## Convertir las marcas temporales que están en formato de cadena
<a name="rule-time-to-epoch-function"></a>

Si su sensor o equipo notifica los datos de tiempo en formato de cadena (por ejemplo, `2020-03-03T14:57:14.699Z`), use [time\$1to\$1epoch(String, String)](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-time-to-epoch). 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 **\$1\$1floor(time\$1to\$1epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") / 1E3)\$1** para convertir la cadena de marca temporal a milisegundos, y luego a segundos.
+ En **Desfase en nanosegundos** (`offsetInNanos`), utilice **\$1\$1(time\$1to\$1epoch("2020-03-03T14:57:14.699Z", "yyyy-MM-dd'T'HH:mm:ss'Z'") % 1E3) \$1 1E6\$1** 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, configura una AWS Lambda función a la que tu regla llame 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](#rule-convert-precise-timestamp-string).

## Convertir cadenas de marcas temporales con una precisión de nanosegundos
<a name="rule-convert-precise-timestamp-string"></a>

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, use [aws\$1lambda(functionArn, inputJson)](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-func-aws-lambda) en sus parámetros de acción de regla para invocar esa función de Lambda y usar la salida en su 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 [Creación de su primera función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) en la *Guía para desarrolladores de AWS Lambda *.
AWS IoT gobierna con la acción de la AWS IoT SiteWise regla. Para obtener más información, consulte [Ingiera datos para AWS IoT SiteWise usar reglas AWS IoT Core](iot-rules.md).

**Para crear una acción de AWS IoT SiteWise regla que analice cadenas de marcas de tiempo**

1. 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 tiempo 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 salidas `timeInSeconds` y `offsetInNanos` 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 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) mediante datetime64 from.](https://numpy.org/doc/stable/reference/arrays.datetime.html) NumPy
**nota**  
Si las cadenas de marca temporal no están en formato ISO 8601, puede implementar una solución con pandas que defina el formato de la marca temporal. Para obtener más información, consulte [pandas.to\$1datetime](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)..

1. **Al configurar la AWS IoT SiteWise acción de la regla, utilice 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 en `timestamp`. La función `aws_lambda` consume una estructura JSON para su segundo parámetro, por lo que puede modificar las siguientes plantillas de sustitución en caso 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, sustituye *region* y *account-id* por tu región e ID de AWS cuenta. Si ha usado otro nombre para su función de Lambda, cámbielo también.

1. Concede AWS IoT permisos para invocar tu función con el `lambda:InvokeFunction` permiso. Para obtener más información, consulte [aws\$1lambda(functionArn, inputJson)](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-func-aws-lambda).

1. Pruebe la regla (por ejemplo, utilice el cliente de prueba AWS IoT MQTT) 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](troubleshoot-rule.md).

**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, cree 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
<a name="rule-action-examples"></a>

Esta sección contiene ejemplos de configuraciones de reglas para crear una regla con una AWS IoT SiteWise acción.

**Example 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 ())](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-topic) como alias de la propiedad para identificar las propiedades de los activos. Utilice este ejemplo para definir una regla que incorpore datos de tipo doble a todos los aerogeneradores 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 turbina eólica (por ejemplo, `/company/windfarm/3/turbine/7/temperature`) como tema para ingerir datos.  

```
{
  "type": "double",
  "value": "38.3",
  "timeInSeconds": "1581368533"
}
```

**Example 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 [marca timestamp ()](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-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íe el siguiente mensaje a `my/asset/property/topic` para ingerir datos.  

```
{
  "type": "double",
  "value": "38.3"
}
```

## Solución de problemas de la acción de regla de
<a name="troubleshoot-rule-action"></a>

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](troubleshoot-rule.md).

# Reduzca los costes con Basic Ingest in AWS IoT SiteWise
<a name="basic-ingest-rules"></a>

AWS IoT Core [proporciona una función denominada ingesta básica que puede utilizar para enviar datos AWS IoT Core sin incurrir AWS IoT en costes de mensajería.](https://aws.amazon.com/iot-core/pricing/) Basic Ingest optimiza el flujo de datos para cargas de trabajo de ingestión de datos de gran volumen al eliminar el agente de publish/subscribe mensajes de la ruta de ingestión. Puede utilizar Basic Ingest si sabe a qué reglas deben dirigirse sus mensajes.

Para utilizar Basic Ingest, se envían mensajes directamente a una regla específica utilizando un tema especial, `$aws/rules/rule-name`. Por ejemplo, para enviar un mensaje a una regla denominada `SiteWiseWindFarmRule`, envíe un mensaje al tema `$aws/rules/SiteWiseWindFarmRule`.

Si la acción de regla utiliza plantillas de sustitución que contengan [topic(Decimal)](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sql-functions.html#iot-function-topic), puede transferir el tema original al final del tema especial de Basic Ingest, como `$aws/rules/rule-name/original-topic`. Por ejemplo, para utilizar Basic Ingest con el ejemplo de alias de propiedad del parque eólico de la sección anterior, puede enviar mensajes al tema siguiente.

```
$aws/rules/SiteWiseWindFarmRule//company/windfarm/3/turbine/7/temperature
```

**nota**  
El ejemplo anterior incluye una segunda barra (`//`) porque AWS IoT elimina el prefijo Basic Ingest () del tema que está visible para la `$aws/rules/rule-name/` acción de la regla. En este ejemplo, la regla recibe el tema `/company/windfarm/3/turbine/7/temperature`.

Para obtener más información, consulte [Reducción de los costos de mensajería con Basic Ingest](https://docs.aws.amazon.com/iot/latest/developerguide/iot-basic-ingest.html) en la *Guía para desarrolladores de AWS IoT *.