

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.

# Puertas de enlace V3 habilitadas para MQTT para Edge AWS IoT SiteWise
<a name="mqtt-enabled-v3-gateway"></a>

AWS IoT SiteWise puede utilizar puertas de enlace V3 habilitadas para MQTT, lo que representa un avance significativo en la arquitectura de puerta de enlace Edge. SiteWise Este tipo de puerta de enlace aprovecha el protocolo MQTT (Message Queuing Telemetry Transport) para la comunicación de datos, lo que proporciona una mayor flexibilidad y eficiencia en las implementaciones de IoT industrial.

La puerta de enlace V3, compatible con MQTT, utiliza MQTT para la transferencia de datos, lo que permite un protocolo de red ligero de publicación y suscripción que transporta los mensajes de manera eficiente entre los dispositivos y la nube. Puede configurar varios destinos de datos, incluida la ingesta de datos en tiempo real directamente AWS IoT SiteWise y la ingesta de datos en búfer mediante Amazon S3. Para permitir una recopilación de datos precisa, puede implementar filtros de ruta para suscribirse a temas específicos de MQTT.

Las pasarelas V3, habilitadas para MQTT, vienen con un destino en tiempo real preconfigurado con filtros configurados en «\$1» (todos los temas), que puede personalizar o eliminar según sea necesario. Para agilizar la administración de datos, solo puede existir un destino en tiempo real en cada puerta de enlace.

La arquitectura compatible con MQTT difiere considerablemente de la pasarela Classic Streams, V2. Mientras que la V2 utiliza un enfoque basado en flujos, la V3 emplea MQTT, que ofrece destinos de datos y opciones de filtrado más configurables. Sin embargo, tenga en cuenta que la V3 no es compatible con el paquete de procesamiento de datos, que está disponible en la V2.

La puerta de enlace V3 habilitada para MQTT ofrece varias ventajas: 
+ Escalabilidad mejorada, debido a la naturaleza liviana del MQTT, que permite un mejor manejo de numerosos dispositivos y una transmisión de datos de alta frecuencia.
+ Control de datos mejorado mediante filtros de ruta, lo que permite una gestión pormenorizada de la recopilación de datos y reduce la transferencia y el procesamiento innecesarios de datos.
+ Gestión flexible de los datos, que permite configurar entre el procesamiento en tiempo real y el almacenamiento en búfer en función de las necesidades específicas.
+ Alineación con los estándares modernos de comunicación de IoT, preparando el terreno para futuras mejoras e integraciones.

Considere la posibilidad de adoptar la puerta de enlace V3 compatible con MQTT para las nuevas implementaciones, especialmente cuando necesite opciones flexibles de ingesta de datos y un control preciso de la recopilación de datos.

**nota**  
Para las implementaciones o escenarios existentes que requieren el paquete de procesamiento de datos, la pasarela Classic Streams y V2 sigue siendo una opción viable.

Al ofrecer ambos tipos de puertas de enlace, AWS IoT SiteWise garantiza que pueda elegir la solución que mejor se adapte a sus necesidades específicas de IoT industrial, ya sea que priorice las capacidades avanzadas de MQTT o la compatibilidad con los sistemas existentes.

## Filtros de destinos y rutas
<a name="create-destination-summary"></a>

Consulte los siguientes temas para obtener más información sobre los filtros de destinos y rutas en las pasarelas habilitadas para MQTT:
+ [Comprenda los destinos de AWS IoT SiteWise Edge](gw-destinations.md#source-destination)
+ [Agregue un destino de AWS IoT SiteWise Edge en tiempo real](destinations-real-time.md)
+ [Añadir un destino almacenado en AWS IoT SiteWise búfer mediante Amazon S3](destinations-buffered.md)
+ [Conozca los filtros de ruta para los destinos de AWS IoT SiteWise EdgeEntendimiento de filtros de ruta](gw-destinations.md#destinations-path-filters)
+ [Agregue filtros de ruta a los destinos de AWS IoT SiteWise Edge](destinations-add-path-filters.md)
+ [Administre los destinos de AWS IoT SiteWise Edge](destinations-manage.md)

# Connect aplicaciones externas al broker EMQX
<a name="connect-external-applications-emqx"></a>

Esta guía explica cómo conectar aplicaciones externas a su puerta de enlace AWS IoT SiteWise Edge a través de un intermediario EMQX en su puerta de enlace V3 implementada y habilitada para MQTT. Las aplicaciones externas pueden incluir herramientas de monitoreo personalizadas, software de visualización de terceros o sistemas heredados que necesitan interactuar con sus datos industriales en la periferia.

Abordaremos los pasos de configuración tanto para Linux como para Microsoft Windows entornos, incluida la configuración de implementación de EMQX, la configuración de TLS para conexiones seguras y las reglas de autorización para controlar el acceso a temas específicos.

**nota**  
EMQX no es un vendedor ni proveedor de Edge. AWS IoT SiteWise 

**importante**  
Para proteger las conexiones a su puerta de enlace, le recomendamos encarecidamente que utilice la autenticación basada en certificados a través de la función de autenticación del dispositivo AWS IoT Greengrass cliente. Este método proporciona una seguridad sólida mediante la autenticación TLS mutua (mTLS). Para obtener más información, consulte [Conectar dispositivos cliente a dispositivos principales](https://docs.aws.amazon.com/greengrass/v2/developerguide/connect-client-devices.html) en la *Guía para AWS IoT Greengrass Version 2 desarrolladores*.

Si no puede utilizar la autenticación basada en certificados, siga esta guía para configurar la autenticación mediante nombres de usuario y contraseñas.

## Requisitos previos
<a name="emqx-broker-prerequisites"></a>
+ Una puerta de enlace V3 habilitada para SiteWise Edge MQTT que se ha implementado y está en línea
+ Acceso al host de la puerta de enlace
+ Acceso a las AWS IoT Greengrass consolas AWS IoT SiteWise y

**Topics**
+ [Requisitos previos](#emqx-broker-prerequisites)
+ [Formato de carga útil de mensajes para el broker EMQX en Edge AWS IoT SiteWise](connect-broker-payload-format.md)
+ [Configure el bróker EMQX](configure-emqx-broker.md)
+ [Conecte una aplicación al bróker EMQX en Edge AWS IoT SiteWise](connect-app-to-broker.md)
+ [Configure las reglas de autorización para AWS IoT SiteWise Edge en EMQX](authorization-rules-emqx-broker.md)

# Formato de carga útil de mensajes para el broker EMQX en Edge AWS IoT SiteWise
<a name="connect-broker-payload-format"></a>

Para que el componente de SiteWise editor de IoT consuma datos de su aplicación externa y los publique AWS IoT SiteWise en la nube, la carga útil enviada al intermediario debe cumplir requisitos específicos.

Comprender el formato de la carga útil es clave para una comunicación exitosa de MQTT con Edge. AWS IoT SiteWise Si bien el proceso de configuración de la conexión se explica en secciones posteriores, primero presentamos los requisitos de carga útil para ayudarlo a planificar su implementación.

## Requisitos del tema MQTT
<a name="connect-broker-mqtt-requirements"></a>

No hay restricciones en la estructura de los temas de MQTT, incluida la cantidad de niveles o caracteres utilizados. Sin embargo, recomendamos que el tema coincida con el `propertyAlias` campo de la carga útil.

**Example Ejemplo de alias de propiedad**  
Si el tema de MQTT es`site1/line1/compressor1/temperature`, asegúrese de que `propertyAlias` coincidan.  

```
{
  "assetId": "compressor_asset_01",
  "propertyAlias": "site1/line1/compressor1/temperature",
  "propertyId": "temperature_sensor_01",
  "propertyValues": [
    {
      "quality": "GOOD",
      "timestamp": {
        "offsetInNanos": 0,
        "timeInSeconds": 1683000000
      },
      "value": {
        "doubleValue": 23.5
      }
    }
  ]
}
```

## Estructura de carga útil de JSON
<a name="connect-broker-json-payload"></a>

[La carga útil de los mensajes MQTT está escrita en JSON y sigue el formato de `PutAssetPropertyValueEntry` mensaje definido en la referencia de la AWS IoT SiteWise API.](https://docs.aws.amazon.com/iot-sitewise/latest/APIReference/API_PutAssetPropertyValueEntry.html)

```
{
   "assetId": "string",
   "propertyAlias": "string",
   "propertyId": "string",
   "propertyValues": [
      {
         "quality": "string",
         "timestamp": {
            "offsetInNanos": number,
            "timeInSeconds": number
         },
         "value": {
            "booleanValue": boolean,
            "doubleValue": number,
            "integerValue": number,
            "stringValue": "string"
         }
      }
   ]
}
```

**nota**  
Para que un mensaje se considere válido, solo se puede cumplir una de las siguientes condiciones:  
El `propertyAlias` está establecido, o
Ambos `assetId` y `propertyId` están configurados
`PutAssetPropertyValueEntry`Tiene un `entryId` campo que no es obligatorio en este contexto.

# Configure el bróker EMQX
<a name="configure-emqx-broker"></a>

En esta sección se explica cómo añadir nombres de usuario y contraseñas. También explica cómo establecer una conexión TLS desde una fuente externa utilizando el nombre de usuario y la contraseña agregados. Puede configurar el broker EMQX mediante Linux o. Microsoft Windows

**nota**  
Para configurar el broker, necesita un dispositivo central que esté configurado con la configuración EMQX predeterminada en su puerta de enlace V3 habilitada para MQTT.

**importante**  
Tras completar este procedimiento, le recomendamos encarecidamente que configure las reglas de autorización. Para obtener más información, consulte [Configure las reglas de autorización para AWS IoT SiteWise Edge en EMQX](authorization-rules-emqx-broker.md). Las reglas de autorización para los usuarios adicionales mejoran la seguridad. 

## Actualice la configuración de despliegue de EMQX para la autenticación
<a name="update-emqx-broker-authentication"></a>

**Para actualizar la configuración de despliegue de EMQX para la autenticación**

1. <a name="sitewise-open-console"></a>Vaya a la [consola de AWS IoT SiteWise](https://console.aws.amazon.com/iotsitewise/).

1. **En el panel de navegación de la izquierda, elija **las puertas de enlace Edge** en la sección Edge.**

1. Elija la puerta de enlace que desee configurar.

1. En la sección de **configuración de la puerta de enlace Edge**, copia el valor de tu **dispositivo principal de Greengrass**. Guárdelo para usarlo más adelante.

1. Abra la [consola de AWS IoT](https://console.aws.amazon.com/iot/).

1. **En el menú de navegación de la izquierda, en la sección **Administrar**, selecciona **dispositivos Greengrass** y, a continuación, Implementaciones.**

1. Busque el valor del dispositivo principal que guardó anteriormente y elija ese enlace para abrir la implementación.

1. Selecciona el botón desplegable **Acciones** y, a continuación, **Revisa**.

1. Lea el mensaje que aparece y, a continuación, seleccione **Revisar el despliegue**. Aparece la página **Especificar el destino**.

1. Elija **Siguiente** hasta llegar al paso **Configurar componentes**.

1. Seleccione el botón de opción `aws.greengrass.clientdevices.mqtt.EMQX`.

1. Pulse el botón **Configurar componente**. Aparece una página de configuración para el componente.

1. En **Actualización de la configuración**, seleccione **Restablecer la configuración predeterminada para la versión del componente: 2.\$1. **\$1.

1. Introduzca la siguiente configuración en la sección **Configuración para fusionar** en función de su sistema operativo.

------
#### [ Linux ]

   ```
   {
       "emqxConfig": {
           "authorization": {
               "no_match": "allow"
           },
           "listeners": {
               "tcp": {
                   "default": {
                       "enabled": true,
                       "enable_authn": false
                   }
               },
               "ssl": {
                   "default": {
                       "enabled": true,
                       "enable_authn": true,
                       "ssl_options": {
                           "verify": "verify_none",
                           "fail_if_no_peer_cert": false
                       }
                   }
               }
           },
           "authentication": {
               "enable": true,
               "backend": "built_in_database",
               "mechanism": "password_based",
               "password_hash_algorithm": {
                   "iterations": 210000,
                   "mac_fun": "sha512",
                   "name": "pbkdf2"
               },
               "user_id_type": "username"
           },
           "dashboard": {
               "listeners": {
                   "http": {
                       "bind": 18083
                   }
               }
           }
       },
       "authMode": "bypass",
       "dockerOptions": "-p 8883:8883 -p 127.0.0.1:1883:1883 -p 127.0.0.1:18083:18083 -v emqx-data:/opt/emqx/data -e EMQX_NODE__NAME=emqx@local",
       "requiresPrivilege": "true"
   }
   ```

------
#### [ Windows ]

   ```
   {
       "emqxConfig": {
           "authorization": {
               "no_match": "allow"
           },
           "listeners": {
               "tcp": {
                   "default": {
                       "enabled": true,
                       "enable_authn": false
                   }
               },
               "ssl": {
                   "default": {
                       "enabled": true,
                       "enable_authn": true,
                       "ssl_options": {
                           "verify": "verify_none",
                           "fail_if_no_peer_cert": false
                       }
                   }
               }
           },
           "authentication": {
               "enable": true,
               "backend": "built_in_database",
               "mechanism": "password_based",
               "password_hash_algorithm": {
                   "iterations": 210000,
                   "mac_fun": "sha512",
                   "name": "pbkdf2"
               },
               "user_id_type": "username"
           },
           "dashboard": {
               "listeners": {
                   "http": {
                       "bind": 18083
                   }
               }
           }
       },
       "authMode": "bypass",
       "requiresPrivilege": "true"
   }
   ```

   El `dockerOptions` campo es solo para pasarelas de Linux.

------

1. Elija **Confirmar**.

1. Seleccione **Siguiente** hasta llegar al paso de **revisión**.

1. Elija **Implementar**.

1. Una vez que la implementación se haya realizado correctamente, continúe con el siguiente paso.

## Habilite la autenticación de nombre de usuario y contraseña
<a name="emqx-broker-username-password-auth"></a>

En esta sección, se muestra cómo añadir nombres de usuario y contraseñas a través de la GUI del panel de EMQX.

**nota**  
Las instrucciones relacionadas con EMQX que se proporcionan son solo de referencia. Como la documentación y las funciones de EMQX pueden cambiar con el tiempo y no mantenemos su documentación, recomendamos consultar la documentación [oficial de EMQX para obtener la](https://docs.emqx.com/en/emqx/latest/) información más actualizada.

------
#### [ EMQX Dashboard ]

**Para habilitar la autenticación de nombre de usuario y contraseña a través del panel de EMQX**

1. Asegúrese de estar dentro del host de la puerta de enlace.

1. Abra una ventana del navegador y visite [http://localhost:18083/](http://localhost:18083/).

1. Introduzca el nombre de usuario **admin** y la contraseña predeterminados de**public**. Para obtener más información, consulte el [panel de control de EMQX](https://docs.emqx.com/en/emqx/latest/dashboard/introduction.html#first-login) en los documentos de *EMQX*.

1. Después de iniciar sesión, se le solicitará que cambie su contraseña. Actualice su contraseña para continuar con el panel de control de EMQX.

1. **En el menú de navegación de la izquierda, seleccione el icono del escudo y, a continuación, Autenticación.**

1. En la fila **Base de datos integrada**, pulse el botón **Usuarios**.

1. Pulse el botón con el icono del signo más para añadir usuarios. Aparece la pantalla **Añadir**.

1. Introduzca un nombre de usuario y una contraseña para el usuario de la aplicación externa.

1. Seleccione **Save**. El nombre de usuario que eligió aparece en la tabla de la página de **autenticación**.

**nota**  
Las reglas de autorización existentes o predeterminadas se aplican al nuevo usuario. Se recomienda revisarlas y ajustarlas a las necesidades de las aplicaciones externas.

------
#### [ EMQX Management with Linux ]

Utilice la herramienta AWS IoT SiteWise CLI de EMQX en. `/greengrass/v2/bin/swe-emqx-cli`

**Para habilitar la autenticación de nombre de usuario y contraseña mediante EMQX Management mediante Linux**

1. Cambie la contraseña de administrador ejecutando el siguiente comando:

   ```
   /greengrass/v2/bin/swe-emqx-cli admin change-pwd
   ```

1. Cuando se le solicite, haga lo siguiente:

   1. Introduzca su usuario administrador actual (el predeterminado es`admin`) y la contraseña (el predeterminado es`public`).

   1. Introduzca y confirme su nueva contraseña.

   Si se ejecuta correctamente, aparecerá el siguiente mensaje:

   ```
   admin password changed successfully
   ```

1. Añada usuarios para aplicaciones externas ejecutando el siguiente comando:

   ```
   /greengrass/v2/bin/swe-emqx-cli users add
   ```

1. Cuando se le solicite, haga lo siguiente:

   1. Introduzca el nombre de usuario del nuevo usuario.

   1. Introduzca y confirme la contraseña del nuevo usuario.

   Si se ejecuta correctamente, aparecerá el siguiente mensaje:

   ```
   User '[username]' created successfully
   ```

1. Compruebe la configuración del usuario ejecutando el siguiente comando:

   ```
   /greengrass/v2/bin/swe-emqx-cli users list
   ```

   El resultado muestra todos los usuarios configurados:

   ```
   Users:
   - [your-added-username]
   
   Total users: 1
   ```

------
#### [ EMQX Management with Windows ]

Utilice la herramienta AWS IoT SiteWise CLI de EMQX en una de las siguientes ubicaciones:
+ PowerShell: `C:\greengrass\v2\bin\swe-emqx-cli.ps1`
+ Línea de comandos: `C:\greengrass\v2\bin\swe-emqx-cli.bat`

**Para habilitar la autenticación de nombre de usuario y contraseña mediante la administración de EMQX mediante Windows**

1. Cambie la contraseña de administrador ejecutando el siguiente comando:

   ```
   C:\greengrass\v2\bin\swe-emqx-cli.ps1 admin change-pwd
   ```

1. Cuando se le solicite, haga lo siguiente:

   1. Introduzca su usuario administrador actual (el predeterminado es`admin`) y la contraseña (el predeterminado es`public`).

   1. Introduzca y confirme su nueva contraseña.

   Si se ejecuta correctamente, aparecerá el siguiente mensaje:

   ```
   admin password changed successfully
   ```

1. Añada usuarios para aplicaciones externas ejecutando el siguiente comando:

   ```
   C:\greengrass\v2\bin\swe-emqx-cli.ps1 users add
   ```

1. Cuando se le solicite, haga lo siguiente:

   1. Introduzca el nombre de usuario del nuevo usuario.

   1. Introduzca y confirme la contraseña del nuevo usuario.

   Si se ejecuta correctamente, aparecerá el siguiente mensaje:

   ```
   User '[username]' created successfully
   ```

1. Compruebe la configuración del usuario ejecutando el siguiente comando:

   ```
   C:\greengrass\v2\bin\swe-emqx-cli.ps1 users list
   ```

   El resultado muestra todos los usuarios configurados:

   ```
   Users:
   - [your-added-username]
   
   Total users: 1
   ```

------

# Conecte una aplicación al bróker EMQX en Edge AWS IoT SiteWise
<a name="connect-app-to-broker"></a>

El broker EMQX utiliza Transport Layer Security (TLS) en el puerto 8883 para cifrar todas las comunicaciones, lo que garantiza que sus datos permanezcan protegidos durante la transmisión. En esta sección, se explican los pasos para establecer conexiones entre sus aplicaciones y el bróker EMQX. Seguir estos pasos ayuda a mantener la integridad y confidencialidad de sus datos industriales. El proceso de conexión implica dos enfoques principales: utilizar la detección automática de IP a través de componentes o configurar manualmente los nombres DNS y las direcciones IP como nombres alternativos del sujeto (SANs) en los certificados TLS. Cada método tiene sus propias ventajas en función de la configuración de la red y de los requisitos de seguridad. Esta documentación lo guiará a través de ambas opciones.

**Topics**
+ [Configure TLS para establecer conexiones seguras con el intermediario EMQX en Edge AWS IoT SiteWise](#configure-tls-emqx-broker)
+ [Pruebe la conexión del broker EMQX en Edge AWS IoT SiteWise](#test-emqx-connection)
+ [Utilice su propia CA](#configure-tls-custom-ca)
+ [Abra el puerto 8883 para las conexiones de firewall externas](#emqx-firewall)

## Configure TLS para establecer conexiones seguras con el intermediario EMQX en Edge AWS IoT SiteWise
<a name="configure-tls-emqx-broker"></a>

De forma predeterminada, AWS IoT Greengrass genera un certificado de servidor TLS para el broker EMQX firmado por la autoridad de certificación (CA) del dispositivo principal. Para obtener más información, consulte [Conectar dispositivos cliente a un dispositivo AWS IoT Greengrass Core con un agente MQTT](https://docs.aws.amazon.com/greengrass/v2/developerguide/connecting-to-mqtt.html).

### Recupere el certificado TLS
<a name="configure-tls-retrieve-certificate"></a>

Para obtener el certificado de CA, ejecute el siguiente comando en el host de la puerta de enlace:

------
#### [ Linux ]

Ejecute el siguiente comando en una sesión de shell en el host de la puerta de enlace:

```
/greengrass/v2/bin/swe-emqx-cli cert
```

Este comando muestra la ubicación del certificado e imprime su contenido.

También puede guardar el certificado en un archivo mediante este comando:

```
/greengrass/v2/bin/swe-emqx-cli cert --output /path/to/certificate.pem
```

------
#### [ Windows ]

Ejecute el siguiente comando en una PowerShell sesión en el host de la puerta de enlace:

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 cert
```

Este comando muestra la ubicación del certificado e imprime su contenido.

También puede guardar el certificado en un archivo mediante este comando:

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 cert --output C:\path\to\certificate.pem
```

La CLI localiza automáticamente el certificado independientemente de la ruta exacta del sistema.

------

Copie el contenido del archivo ca.pem a la aplicación externa que va a conectar al agente. Guárdelo como `BrokerCoreDeviceCA.pem`.

### Agregue names/IP direcciones DNS personalizadas al certificado del servidor TLS
<a name="configure-tls-custom-dns-ip"></a>

El nombre alternativo (SAN) del sujeto del certificado generado por AWS IoT Greengrass es. `localhost` Al establecer una conexión TLS desde fuera del host de la puerta de enlace, se produce un error en el paso de verificación de TLS porque el nombre de host del intermediario no coincide con el nombre de host del certificado del `localhost` servidor.

Para solucionar el problema de los nombres de host no coincidentes, AWS IoT Greengrass proporciona dos formas de administrar los puntos finales de los dispositivos principales. En esta sección se describen ambas opciones. Para obtener información más detallada, consulte [Administrar los terminales de los dispositivos principales](https://docs.aws.amazon.com/greengrass/v2/developerguide/manage-core-device-endpoints.html) en la *Guía para AWS IoT Greengrass Version 2 desarrolladores*.
+ Para conectarse al agente EMQX mediante la dirección IP del dispositivo principal, utilice la sección Detección automática de IP.
+ Para conectarse al agente EMQX mediante un nombre DNS en lugar de una dirección IP, utilice la sección de administración manual.

------
#### [ Automated IP discovery ]

Esta opción permite que el dispositivo principal descubra automáticamente su dirección IP y la añada como nombre alternativo del sujeto (SAN) al certificado del agente.

1. Añada el `aws.greengrass.clientdevices.IPDetector` componente a la implementación de su dispositivo principal.

1. Implemente los cambios en su dispositivo

1. Espere a que se complete el despliegue.

   Una vez completada la implementación, puede establecer una conexión TLS segura mediante la dirección IP del intermediario.

   La dirección IP se agrega automáticamente como SAN al certificado del corredor.

------
#### [ Manual DNS and IP Configuration ]

Puede agregar manualmente nombres DNS y direcciones IP como nombres alternativos del asunto (SANs) a su certificado TLS. Este método resulta útil cuando ha configurado un nombre DNS para el host de la puerta de enlace.

**importante**  
Si utiliza el IPDetector componente, elimínelo de la implementación antes de continuar. El IPDetector componente anula las configuraciones manuales de los puntos finales.

**Para configurar manualmente los puntos finales**

1. <a name="sitewise-open-console"></a>Vaya a la [consola de AWS IoT SiteWise](https://console.aws.amazon.com/iotsitewise/).

1. En el panel de navegación de la izquierda, elija **las puertas de enlace Edge** en la sección **Edge**.

1. Elija la puerta de enlace que desee configurar.

1. En la sección de **configuración de la puerta de enlace Edge**, elija la URL de su **dispositivo principal de Greengrass**. Aparece la página del dispositivo principal.

1. Seleccione la pestaña **Dispositivos cliente**.

1. Seleccione **Administrar puntos de conexión**.

1. En el cuadro de diálogo Administrar puntos de conexión, introduzca los nombres DNS y las direcciones IP que desee SANs añadir. Utilice el puerto 8883.

1. Elija **Actualizar**.

El certificado del servidor TLS del bróker se actualiza automáticamente para incluir sus nuevos puntos de conexión.

**Para verificar la actualización del certificado del servidor TLS mediante Linux**

1. Inicie una sesión de shell en el host de la puerta de enlace.

   ```
   docker exec emqx openssl x509 -in ./data/cert.pem -text -noout | grep -A1 "Subject Alternative Name"
   ```

1. El comando devuelve un resultado similar al siguiente:

   ```
   X509v3 Subject Alternative Name: 
   DNS:endpoint_you_added, DNS:localhost
   ```

1. Compruebe que su punto final aparezca en la lista de SANs.

**Para comprobar la actualización del certificado del servidor TLS mediante Windows**

1. Inicie una sesión de shell en el host de la puerta de enlace.

   ```
   (Get-PfxCertificate -FilePath "C:\greengrass\v2\work\aws.greengrass.clientdevices.mqtt.EMQX\v2\data\cert.pem").Extensions | Where-Object { $_.Oid.FriendlyName -eq "Subject Alternative Name" } | ForEach-Object { "Subject Alternative Name:", ($_.Format($true) -split "`n")[0..1] }
   ```

1. El comando devuelve un resultado similar al siguiente:

   ```
   Subject Alternative Name:
   DNS Name=your-endpoint
   DNS Name=localhost
   ```

1. Compruebe que el punto final que agregó esté en la lista de SANs.

------

## Pruebe la conexión del broker EMQX en Edge AWS IoT SiteWise
<a name="test-emqx-connection"></a>

Tras configurar su agente EMQX con certificados TLS y credenciales de autenticación, es importante comprobar que la configuración funciona correctamente. Probar la conexión ayuda a garantizar que las configuraciones de seguridad se implementen correctamente y que los clientes puedan establecer correctamente conexiones cifradas con el intermediario. En esta sección se muestra cómo probar la conexión de su intermediario mediante el cliente de interfaz de línea de comandos (CLI) de Mosquitto, una herramienta de cliente MQTT muy utilizada que admite el cifrado y la autenticación TLS.

### Utilice el cliente CLI de Mosquitto para probar la conexión del broker EMQX
<a name="test-emqx-connection-mosquitto"></a>

En este paso, utilizaremos el cliente CLI mosquitto para probar nuestra configuración y asegurarnos de que podemos conectarnos correctamente al corredor con el nombre de usuario y la contraseña que creamos anteriormente. Para obtener los `BrokerCoreDeviceCA.pem` siguientes pasos, consulte el Paso 3: Configuración de TLS.

```
mosquitto_sub -h hostname|ip address \
    -p 8883 \
    -t "#" \
    -q 1 \
    -u username -P password \
    --cafile BrokerCoreDeviceCA.pem
```

**nota**  
Es posible que aparezca un error SSL:Verify si la hostname/IP dirección a la que se está conectando no coincide con el nombre alternativo (SAN) del sujeto que figura en el certificado de CA que está transmitiendo al cliente. Consulte la sección «Añadir names/IP direcciones DNS personalizadas al certificado del servidor TLS» en el Paso 3: Configuración de TLS para obtener un certificado con la SAN correcta.

En este punto, todos los usuarios tienen acceso a publicar y suscribirse a todos los temas del intermediario. Continúe en [Configure las reglas de autorización para AWS IoT SiteWise Edge en EMQX](authorization-rules-emqx-broker.md).

## Utilice su propia CA
<a name="configure-tls-custom-ca"></a>

AWS IoT Greengrass describe cómo configurar su propio componente de autenticación del dispositivo cliente para que utilice su propia autoridad de certificación (CA). El componente de autenticación del dispositivo de cliente (`aws.greengrass.clientdevices.Auth`) autentica los dispositivos de cliente y autoriza las acciones de los dispositivos de cliente. Para obtener más información, consulte [Uso de su propia autoridad de certificación](https://docs.aws.amazon.com/greengrass/v2/developerguide/connecting-to-mqtt.html#use-your-own-CA) en la *Guía para AWS IoT Greengrass Version 2 desarrolladores*.

Para usar su propia CA, añada el `aws.greengrass.clientdevices.Auth` componente a su implementación para poder especificar una configuración personalizada.

## Abra el puerto 8883 para las conexiones de firewall externas
<a name="emqx-firewall"></a>

------
#### [ Linux ]

En la regla de firewall de su host Linux, añada una regla de entrada para el puerto 8883 a fin de permitir las conexiones entrantes desde fuera del host de la puerta de enlace. Si hay algún firewall instalado, asegúrese de que se permitan las conexiones TLS entrantes en el puerto 8883.

------
#### [ Windows ]

En la regla de firewall del Microsoft Windows host, añada una regla de entrada para el puerto 8883 a fin de permitir las conexiones entrantes desde fuera del host de la puerta de enlace. Asegúrese de que la regla sea una regla de permiso, del tipo puerto, que especifique el puerto 8883. Puede configurarlo de acuerdo con la configuración de su red para permitir las conexiones desde sus aplicaciones externas al intermediario.

------

# Configure las reglas de autorización para AWS IoT SiteWise Edge en EMQX
<a name="authorization-rules-emqx-broker"></a>

EMQX permite agregar reglas de autorización basadas en identificadores como el nombre de usuario, la dirección IP o el ID de cliente. Esto resulta útil si desea limitar el número de aplicaciones externas que se conectan a diversas operaciones o temas.

**Topics**
+ [Configure la autorización mediante la base de datos integrada con Linux](add-auth-rules-database-emqx-broker-linux.md)
+ [Configure la autorización mediante la base de datos integrada con Windows](add-auth-rules-database-emqx-broker-windows.md)
+ [Actualice la configuración de despliegue del EMQX para su autorización](update-emqx-broker-authorization.md)
+ [Agregue reglas de autorización a través del panel de control de EMQX para los usuarios](add-rules-emqx-broker.md)

# Configure la autorización mediante la base de datos integrada con Linux
<a name="add-auth-rules-database-emqx-broker-linux"></a>

Al configurar las reglas de autorización, hay dos opciones de configuración que dependen de la configuración de la implementación.
+ **Docker**— Si ejecuta una Docker instalación estándar sin ellaLitmus Edge, utilice la configuración de **puerta de enlace Docker Bridge**. Este suele ser el caso cuando solo se han implementado AWS IoT SiteWise componentes.
+ **Litmus Edge**— Si los ha Litmus Edge instalado en su puerta de enlace, utilice la configuración de **Litmus Edgesubred de la red**.

**nota**  
Si configura inicialmente la puerta de enlace Docker puente y la instala posteriormenteLitmus Edge, vuelva a configurar las reglas de autorización mediante la opción de Litmus Edge subred de red para garantizar una comunicación adecuada entre todos los componentes.

**Para agregar reglas de autorización básicas**

1. Compruebe que el bróker EMQX esté desplegado y en funcionamiento.

1. Inicie una sesión de shell en el host de su puerta de enlace.

------
#### [ Docker without Litmus Edge ]

   Para una Docker instalación estándar sin Litmus Edge ella, ejecute:

   ```
   /greengrass/v2/bin/swe-emqx-cli acl init
   ```

------
#### [ Litmus Edge network subnet ]

   Si estás utilizandoLitmus Edge, determina la IP de la subred de la red de Litmus Edge:

   ```
   docker network inspect LitmusNetwork | grep IPAM -A9
   ```

   Anota el valor de subred del resultado y ejecuta el siguiente comando. `litmus_subnet_ip`Sustitúyalo por el valor de subred del paso anterior.

   ```
   /greengrass/v2/bin/swe-emqx-cli acl init litmus_subnet_ip
   ```

------

   La herramienta crea y aplica automáticamente reglas de autorización para permitir las conexiones desde la dirección IP proporcionada al intermediario. Permite el acceso a todos los temas. Esto incluye el recopilador IoT SiteWise OPC UA y el SiteWise editor de IoT.

1. Continúe en [Actualice la configuración de despliegue del EMQX para su autorización](update-emqx-broker-authorization.md).

# Configure la autorización mediante la base de datos integrada con Windows
<a name="add-auth-rules-database-emqx-broker-windows"></a>

En esta sección se describe la configuración de las reglas de autorización mediante la base de datos integrada para las implementaciones de Windows.

**Para agregar reglas de autorización básicas**

1. Compruebe que el bróker EMQX esté desplegado y en funcionamiento.

1. Ejecute la herramienta AWS IoT SiteWise CLI de EMQX: 

   ```
   C:\greengrass\v2\bin\swe-emqx-cli.ps1 acl init
   ```

   La herramienta crea y aplica automáticamente las reglas de ACL que permiten las conexiones desde el servidor local (127.0.0.1) al intermediario. Permite el acceso a todos los temas. Esto incluye el recopilador IoT SiteWise OPC UA y el SiteWise editor de IoT.

1. Continúe en [Actualice la configuración de despliegue del EMQX para su autorización](update-emqx-broker-authorization.md).

# Actualice la configuración de despliegue del EMQX para su autorización
<a name="update-emqx-broker-authorization"></a>

**Para actualizar la configuración de despliegue de EMQX para su autorización**

1. <a name="sitewise-open-console"></a>Vaya a la [consola de AWS IoT SiteWise](https://console.aws.amazon.com/iotsitewise/).

1. **En el panel de navegación de la izquierda, elija **las puertas de enlace Edge** en la sección Edge.**

1. Elija la puerta de enlace que desee configurar.

1. En la sección de **configuración de la puerta de enlace Edge**, copia el valor de tu **dispositivo principal de Greengrass**. Guárdelo para usarlo más adelante.

1. Abra la [consola de AWS IoT](https://console.aws.amazon.com/iot/).

1. **En el menú de navegación de la izquierda, en la sección **Administrar**, selecciona **dispositivos Greengrass** y, a continuación, Implementaciones.**

1. Busque el valor del dispositivo principal que guardó anteriormente y elija ese enlace para abrir la implementación.

1. Selecciona el botón desplegable **Acciones** y, a continuación, **Revisa**.

1. Lea el mensaje que aparece y, a continuación, seleccione **Revisar el despliegue**. Aparece la página **Especificar el destino**.

1. Elija **Siguiente** hasta llegar al paso **Configurar componentes**.

1. Seleccione el botón de opción `aws.greengrass.clientdevices.mqtt.EMQX`.

1. Pulse el botón **Configurar componente**. Aparece una página de configuración para el componente.

1. En **Actualización de la configuración**, seleccione **Restablecer la configuración predeterminada para la versión del componente: 2.\$1. **\$1.

1. Pegue el siguiente contenido en la sección **Configuración para fusionar** en función de su sistema operativo.

------
#### [ Linux ]

   ```
   {
       "emqxConfig": {
           "authorization": {
               "no_match": "deny",
               "sources": [
                   {
                       "type": "built_in_database"
                   },
                   {
                       "type": "file",
                       "path": "data/authz/acl.conf"
                   }
               ]
           },
           "listeners": {
               "tcp": {
                   "default": {
                       "enabled": true,
                       "enable_authn": false
                   }
               },
               "ssl": {
                   "default": {
                       "enabled": true,
                       "enable_authn": true,
                       "ssl_options": {
                           "verify": "verify_none",
                           "fail_if_no_peer_cert": false
                       }
                   }
               }
           },
           "authentication": {
               "enable": true,
               "backend": "built_in_database",
               "mechanism": "password_based",
               "password_hash_algorithm": {
                   "iterations": 210000,
                   "mac_fun": "sha512",
                   "name": "pbkdf2"
               },
               "user_id_type": "username"
           },
           "dashboard": {
               "listeners": {
                   "http": {
                       "bind": 18083
                   }
               }
           }
       },
       "authMode": "bypass",
       "dockerOptions": "-p 8883:8883 -p 127.0.0.1:1883:1883 -p 127.0.0.1:18083:18083 -v emqx-data:/opt/emqx/data -e EMQX_NODE__NAME=emqx@local",
       "requiresPrivilege": "true"
   }
   ```

------
#### [ Windows ]

   ```
   {
       "emqxConfig": {
           "authorization": {
               "no_match": "deny",
               "sources": [
                   {
                       "type": "built_in_database"
                   },
                   {
                       "type": "file",
                       "path": "C:\\greengrass\\v2\\work\\aws.greengrass.clientdevices.mqtt.EMQX\\v2\\data\\authz\\acl.conf"
                   }
               ]
           },
           "listeners": {
               "tcp": {
                   "default": {
                       "enabled": true,
                       "enable_authn": false
                   }
               },
               "ssl": {
                   "default": {
                       "enabled": true,
                       "enable_authn": true,
                       "ssl_options": {
                           "verify": "verify_none",
                           "fail_if_no_peer_cert": false
                       }
                   }
               }
           },
           "authentication": {
               "enable": true,
               "backend": "built_in_database",
               "mechanism": "password_based",
               "password_hash_algorithm": {
                   "iterations": 210000,
                   "mac_fun": "sha512",
                   "name": "pbkdf2"
               },
               "user_id_type": "username"
           },
           "dashboard": {
               "listeners": {
                   "http": {
                       "bind": 18083
                   }
               }
           }
       },
       "authMode": "bypass",
       "requiresPrivilege": "true"
   }
   ```

------

1. Elija **Confirmar**.

1. Elija **Siguiente** hasta llegar al paso **Revisar**.

1. Elija **Implementar**.

**nota**  
A partir de este momento, no podrá editar el archivo ACL para actualizar las reglas de autorización. Como alternativa, puede continuar [Agregue reglas de autorización a través del panel de control de EMQX para los usuarios](add-rules-emqx-broker.md) después de una implementación exitosa.

# Agregue reglas de autorización a través del panel de control de EMQX para los usuarios
<a name="add-rules-emqx-broker"></a>

Puede añadir o actualizar las reglas de autorización mediante el panel de control de EMQX o la herramienta CLI de AWS IoT SiteWise EMQX. La herramienta AWS IoT SiteWise CLI de EMQX gestiona la autorización mediante la base de datos integrada de EMQX.

**nota**  
Añadir reglas de autorización es un paso de configuración avanzada que requiere comprender los patrones de temas de MQTT y el control de acceso. *Para obtener más información sobre cómo crear reglas de autorización utilizando la base de datos integrada de EMQX, consulte [Uso de una base de datos integrada en los documentos de](https://docs.emqx.com/en/emqx/latest/access-control/authz/mnesia.html) EMQX.*

**nota**  
Las instrucciones relacionadas con el EMQX que se proporcionan son solo de referencia. Como la documentación y las funciones de EMQX pueden cambiar con el tiempo y no mantenemos su documentación, recomendamos consultar la documentación [oficial de EMQX para obtener la](https://docs.emqx.com/en/emqx/latest/) información más actualizada.

------
#### [ EMQX dashboard ]

Este procedimiento muestra cómo añadir reglas de autorización en el panel de EMQX.

Solo se puede acceder al panel de EMQX desde el host de la puerta de enlace. Si intenta conectarse desde fuera del host de la puerta de enlace, no podrá acceder al panel de control.

**Para añadir reglas de autorización mediante el panel de EMQX**

1. Asegúrese de estar dentro del host de la puerta de enlace.

1. Abra una ventana del navegador y visite [http://localhost:18083/](http://localhost:18083/).

1. Inicie sesión en el panel de EMQX. En este procedimiento se presupone que ha cambiado sus credenciales de inicio de sesión predeterminadas por las que ha elegido. Para obtener más información sobre la configuración inicial, consulte[Habilite la autenticación de nombre de usuario y contraseña](configure-emqx-broker.md#emqx-broker-username-password-auth).

1. Seleccione el icono del escudo y, a continuación, **Autorización** en el menú desplegable.

1. Pulse el botón **Permisos** en la fila de la **base de datos integrada**. 

1. En la sección de autorización de la base de datos integrada, añada o actualice las reglas de autorización de usuario según las necesidades de su empresa. Para obtener más información sobre la creación de reglas, consulte la sección [Uso de una base de datos integrada](https://docs.emqx.com/en/emqx/latest/access-control/authz/mnesia.html) en los documentos de *EMQX*.

------
#### [ AWS IoT SiteWise CLI tool using Linux ]

**Para administrar las reglas de autorización mediante la herramienta AWS IoT SiteWise CLI de EMQX en Linux:**
+ Agregue reglas de autorización para un usuario mediante el siguiente formato:

  ```
  /greengrass/v2/bin/swe-emqx-cli auth add your-username your-action your-permission your-topic [your-action-permission-topic]
  ```

**Example Agregue reglas de autorización para un usuario**  
En este ejemplo se muestra cómo añadir reglas para un usuario llamado`system1`:  

```
/greengrass/v2/bin/swe-emqx-cli auth add system1 \
    publish allow "sensors/#" \
    subscribe allow "control/#" \
    all deny "#"
```

**Example : Ver las reglas de autorización de un usuario**  
Para ver las reglas de autorización de los `system1` usuarios, ejecute el siguiente comando:  

```
/greengrass/v2/bin/swe-emqx-cli auth list system1
```

**Example : Vea todas las reglas de autorización existentes**  
Para ver todas las reglas de autorización que tiene actualmente, ejecute el siguiente comando:  

```
/greengrass/v2/bin/swe-emqx-cli auth list
```

**Example : Elimine todas las reglas de autorización de un usuario**  
Para eliminar todas las reglas de autorización aplicadas a un usuario concreto, ejecute el siguiente comando:  

```
/greengrass/v2/bin/swe-emqx-cli auth delete system1
```
Se le pedirá que confirme la eliminación.

------
#### [ AWS IoT SiteWise CLI tool using Windows ]

**Para administrar las reglas de autorización mediante la herramienta AWS IoT SiteWise CLI de EMQX en: Windows PowerShell**
+ Agregue reglas de autorización para un usuario mediante el siguiente formato:

  ```
  C:\greengrass\v2\bin\swe-emqx-cli.ps1 auth add your-username your-action your-permission your-topic [your-action-permission-topic]
  ```

**Example : Agregue reglas de autorización para un usuario**  
En este ejemplo se muestra cómo añadir reglas para un usuario llamado`system1`:  

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 auth add system1 `
    publish allow "sensors/#" `
    subscribe allow "control/#" `
    all deny "#"
```

**Example : Ver las reglas de autorización de un usuario**  
Para ver las reglas de autorización de los `system1` usuarios, ejecute el siguiente comando:  

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 auth list system1
```

**Example : Vea todas las reglas de autorización existentes**  
Para ver todas las reglas de autorización que tiene actualmente, ejecute el siguiente comando:  

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 auth list
```

**Example : Elimine todas las reglas de autorización de un usuario**  
Para eliminar todas las reglas de autorización aplicadas a un usuario concreto, ejecute el siguiente comando:  

```
C:\greengrass\v2\bin\swe-emqx-cli.ps1 auth delete system1
```
Se le pedirá que confirme la eliminación.

------

# Procese y visualice datos con SiteWise Edge y herramientas de código abierto
<a name="open-source-edge-integrations"></a>

Configure las puertas de enlace compatibles con AWS IoT SiteWise Edge MQTT con herramientas de código abierto para el procesamiento y la visualización locales a fin de mejorar sus capacidades de gestión de datos industriales.

Con SiteWise Edge, puede crear una canalización de procesamiento de datos local mediante herramientas externas de código abierto. [Utilice [Node-RED®](https://nodered.org/) para almacenar datos de series temporales con [InfluxDB® y supervise las operaciones a través de los paneles de Grafana®](https://www.influxdata.com/lp/influxdb-database/).](https://grafana.com/)

Node-RED procesa y transforma sus flujos de datos, mientras que InfluxDB proporciona almacenamiento de datos de series temporales. Grafana muestra sus datos operativos en tiempo real. Utilice estas herramientas con SiteWise Edge para sincronizar los datos entre su entorno local y el entorno local Nube de AWS, lo que le proporcionará información local inmediata y funciones de análisis a largo plazo basadas en la nube.

**nota**  
Node-RED®, InfluxDB® y Grafana® no son vendedores ni proveedores de Edge. SiteWise 

![\[Un diagrama que muestra algunas fuentes de datos y el simulador de turbinas que se conecta al EMQX Broker para publicarlos. Luego, el bróker EMQX se suscribe a Gateway y a Node-RED. AWS IoT SiteWise Node-RED ingresa a InfluxDB y luego Influx DB al panel de control de Grafana.\]](http://docs.aws.amazon.com/es_es/iot-sitewise/latest/userguide/images/gateway-open-source-overview.png)


**nota**  
En esta guía, utilizamos la versión de código abierto de [Grafana](https://grafana.com/) SiteWise for Edge en lugar del servicio [Amazon Managed Grafana](https://docs.aws.amazon.com/grafana/latest/userguide/what-is-Amazon-Managed-Service-Grafana.html).

## Opciones de implementación
<a name="deployment-options"></a>

Puede implementar esta solución mediante uno de estos dos enfoques. Con una configuración Microsoft Windows manual, usted controla la configuración y la integración de los componentes con su infraestructura. ConLinux, puede usar Docker para implementar componentes preconfigurados en contenedores.

Elija el método que se adapte a sus requisitos operativos.
+ [Configure las integraciones de código abierto manualmente (Windows)](windows-manual-setup.md)— Para configuraciones personalizadas o infraestructuras existentes
+ [Configure integraciones de código abierto con Docker (Linux)](linux-docker-setup.md)— Para un despliegue rápido con componentes preconfigurados

## Descripción general de un ejemplo de parque eólico
<a name="open-source-example-overview"></a>

Esta guía utiliza un ejemplo de parque eólico para demostrar cómo se puede monitorizar la velocidad del viento de una turbina en un parque eólico. Este escenario práctico ilustra las necesidades comunes de monitoreo industrial, en las que tanto la visibilidad local como la basada en la nube son valiosas para la eficiencia operativa.

Con esta integración, puede:
+ Recopile datos de equipos industriales mediante una puerta de enlace AWS IoT SiteWise Edge
+ Procese datos localmente con Node-RED, InfluxDB y Grafana
+ Almacene datos localmente usando InfluxDB
+ Supervise los datos en tiempo real mediante los paneles de control de Grafana

A lo largo de esta guía, utilizamos el ejemplo de un parque eólico. Usamos Node-RED para simular una turbina que genera datos de velocidad del viento. Node-RED traduce la carga útil de datos, los publica en el broker MQTT de SiteWise Edge, se suscribe para recibir datos del bróker y los almacena localmente en InfluxDB. Este enfoque garantiza que todos los datos operativos estén disponibles tanto localmente para su acceso inmediato como en la nube para su posterior análisis. Al implementar este patrón, gana resiliencia ante las interrupciones de la red y, al mismo tiempo, mantiene la capacidad de realizar análisis avanzados en la Nube de AWS red. Grafana se conecta a InfluxDB para el monitoreo local, lo que proporciona a los operadores visibilidad en tiempo real de las métricas sin depender de la nube. Una pasarela habilitada para MQTT de SiteWise Edge se conecta al mismo intermediario de MQTT al que enviar los datos AWS IoT SiteWise, lo que crea un puente entre sus operaciones perimetrales y los servicios basados en la nube.

Puede utilizar sus propios datos y configuraciones para crear un flujo de trabajo similar adaptado a sus requisitos industriales específicos, ya sea que esté supervisando equipos de fabricación, infraestructuras de servicios públicos u otros activos industriales.

## Requisitos para las integraciones de código abierto
<a name="open-source-requirements"></a>

Antes de implementar integraciones de código abierto con SiteWise Edge, asegúrese de que su entorno cumpla con los requisitos necesarios.
+ **Requisitos de hardware**: el hardware de su puerta de enlace debe cumplir los requisitos de las puertas de enlace SiteWise Edge. Para obtener más información, consulte las puertas de enlace V3 habilitadas [AWS IoT SiteWise Requisitos de la puerta de enlace autohospedada de Edge](configure-gateway-ggv2.md) para MQTT y. [Requisitos para la aplicación AWS IoT SiteWise Edge](siemens-app-gateway-requirements.md)
**importante**  
[Al implementar componentes de código abierto adicionales, asegúrese de que su hardware cumpla con los requisitos de [InfluxDB](https://docs.influxdata.com/influxdb/v2/install/), [Node-RED](https://nodered.org/docs/getting-started/) y Grafana.](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
+ La configuración de su red debe admitir tanto la comunicación local entre los componentes como la conectividad a la nube para Edge. SiteWise 
+ Todos los servicios deben ejecutarse en el mismo host.

## Consideraciones de seguridad
<a name="open-source-security-considerations"></a>

Se recomienda cifrar todas las comunicaciones entre los componentes, especialmente al acceder a las interfaces desde redes no locales. Implemente los controles de acceso adecuados para cada componente y siga las prácticas AWS recomendadas para la configuración de la puerta de enlace AWS IoT SiteWise Edge y la seguridad de las AWS cuentas.

**Entorno de desarrollo**  
Esta guía muestra cómo Node-RED, InfluxDB y Grafana se ejecutan y se accede localmente en un host de puerta de enlace. Para las implementaciones de producción que requieren acceso externo, implemente medidas de seguridad que incluyan el cifrado, la autenticación y la autorización TLS. Siga las prácticas recomendadas de seguridad de cada aplicación.

**Software de terceros**  
Esta solución utiliza software de terceros no mantenido por AWS, incluidos InfluxDB, Node-RED, Grafana y el complemento. `node-red-contrib-influxdb` Antes de la implementación, asegúrese de que estos componentes cumplan con los requisitos de seguridad, las normas de cumplimiento y las políticas de gobierno de su organización.

**importante**  
Esta guía hace referencia y utiliza software de terceros que no es propiedad ni mantenido por él AWS. Antes de la implementación, asegúrese de que todos los componentes cumplan con sus requisitos de seguridad, cumplimiento y gobierno. Mantenga todo el software actualizado con los parches de seguridad más recientes y siga las mejores prácticas para proteger su implementación perimetral.  
 InfluxDB, Node-RED y Grafana no son vendedores ni proveedores de Edge. SiteWise 

## Otras consideraciones
<a name="open-source-other-considerations"></a>

Tenga en cuenta estos factores adicionales al implementar integraciones de código abierto con Edge. SiteWise 
+ Usa las versiones más recientes de todos los servicios, herramientas y componentes.
+ Filtre y agregue los datos localmente antes de transmitirlos a la nube para reducir AWS IoT SiteWise los costos de ingesta de datos. Configure los períodos de retención de datos adecuados en InfluxDB y dimensione correctamente el hardware de su puerta de enlace. Para obtener más información, consulte [Precios de AWS IoT SiteWise](https://aws.amazon.com/iot-sitewise/pricing/).
+ Implemente procedimientos de respaldo periódicos para todos los datos.
+ Supervise el uso de los recursos en su puerta de enlace y configure los límites de recursos adecuados para cada componente. Implemente políticas de retención de datos en InfluxDB para administrar el uso del disco.

# Configure las integraciones de código abierto manualmente (Windows)
<a name="windows-manual-setup"></a>

Utilice esta guía para crear manualmente un depósito de series temporales para los datos de velocidad del viento que se conecte con Grafana® y Node-RED®.

 Instale y configure manualmente Node-RED, InfluxDB® y Grafana para controlar la configuración de la Microsoft Windows implementación. Puede almacenar y administrar los datos de series temporales de sus dispositivos mediante InfluxDB.

## Requisitos previos de configuración manual
<a name="windows-open-source-prerequisites"></a>

Antes de empezar, complete estos requisitos:

**nota**  
Ejecute todos los servicios (SiteWise Edge, InfluxDB, Node-RED y Grafana) en el mismo host.
+ Instale una puerta de enlace V3 habilitada para MQTT. Para obtener más información, consulte [Puertas de enlace V3 habilitadas para MQTT para Edge AWS IoT SiteWise](mqtt-enabled-v3-gateway.md).
+ Instale y ejecute estos servicios localmente:
  + InfluxDB OSS v2. Para ver los pasos de instalación, consulte [Instalar](https://docs.influxdata.com/influxdb/v2/install/) InfluxDB.
  + Node-RED. Para ver los pasos de instalación, consulte [Instalar Node-RED](https://nodered.org/docs/getting-started/local) localmente.
  + Grafana. Para ver los pasos de instalación, consulte [Instalación de Grafana](https://grafana.com/docs/grafana/latest/setup-grafana/installation/).

# Configure el almacenamiento local con InfluxDB
<a name="windows-influxdb-setup"></a>

Con InfluxDB®, puede almacenar datos de series temporales de sus dispositivos de forma local. El objetivo de la capacidad de almacenamiento local es mantener la visibilidad operativa durante las interrupciones de la red y reducir la latencia de las aplicaciones en las que el tiempo es crucial. Puede realizar análisis y visualizaciones en la periferia sin dejar de tener la opción de reenviar los datos a la nube de forma selectiva.

En esta sección, creará un depósito de series temporales para los datos de velocidad del viento de las turbinas y generará un token de API para la conectividad de Grafana® y Node-RED®. El depósito de InfluxDB sirve como un contenedor de almacenamiento dedicado para los datos de series temporales, similar a una base de datos en los sistemas tradicionales. El token de API permite un acceso programático seguro a sus datos.

**Para configurar InfluxDB**

1. [Tras completar los pasos previos y asegurarse de que todas las herramientas se ejecutan en el mismo servidor, abra su navegador web y vaya a http://127.0.0.1:8086.](http://127.0.0.1:8086)

1. (Opcional) Habilite el cifrado TLS para mejorar la seguridad. Para obtener más información, consulte [Habilitar el cifrado TLS](https://docs.influxdata.com/influxdb/v2/admin/security/enable-tls/) en. *InfluxData Documentation*

1. Cree un depósito de InfluxDB de series temporales para almacenar datos de Node-RED. El depósito servirá como un contenedor específico para los datos de su parque eólico, lo que le permitirá organizar y administrar las políticas de retención específicas de este conjunto de datos. Para obtener más información, consulte [Administrar depósitos](https://docs.influxdata.com/influxdb/v2/admin/buckets/) en. *InfluxData Documentation*

1. (Opcional) Configure el período de retención de datos para su ubicación perimetral. Establecer períodos de retención adecuados ayuda a administrar los recursos de almacenamiento de manera eficiente al eliminar automáticamente los datos antiguos que ya no son necesarios para las operaciones locales.

   Para obtener información sobre la retención de datos, consulte [Retención de datos en InfluxDB](https://docs.influxdata.com/influxdb/v2/reference/internals/data-retention/) en. *InfluxData Documentation*

1. Genere un token de API para el depósito. Este token permitirá una comunicación segura entre InfluxDB y otros componentes como Node-RED y Grafana. De esta forma, solo los servicios autorizados pueden leer o escribir en su almacén de datos. Para obtener más información, consulte [Crear un token](https://docs.influxdata.com/influxdb/cloud/admin/tokens/create-token/) en *InfluxData Documentation*.

Tras completar estos pasos, puede almacenar datos de series temporales en su instancia de InfluxDB, lo que proporciona una base para la persistencia y el análisis de los datos locales en su entorno perimetral.

# Configure los flujos de Node-RED para la integración de datos AWS IoT SiteWise
<a name="windows-nodered-config"></a>

Con Node-RED®, puede implementar dos flujos para administrar los datos entre sus dispositivos y. AWS IoT SiteWise Estos flujos funcionan en conjunto para crear una solución de administración de datos integral que aborde el flujo de datos local y en la nube.
+ **Flujo de publicación de datos**: se publica en la nube. El flujo de publicación de datos envía datos a AWS IoT SiteWise. Este flujo simula un dispositivo de turbina generando datos de sensores, traduciéndolos al AWS IoT SiteWise formato y publicándolos en el broker MQTT de SiteWise Edge. Esto le permite aprovechar las capacidades AWS IoT SiteWise de la nube para el almacenamiento, el análisis y la integración con otros servicios. AWS 

  Para obtener más información, consulte [Configure el flujo de publicación de datos](windows-nodered-data-publish-flow.md).
+ **Flujo de retención de datos**: almacena los datos en la periferia. El flujo de retención de datos se suscribe al broker MQTT de SiteWise Edge para recibir datos, traducirlos al formato InfluxDB® y almacenarlos localmente para su supervisión. Este almacenamiento local proporciona acceso inmediato a los datos operativos, reduce la latencia de las aplicaciones en las que el tiempo es crucial y garantiza la continuidad durante las interrupciones de la red.

  Para obtener más información, consulte [Configure el flujo de retención de datos](windows-nodered-data-retention-flow.md).

Estos dos flujos funcionan juntos para garantizar que los datos se envíen AWS IoT SiteWise y almacenen localmente para su acceso inmediato.

[Para acceder a la consola Node-RED, vaya a http://127.0.0.1:1880.](http://127.0.0.1:1880) Para obtener información sobre cómo habilitar el cifrado TLS, consulte [Habilitar](https://docs.influxdata.com/influxdb/v2/admin/security/enable-tls/) el cifrado TLS.

# Configure el flujo de publicación de datos
<a name="windows-nodered-data-publish-flow"></a>

El flujo de publicación de datos utiliza tres nodos para crear una canalización que envía los datos industriales a la nube. Este flujo es esencial para permitir el análisis basado en la nube, el almacenamiento a largo plazo y la integración con otros AWS servicios. En primer lugar, los datos simulados del dispositivo se envían al intermediario MQTT de SiteWise Edge. La puerta de enlace recoge los datos del intermediario, lo que permite su transmisión a la AWS IoT SiteWise nube, donde puede aprovechar las potentes funciones de análisis y visualización.
+ **Entrada de datos**: recibe datos de dispositivos de sus equipos industriales o simuladores
+ **Traductor de datos para AWS IoT SiteWise**: traduce los datos a un AWS IoT SiteWise formato para garantizar la compatibilidad con la puerta de enlace SiteWise Edge
+ **Publicador de MQTT**: publica los datos en el broker MQTT de SiteWise Edge, lo que los pone a disposición de los consumidores locales y de la nube

![\[Un diagrama que muestra el flujo de publicación de datos de Node-RED. Envía los datos simulados del dispositivo al broker MQTT de SiteWise Edge para que SiteWise Edge Gateway los recoja y luego los transfiera a la nube. AWS IoT SiteWise\]](http://docs.aws.amazon.com/es_es/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-publish-flow.png)


## Configure el nodo de entrada de datos
<a name="windows-nodered-data-input-config"></a>

En este ejemplo, el nodo de entrada de datos usa un dispositivo de turbina eólica simulado que genera datos de velocidad del viento. Este nodo sirve como punto de entrada para sus datos industriales, ya provengan de fuentes simuladas (como en nuestro ejemplo) o de equipos industriales reales en entornos de producción.

Usamos un formato JSON personalizado para la carga útil de datos a fin de proporcionar una estructura estandarizada que funcione de manera eficiente tanto con las herramientas de procesamiento locales como con el servicio AWS IoT SiteWise en la nube. Este formato incluye metadatos esenciales, como marcas de tiempo e indicadores de calidad, junto con los valores de medición reales, lo que permite una gestión integral de los datos y un seguimiento de la calidad durante todo el proceso. Importe el nodo de inyección para recibir datos simulados en este formato JSON estandarizado con marcas de tiempo, indicadores de calidad y valores.

[https://nodered.org/docs/user-guide/nodes#inject](https://nodered.org/docs/user-guide/nodes#inject)

El simulador de turbina genera datos de velocidad del viento cada segundo en este formato JSON estandarizado:

**Example : Carga útil de datos de la turbina**  

```
{
    name: string,         // Property name/identifier
    timestamp: number,    // Epoch time in nanoseconds
    quality: "GOOD" | "UNCERTAIN" | "BAD",
    value: number | string | boolean
}
```

Este formato ofrece varias ventajas:
+ El `name` campo identifica la propiedad o medida específica, lo que le permite rastrear varios puntos de datos desde el mismo dispositivo
+ El valor `timestamp` en nanosegundos garantiza un seguimiento preciso del tiempo para un análisis histórico preciso
+ El `quality` indicador le ayuda a filtrar y gestionar los datos en función de su fiabilidad
+ El `value` campo flexible admite diferentes tipos de datos para adaptarse a las distintas salidas de los sensores

**Example : nodo de inyección de un simulador de turbina**  

```
[
    {
        "id": "string",
        "type": "inject",
        "z": "string",
        "name": "Turbine Simulator",
        "props": [
            {
                "p": "payload.timestamp",
                "v": "",
                "vt": "date"
            },
            {
                "p": "payload.quality",
                "v": "GOOD",
                "vt": "str"
            },
            {
                "p": "payload.value",
                "v": "$random()",
                "vt": "jsonata"
            },
            {
                "p": "payload.name",
                "v": "/Renton/WindFarm/Turbine/WindSpeed",
                "vt": "str"
            }
        ],
        "repeat": "1",
        "crontab": "",
        "once": false,
        "onceDelay": "",
        "topic": "",
        "x": 270,
        "y": 200,
        "wires": [
            [
                "string"
            ]
        ]
    }
]
```

## Configure un nodo para la traducción de datos
<a name="windows-nodered-sitewiseise-translator-config"></a>

La puerta de enlace SiteWise Edge requiere datos en un formato específico para garantizar la compatibilidad con AWS IoT SiteWise la nube. El nodo traductor es un componente importante que convierte los datos de entrada al formato de AWS IoT SiteWise carga útil requerido. Este paso de traducción garantiza que sus datos industriales se puedan procesar, almacenar y analizar posteriormente de forma adecuada en el entorno de AWS IoT SiteWise nube.

Al estandarizar el formato de los datos en esta etapa, posibilita la integración entre sus dispositivos periféricos y el servicio en la nube, donde puede utilizar las capacidades de modelado, análisis y visualización de activos. Utilice esta estructura:

**Example : Estructura de carga útil para el análisis de datos de SiteWise Edge**  

```
{
  "propertyAlias": "string",  
  "propertyValues": [
    {
      "value": { 
          "booleanValue": boolean, 
          "doubleValue": number, 
          "integerValue": number,
          "stringValue": "string" 
     },
      "timestamp": {
          "timeInSeconds": number,
          "offsetInNanos": number
      },
      "quality": "GOOD" | "UNCERTAIN" | "BAD",
  }]
}
```

**nota**  
Haga coincidir el `propertyAlias` tema con su jerarquía de temas de MQTT (por ejemplo,). `/Renton/WindFarm/Turbine/WindSpeed` Esto garantiza que sus datos estén asociados correctamente a la propiedad de activo correcta en AWS IoT SiteWise. Para obtener más información, consulte el concepto de «alias de flujo de datos» en[AWS IoT SiteWise conceptos](concept-overview.md). 

1. Importe el nodo de función de ejemplo para la traducción de la AWS IoT SiteWise carga útil. Esta función gestiona la conversión del formato de entrada estandarizado al formato AWS IoT SiteWise compatible, lo que garantiza que el formato de la marca de tiempo, los indicadores de calidad y la escritura de valores sean correctos.

   ```
   [
       {
           "id": "string",
           "type": "function",
           "z": "string",
           "name": "Translate to SiteWise payload",
           "func": "let input = msg.payload;\nlet output = {};\n\noutput[\"propertyAlias\"] = input.name;\n\nlet propertyVal = {}\n\nlet timeInSeconds = Math.floor(input.timestamp / 1000);\nlet offsetInNanos = (input.timestamp % 1000) * 1000000;\n\npropertyVal[\"timestamp\"] = {\n    \"timeInSeconds\": timeInSeconds,\n    \"offsetInNanos\": offsetInNanos,\n};\n\npropertyVal[\"quality\"] = input.quality\n\nlet typeNameConverter = {\n    \"number\": (x) => Number.isInteger(x) ? \"integerValue\" : \"doubleValue\",\n    \"boolean\": (x) => \"booleanValue\",\n    \"string\": (x) => \"stringValue\", \n}\nlet typeName = typeNameConverter[typeof input.value](input.value)\npropertyVal[\"value\"] = {}\npropertyVal[\"value\"][typeName] = input.value;\n\noutput[\"propertyValues\"] = [propertyVal]\n\nreturn {\n    payload: JSON.stringify(output)\n};",
           "outputs": 1,
           "timeout": "",
           "noerr": 0,
           "initialize": "",
           "finalize": "",
           "libs": [],
           "x": 530,
           "y": 200,
           "wires": [
               [
                   "string"
               ]
           ]
       }
   ]
   ```

1. Compruebe que el JavaScript código traduce los datos de velocidad del viento correctamente. La función realiza varias tareas importantes:
   + Extrae el nombre de la propiedad de la entrada y lo establece como PropertyAlias
   + Convierte la marca de tiempo de milisegundos al formato de segundos y nanosegundos requerido
   + Conserva el indicador de calidad para el seguimiento de la fiabilidad de los datos
   + Detecta automáticamente el tipo de valor y lo formatea según AWS IoT SiteWise los requisitos

1. Conecte el nodo a su flujo, vinculándolo entre el nodo de entrada de datos y el editor MQTT.

*Para obtener orientación sobre cómo escribir una función específica para las necesidades de su empresa, consulte Cómo [escribir funciones](https://nodered.org/docs/user-guide/writing-functions) en la documentación Node-RED*

## Configure el editor MQTT
<a name="windows-nodered-mqtt-publisher-config"></a>

Tras la traducción, los datos están listos para su publicación en el broker MQTT de SiteWise Edge.

Configure el editor MQTT con estos ajustes para enviar datos al agente MQTT de SiteWise Edge:

**Para importar el nodo de salida MQTT**

1. Importe un nodo de configuración de salida MQTT mediante. `"type": "mqtt out"` Los nodos de salida MQTT le permiten compartir la configuración de un corredor.

1. Introduzca los pares clave-valor para obtener información relevante sobre la conexión del bróker MQTT y el enrutamiento de mensajes.

Importe el nodo de ejemplo. `mqtt out`

**Example**  

```
[
    {
        "id": "string",
        "type": "mqtt out",
        "z": "string",
        "name": "Publish to MQTT broker",
        "topic": "/Renton/WindFarm/Turbine/WindSpeed",
        "qos": "1",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "string",
        "x": 830,
        "y": 200,
        "wires": []
    },
    {
        "id": "string",
        "type": "mqtt-broker",
        "name": "emqx",
        "broker": "127.0.0.1",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "5",
        "keepalive": 15,
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]
```

El nodo de salida MQTT de ejemplo crea la conexión MQTT con la siguiente información:
+ Servidor: `127.0.0.1`
+ Puerto: `1883`
+ Protocolo: `MQTT V5`

A continuación, el nodo de salida MQTT configura el enrutamiento de mensajes con la siguiente información:
+ Tema: `/Renton/WindFarm/Turbine/WindSpeed`
+ QoS: `1`

## Implemente y verifique los nodos
<a name="windows-verify-deployment"></a>

Tras configurar los tres nodos del flujo de publicación de datos, siga estos pasos para implementar el flujo y comprobar que los datos se transmiten correctamente a AWS IoT SiteWise

**Para implementar y verificar las conexiones**

1. Conecte los tres nodos como se muestra en el flujo de publicación de datos.  
![\[Data publish flow diagram showing input from turbine simulator to AWS IoT SiteWise to MQTT broker.\]](http://docs.aws.amazon.com/es_es/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-publish-flow.png)

1. Elija **Implementar** para aplicar todos los cambios en la conexión de los nodos.

1. Navegue hasta la [AWS IoT SiteWise consola](https://console.aws.amazon.com/iotsitewise/) y elija **Flujos de datos**.

1. Asegúrese de seleccionar el **prefijo Alias** en el menú desplegable. A continuación, busca el `/Renton/WindFarm/Turbine/WindSpeed` alias.

Si ve el alias correcto en la búsqueda, significa que ha desplegado el flujo y verificado la transmisión de datos.

# Configure el flujo de retención de datos
<a name="windows-nodered-data-retention-flow"></a>

El flujo de retención de datos se puede utilizar para mantener la visibilidad operativa en la periferia. Esto resulta útil durante las interrupciones de la red o cuando se necesita acceso inmediato a los datos. Este flujo se suscribe al intermediario MQTT para recibir los datos del dispositivo, los convierte al formato InfluxDB® y los almacena localmente. Al implementar este flujo, se crea un almacén de datos local resiliente al que los operadores pueden acceder sin depender de la nube, lo que permite la supervisión en tiempo real y la toma de decisiones en la periferia.

El flujo consta de tres componentes clave que trabajan juntos para garantizar que sus datos se capturen y almacenen correctamente:
+ **Cliente de suscripción a MQTT**: recibe los datos del intermediario, lo que garantiza la captura de todos los datos industriales relevantes
+ **Traductor InfluxDB**: convierte la AWS IoT SiteWise carga útil al formato InfluxDB y prepara los datos para un almacenamiento eficiente de series temporales
+ **Escritor InfluxDB**: gestiona el almacenamiento local, lo que garantiza la persistencia de los datos y la disponibilidad de las aplicaciones locales

![\[Flujo de retención de datos de Node-RED\]](http://docs.aws.amazon.com/es_es/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-data-retention.png)


## Configure el cliente de suscripción MQTT
<a name="windows-nodered-mqtt-subscriber"></a>
+ Configure el cliente de suscripción MQTT en Node-RED para recibir datos del broker EMQX de MQTT importando el siguiente ejemplo. AWS IoT SiteWise   
**Example : MQTT en el nodo**  

  ```
  [
      {
          "id": "string",
          "type": "mqtt in",
          "z": "string",
          "name": "Subscribe to MQTT broker",
          "topic": "/Renton/WindFarm/Turbine/WindSpeed",
          "qos": "1",
          "datatype": "auto-detect",
          "broker": "string",
          "nl": false,
          "rap": true,
          "rh": 0,
          "inputs": 0,
          "x": 290,
          "y": 340,
          "wires": [
              [
                  "string"
              ]
          ]
      },
      {
          "id": "string",
          "type": "mqtt-broker",
          "name": "emqx",
          "broker": "127.0.0.1",
          "port": "1883",
          "clientid": "",
          "autoConnect": true,
          "usetls": false,
          "protocolVersion": "5",
          "keepalive": 15,
          "cleansession": true,
          "autoUnsubscribe": true,
          "birthTopic": "",
          "birthQos": "0",
          "birthPayload": "",
          "birthMsg": {},
          "closeTopic": "",
          "closePayload": "",
          "closeMsg": {},
          "willTopic": "",
          "willQos": "0",
          "willPayload": "",
          "willMsg": {},
          "userProps": "",
          "sessionExpiry": ""
      }
  ]
  ```

Esta suscripción garantiza que todos los datos relevantes publicados en el corredor se recopilen para su almacenamiento local, lo que proporciona un registro completo de sus operaciones industriales. El nodo utiliza los mismos parámetros de conexión MQTT que la [Configure el editor MQTT](windows-nodered-data-publish-flow.md#windows-nodered-mqtt-publisher-config) sección, con los siguientes ajustes de suscripción:
+ Tema — `/Renton/WindFarm/Turbine/WindSpeed`
+ QoS — `1`

Para obtener más información, consulte [Conectarse a un broker de MQTT](https://cookbook.nodered.org/mqtt/connect-to-broker) en la *Node-REDdocumentación*.

## Configure el traductor InfluxDB
<a name="windows-nodered-influxdb-translator"></a>

[InfluxDB organiza los datos mediante [etiquetas](https://docs.influxdata.com/influxdb/v1/concepts/glossary/#tag) para la indexación y campos para los valores.](https://docs.influxdata.com/influxdb/v1/concepts/glossary/#field) Esta organización optimiza el rendimiento de las consultas y la eficiencia del almacenamiento de los datos de series temporales. Importe el nodo de función de ejemplo que contiene el JavaScript código para convertir la AWS IoT SiteWise carga útil al formato InfluxDB. El traductor divide las propiedades en dos grupos:
+ Etiquetas: propiedades de calidad y nombre para una indexación eficiente
+ Campos: marca de tiempo (en milisegundos desde la época) y valor

**Example : Nodo de función de traducción a una carga útil de InfluxDB**  

```
[
    {
        "id": "string",
        "type": "function",
        "z": "string",
        "name": "Translate to InfluxDB payload",
        "func": "let data = msg.payload;\n\nlet timeInSeconds = data.propertyValues[0].timestamp.timeInSeconds;\nlet offsetInNanos = data.propertyValues[0].timestamp.offsetInNanos;\nlet timestampInMilliseconds = (timeInSeconds * 1000) + (offsetInNanos / 1000000);\n\nmsg.payload = [\n    {\n        \"timestamp(milliseconds_since_epoch)\": timestampInMilliseconds,\n        \"value\": data.propertyValues[0].value.doubleValue\n    },\n    {\n        \"name\": data.propertyAlias,\n        \"quality\": data.propertyValues[0].quality\n    }\n]\n\nreturn msg",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 560,
        "y": 340,
        "wires": [
            [
                "string"
            ]
        ]
    }
]
```

Para ver opciones de configuración adicionales, consulte el [node-red-contrib-influxdb](https://github.com/mblackstock/node-red-contrib-influxdb)repositorio de Node-RED. GitHub 

## Configure el escritor InfluxDB
<a name="windows-nodered-influxdb-writer"></a>

El nodo de escritura de InfluxDB es el componente final de su flujo de retención de datos, responsable de almacenar sus datos industriales en la base de datos local de InfluxDB. Este almacenamiento local es importante para mantener la visibilidad operativa durante las interrupciones de la red y proporcionar acceso inmediato a los datos para las aplicaciones en las que el tiempo es crucial.

1. Instale el node-red-contrib-influxdb paquete mediante la opción Administrar paleta. Este paquete proporciona los nodos necesarios para conectar Node-RED con InfluxDB.

1. Agregue un nodo de salida de InfluxDB a su flujo. Este nodo se encargará de la escritura real de los datos en su base de datos de InfluxDB.

1. Configure las propiedades del servidor para establecer una conexión segura con su instancia de InfluxDB:

   1. Establezca la versión en 2.0: esto especifica que se está conectando a InfluxDB v2.x, que usa una API diferente a la de las versiones anteriores

   1. Establece la URL en`http://127.0.0.1:8086`: esto apunta a tu instancia local de InfluxDB

   1. Introduzca su token de autenticación de InfluxDB. Este token seguro autoriza la conexión a su base de datos. Generó el token durante el [Configure el almacenamiento local con InfluxDB](windows-influxdb-setup.md) procedimiento.

1. Especifique los parámetros de la ubicación de almacenamiento para definir dónde y cómo se almacenarán los datos:

   1. Introduzca el nombre de su organización de InfluxDB: la organización es un espacio de trabajo para un grupo de usuarios, al que pertenecen sus grupos y paneles. Para obtener más información, consulte [Administrar](https://docs.influxdata.com/influxdb/v2/admin/organizations/) organizaciones en. *InfluxData Documentation*

   1. Especifique el depósito de InfluxDB (por ejemplo,`WindFarmData`): el depósito equivale a una base de datos en los sistemas tradicionales y sirve como contenedor para los datos de sus series temporales

   1. Establezca la medición de InfluxDB (por ejemplo,`TurbineData`): la medición es similar a una tabla en las bases de datos relacionales y organiza los puntos de datos relacionados

**nota**  
Busca el nombre de tu organización en la barra lateral izquierda de la instancia de InfluxDB. Los conceptos de organización, grupo y medición son fundamentales para el modelo de organización de datos de InfluxDB. Para obtener más información, consulte la documentación de [InfluxDB](https://docs.influxdata.com/influxdb/v2/admin/organizations/).

## Implemente y verifique el flujo de retención
<a name="windows-nodered-retention-deploy"></a>

Tras configurar todos los componentes del flujo de retención de datos, debe implementar y comprobar que el sistema funciona correctamente. Esta verificación garantiza que sus datos industriales se almacenen adecuadamente a nivel local para su acceso y análisis inmediatos.

1. Conecte los tres nodos como se muestra en el diagrama de flujo de retención de datos. Esto crea un proceso completo desde la suscripción de datos hasta el almacenamiento local.  
![\[Flujo de retención de datos de Node-RED\]](http://docs.aws.amazon.com/es_es/iot-sitewise/latest/userguide/images/gateway-open-source-nodered-data-retention.png)

1. Elija **Deploy** para aplicar los cambios y activar el flujo. Esto inicia el proceso de recopilación y almacenamiento de datos.

1. Utilice el explorador de datos de InfluxDB para consultar y visualizar sus datos. Esta herramienta le permite verificar que los datos se almacenan correctamente y crear visualizaciones iniciales de los datos de sus series temporales.

   En el explorador de datos, debería poder ver cómo se registran las mediciones de la velocidad del viento a lo largo del tiempo, lo que confirma que todo el proceso, desde la generación de datos hasta el almacenamiento local, funciona correctamente. 

   Para obtener más información, consulte [Consulta en el explorador de datos](https://docs.influxdata.com/influxdb/v2/query-data/execute-queries/data-explorer/) en el *InfluxData Documentation*.

Con el flujo de publicación de datos y el flujo de retención de datos implementados, ahora tiene un sistema completo que envía los datos a la AWS IoT SiteWise nube y, al mismo tiempo, mantiene una copia local para un acceso inmediato y una mayor resiliencia. Este enfoque de doble vía garantiza que obtenga los beneficios del análisis y el almacenamiento basados en la nube y, al mismo tiempo, mantenga la visibilidad operativa en la periferia.

# Configurar Grafana para Edge SiteWise
<a name="windows-grafana"></a>

 Grafana® le permite crear paneles de monitoreo locales en tiempo real para sus datos industriales. Al visualizar los datos almacenados en InfluxDB®, puede proporcionar a los operadores información inmediata sobre el rendimiento del equipo, la eficiencia del proceso y los posibles problemas. Esta visibilidad perimetral es importante para las operaciones urgentes y para mantener la continuidad durante las interrupciones de la red.

## Configuración de los orígenes de datos
<a name="windows-grafana-data-source-config"></a>

Al conectar Grafana a su base de datos de InfluxDB, se crea una potente capa de visualización para sus datos industriales. Esta conexión permite disponer de paneles de control en tiempo real que los operadores pueden utilizar para tomar decisiones informadas sin depender de la nube.

1. Acceda a su instancia de Grafana de forma local desde [http://127.0.0.1:3000](http://127.0.0.1:3000) en su navegador. *Si es necesario habilitar TLS, puede consultar [Configurar Grafana HTTPS para un tráfico web seguro](https://grafana.com/docs/grafana/latest/setup-grafana/set-up-https/) en Grafana Labs la documentación.*

1. Agregue una fuente de datos de InfluxDB que apunte al segmento de series temporales de InfluxDB donde Node-RED escribe los datos. Por ejemplo, `WindFarmData`. Esta conexión establece el vínculo entre los datos almacenados y la plataforma de visualización.

1. *Para obtener instrucciones detalladas, consulte [Configurar la fuente de datos de InfluxDB](https://grafana.com/docs/grafana/latest/datasources/influxdb/configure-influxdb-data-source/) en la Grafana Labs documentación.*

### Cree un panel de Grafana para SiteWise los datos de Edge
<a name="windows-grafana-create-dashboard"></a>

La creación de un panel es el paso final para crear su solución de monitoreo local. Los paneles proporcionan representaciones visuales de sus datos industriales, lo que facilita la identificación de tendencias, anomalías y posibles problemas de un vistazo.
+ Siga la guía para crear un panel de control. Para obtener más información, consulte [Crear su primer panel](https://grafana.com/docs/grafana/latest/getting-started/build-first-dashboard/) en la *Grafana Labsdocumentación*. En esta plantilla se presupone que tu depósito tiene un nombre `WindFarmData` y una medida`TurbineData`.

  También puede utilizar la guía de inicio rápido importando la plantilla de panel de ejemplo proporcionada para crear rápidamente un panel con un gráfico de series temporales para los datos que Node-RED generó en la sección anterior. Esta plantilla proporciona un punto de partida que puede personalizar para satisfacer sus necesidades específicas de supervisión.

  ```
  {
    "__inputs": [
      {
        "name": "DS_WINDFARM-DEMO",
        "label": "windfarm-demo",
        "description": "",
        "type": "datasource",
        "pluginId": "influxdb",
        "pluginName": "InfluxDB"
      }
    ],
    "__elements": {},
    "__requires": [
      {
        "type": "grafana",
        "id": "grafana",
        "name": "Grafana",
        "version": "11.6.0-pre"
      },
      {
        "type": "datasource",
        "id": "influxdb",
        "name": "InfluxDB",
        "version": "1.0.0"
      },
      {
        "type": "panel",
        "id": "timeseries",
        "name": "Time series",
        "version": ""
      }
    ],
    "annotations": {
      "list": [
        {
          "builtIn": 1,
          "datasource": {
            "type": "grafana",
            "uid": "-- Grafana --"
          },
          "enable": true,
          "hide": true,
          "iconColor": "rgba(0, 211, 255, 1)",
          "name": "Annotations & Alerts",
          "type": "dashboard"
        }
      ]
    },
    "editable": true,
    "fiscalYearStartMonth": 0,
    "graphTooltip": 0,
    "id": null,
    "links": [],
    "panels": [
      {
        "datasource": {
          "type": "influxdb",
          "uid": "${DS_WINDFARM-DEMO}"
        },
        "fieldConfig": {
          "defaults": {
            "color": {
              "mode": "palette-classic"
            },
            "custom": {
              "axisBorderShow": false,
              "axisCenteredZero": false,
              "axisColorMode": "text",
              "axisLabel": "",
              "axisPlacement": "auto",
              "barAlignment": 0,
              "barWidthFactor": 0.6,
              "drawStyle": "line",
              "fillOpacity": 0,
              "gradientMode": "none",
              "hideFrom": {
                "legend": false,
                "tooltip": false,
                "viz": false
              },
              "insertNulls": false,
              "lineInterpolation": "linear",
              "lineWidth": 1,
              "pointSize": 5,
              "scaleDistribution": {
                "type": "linear"
              },
              "showPoints": "auto",
              "spanNulls": false,
              "stacking": {
                "group": "A",
                "mode": "none"
              },
              "thresholdsStyle": {
                "mode": "off"
              }
            },
            "mappings": [],
            "thresholds": {
              "mode": "absolute",
              "steps": [
                {
                  "color": "green"
                },
                {
                  "color": "red",
                  "value": 80
                }
              ]
            }
          },
          "overrides": []
        },
        "gridPos": {
          "h": 8,
          "w": 12,
          "x": 0,
          "y": 0
        },
        "id": 1,
        "options": {
          "legend": {
            "calcs": [],
            "displayMode": "list",
            "placement": "bottom",
            "showLegend": true
          },
          "tooltip": {
            "hideZeros": false,
            "mode": "single",
            "sort": "none"
          }
        },
        "pluginVersion": "11.6.0-pre",
        "targets": [
          {
            "datasource": {
              "type": "influxdb",
              "uid": "${DS_WINDFARM-DEMO}"
            },
            "query": "from(bucket: \"WindFarmData\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"TurbineData\")\n  |> filter(fn: (r) => r[\"_field\"] == \"value\")\n  |> filter(fn: (r) => r[\"name\"] == \"/Renton/WindFarm/Turbine/WindSpeed\")\n  |> filter(fn: (r) => r[\"quality\"] == \"GOOD\")\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n  |> yield(name: \"mean\")",
            "refId": "A"
          }
        ],
        "title": "Panel Title",
        "type": "timeseries"
      }
    ],
    "schemaVersion": 41,
    "tags": [],
    "templating": {
      "list": []
    },
    "time": {
      "from": "now-6h",
      "to": "now"
    },
    "timepicker": {},
    "timezone": "browser",
    "title": "demo dashboard",
    "uid": "fejc0t08o6d4wb",
    "version": 1,
    "weekStart": ""
  }
  ```

# Configure integraciones de código abierto con Docker (Linux)
<a name="linux-docker-setup"></a>

Para agilizar el proceso de implementación, puede usar Docker para configurar Node-RED®, InfluxDB® y Grafana® en un entorno Linux. Este método utiliza contenedores preconfigurados, lo que permite una implementación rápida y una administración más sencilla de los componentes.

## Requisitos previos de configuración de Docker
<a name="linux-docker-prerequisites"></a>

Antes de empezar, compruebe que tiene lo siguiente:
+ Una puerta de enlace V3 habilitada para MQTT. Para obtener más información, consulte [Puertas de enlace V3 habilitadas para MQTT para Edge AWS IoT SiteWise](mqtt-enabled-v3-gateway.md).
+ El complemento Docker Compose. Para ver los pasos de instalación, consulta [Instalar el Docker Compose complemento](https://docs.docker.com/compose/install/linux/) en la documentación de los manuales de *Docker*.

## Implemente los servicios
<a name="linux-docker-deployment"></a>

Esta implementación ejecuta SiteWise Edge, InfluxDB, Node-RED y Grafana en el mismo host.

### Configuración del entorno
<a name="linux-docker-env-setup"></a>

1. Obtenga acceso root:

   ```
   sudo -i
   ```

1. Cree un archivo.env o exporte estas variables de entorno:

   ```
   export INFLUXDB_PASSWORD=your-secure-influxdb-password
   export INFLUXDB_TOKEN=your-secure-influxdb-token
   export GRAFANA_PASSWORD=your-secure-grafana-password
   ```

### Configure la red Docker
<a name="linux-docker-network-config"></a>
+ Cree una red puente con el nombre`SiteWiseEdgeNodeRedDemoNetwork`.

  ```
  docker network create --driver=bridge SiteWiseEdgeNodeRedDemoNetwork
  ```

### Prepare el Docker Compose archivo
<a name="linux-docker-compose-file"></a>

Copie el contenido del siguiente archivo YAML en su dispositivo de puerta de enlace SiteWise Edge.

#### Amplíe para ver el ejemplo del archivo Docker Compose YAML
<a name="collapsible-section-docker-compose-file"></a>

```
services:
  influxdb:
    image: influxdb:latest
    container_name: influxdb
    ports:
      - "127.0.0.1:8086:8086"
    volumes:
      - influxdb-storage:/.influxdbv2
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUXDB_PASSWORD}
      - DOCKER_INFLUXDB_INIT_ORG=iot-sitewise-edge
      - DOCKER_INFLUXDB_INIT_BUCKET=WindFarmData
      - DOCKER_INFLUXDB_INIT_RETENTION=0
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUXDB_TOKEN}
    networks:
      - SiteWiseEdgeNodeRedDemoNetwork
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
      - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
      - GF_PATHS_CONFIG=/etc/grafana/grafana.ini
      - GF_LOG_LEVEL=info
    configs:
      - source: grafana_datasource
        target: /etc/grafana/provisioning/datasources/influxdb.yaml
      - source: grafana_preload_dashboard_config
        target: /etc/grafana/provisioning/dashboards/dashboard.yml
      - source: grafana_preload_dashboard
        target: /etc/grafana/provisioning/dashboards/demo_dashboard.json
    depends_on:
      - influxdb
    networks:
      - SiteWiseEdgeNodeRedDemoNetwork
    restart: unless-stopped

  nodered:
    build:
      context: .
      dockerfile_inline: |
        FROM nodered/node-red:latest
        RUN npm install node-red-contrib-influxdb
    container_name: nodered
    ports:
      - "127.0.0.1:1880:1880"
    volumes:
      - node_red_data:/data
    environment:
      - NODE_RED_ENABLE_SAFE_MODE=false
      - NODE_RED_ENABLE_PALETTE_EDIT=true
      - NODE_RED_AUTO_INSTALL_MODULES=true
    configs:
      - source: nodered_flows
        target: /data/flows.json
      - source: nodered_settings
        target: /data/settings.js
      - source: nodered_flows_cred
        target: /data/flows_cred.json
    depends_on:
      - influxdb
    networks:
      - SiteWiseEdgeNodeRedDemoNetwork
    restart: unless-stopped

volumes:
  influxdb-storage:
  grafana-storage:
  node_red_data:

networks:
  SiteWiseEdgeNodeRedDemoNetwork:
    external: true

configs:
  grafana_datasource:
    content: |
      apiVersion: 1
      datasources:
        - name: windfarm-demo
          type: influxdb
          access: proxy
          url: http://influxdb:8086
          jsonData:
            version: Flux
            organization: iot-sitewise-edge
            defaultBucket: WindFarmData
            tlsSkipVerify: true
          secureJsonData:
            token: ${INFLUXDB_TOKEN}
          editable: false

  grafana_preload_dashboard_config:
    content: |
      apiVersion: 1
      providers:
        - name: "Dashboard provider"
          orgId: 1
          type: file
          options: 
            path: /etc/grafana/provisioning/dashboards

  grafana_preload_dashboard:
    content: |
      {
        "annotations": {
          "list": [
            {
              "builtIn": 1,
              "datasource": {
                "type": "grafana",
                "uid": "-- Grafana --"
              },
              "enable": true,
              "hide": true,
              "iconColor": "rgba(0, 211, 255, 1)",
              "name": "Annotations & Alerts",
              "type": "dashboard"
            }
          ]
        },
        "editable": true,
        "fiscalYearStartMonth": 0,
        "graphTooltip": 0,
        "id": 1,
        "links": [],
        "panels": [
          {
            "datasource": {
              "type": "influxdb",
              "uid": "PEB0DCBF338B3CEB2"
            },
            "fieldConfig": {
              "defaults": {
                "color": {
                  "mode": "palette-classic"
                },
                "custom": {
                  "axisBorderShow": false,
                  "axisCenteredZero": false,
                  "axisColorMode": "text",
                  "axisLabel": "",
                  "axisPlacement": "auto",
                  "barAlignment": 0,
                  "barWidthFactor": 0.6,
                  "drawStyle": "line",
                  "fillOpacity": 0,
                  "gradientMode": "none",
                  "hideFrom": {
                    "legend": false,
                    "tooltip": false,
                    "viz": false
                  },
                  "insertNulls": false,
                  "lineInterpolation": "linear",
                  "lineWidth": 1,
                  "pointSize": 5,
                  "scaleDistribution": {
                    "type": "linear"
                  },
                  "showPoints": "auto",
                  "spanNulls": false,
                  "stacking": {
                    "group": "A",
                    "mode": "none"
                  },
                  "thresholdsStyle": {
                    "mode": "off"
                  }
                },
                "mappings": [],
                "thresholds": {
                  "mode": "absolute",
                  "steps": [
                    {
                      "color": "green"
                    },
                    {
                      "color": "red",
                      "value": 80
                    }
                  ]
                }
              },
              "overrides": []
            },
            "gridPos": {
              "h": 8,
              "w": 12,
              "x": 0,
              "y": 0
            },
            "id": 1,
            "options": {
              "legend": {
                "calcs": [],
                "displayMode": "list",
                "placement": "bottom",
                "showLegend": true
              },
              "tooltip": {
                "hideZeros": false,
                "mode": "single",
                "sort": "none"
              }
            },
            "pluginVersion": "11.6.0",
            "targets": [
              {
                "datasource": {
                  "type": "influxdb",
                  "uid": "PEB0DCBF338B3CEB2"
                },
                "query": "from(bucket: \"WindFarmData\")\n  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n  |> filter(fn: (r) => r[\"_measurement\"] == \"TurbineData\")\n  |> filter(fn: (r) => r[\"_field\"] == \"value\")\n  |> filter(fn: (r) => r[\"name\"] == \"/Renton/WindFarm/Turbine/WindSpeed\")\n  |> filter(fn: (r) => r[\"quality\"] == \"GOOD\")\n  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n  |> yield(name: \"mean\")",
                "refId": "A"
              }
            ],
            "title": "Wind Speed",
            "type": "timeseries"
          }
        ],
        "preload": false,
        "schemaVersion": 41,
        "tags": [],
        "templating": {
          "list": []
        },
        "time": {
          "from": "now-6h",
          "to": "now"
        },
        "timepicker": {},
        "timezone": "browser",
        "title": "Demo Dashboard",
        "uid": "eejtureqjo9a8c",
        "version": 2
      }

  nodered_flows:
    content: |
      [
        {
          "id": "95fce448fdd43b47",
          "type": "tab",
          "label": "Demo Flow",
          "disabled": false,
          "info": ""
        },
        {
          "id": "5f63740b66af3386",
          "type": "mqtt out",
          "z": "95fce448fdd43b47",
          "name": "Publish to MQTT broker",
          "topic": "/Renton/WindFarm/Turbine/WindSpeed",
          "qos": "1",
          "retain": "",
          "respTopic": "",
          "contentType": "",
          "userProps": "",
          "correl": "",
          "expiry": "",
          "broker": "5744207557fa19be",
          "x": 830,
          "y": 200,
          "wires": []
        },
        {
          "id": "8f2eb590d596679b",
          "type": "function",
          "z": "95fce448fdd43b47",
          "name": "Translate to SiteWise payload",
          "func": "let input = msg.payload;\nlet output = {};\n\noutput[\"propertyAlias\"] = input.name;\n\nlet propertyVal = {}\n\nlet timeInSeconds = Math.floor(input.timestamp / 1000);\nlet offsetInNanos = (input.timestamp % 1000) * 1000000;\n\npropertyVal[\"timestamp\"] = {\n    \"timeInSeconds\": timeInSeconds,\n    \"offsetInNanos\": offsetInNanos,\n};\n\npropertyVal[\"quality\"] = input.quality\n\nlet typeNameConverter = {\n    \"number\": (x) => Number.isInteger(x) ? \"integerValue\" : \"doubleValue\",\n    \"boolean\": (x) => \"booleanValue\",\n    \"string\": (x) => \"stringValue\", \n}\nlet typeName = typeNameConverter[typeof input.value](input.value)\npropertyVal[\"value\"] = {}\npropertyVal[\"value\"][typeName] = input.value;\n\noutput[\"propertyValues\"] = [propertyVal]\n\nreturn {\n    payload: JSON.stringify(output)\n};",
          "outputs": 1,
          "timeout": "",
          "noerr": 0,
          "initialize": "",
          "finalize": "",
          "libs": [],
          "x": 530,
          "y": 200,
          "wires": [
            [
              "5f63740b66af3386"
            ]
          ]
        },
        {
          "id": "4b78cbdea5e3258c",
          "type": "inject",
          "z": "95fce448fdd43b47",
          "name": "Turbine Simulator",
          "props": [
            {
              "p": "payload.timestamp",
              "v": "",
              "vt": "date"
            },
            {
              "p": "payload.quality",
              "v": "GOOD",
              "vt": "str"
            },
            {
              "p": "payload.value",
              "v": "$$random()",
              "vt": "jsonata"
            },
            {
              "p": "payload.name",
              "v": "/Renton/WindFarm/Turbine/WindSpeed",
              "vt": "str"
            }
          ],
          "repeat": "1",
          "crontab": "",
          "once": false,
          "onceDelay": "",
          "topic": "",
          "x": 270,
          "y": 200,
          "wires": [
            [
              "8f2eb590d596679b"
            ]
          ]
        },
        {
          "id": "b658bf337ea2e316",
          "type": "influxdb out",
          "z": "95fce448fdd43b47",
          "influxdb": "2f1c38495035d2e4",
          "name": "Store data in InfluxDB",
          "measurement": "TurbineData",
          "precision": "",
          "retentionPolicy": "",
          "database": "",
          "retentionPolicyV18Flux": "",
          "org": "iot-sitewise-edge",
          "bucket": "WindFarmData",
          "x": 840,
          "y": 340,
          "wires": []
        },
        {
          "id": "9432d39af35b202f",
          "type": "function",
          "z": "95fce448fdd43b47",
          "name": "Translate to InfluxDB payload",
          "func": "let data = msg.payload;\n\nlet timeInSeconds = data.propertyValues[0].timestamp.timeInSeconds;\nlet offsetInNanos = data.propertyValues[0].timestamp.offsetInNanos;\nlet timestampInMilliseconds = (timeInSeconds * 1000) + (offsetInNanos / 1000000);\n\nmsg.payload = [\n    {\n        \"timestamp(milliseconds_since_epoch)\": timestampInMilliseconds,\n        \"value\": data.propertyValues[0].value.doubleValue\n    },\n    {\n        \"name\": data.propertyAlias,\n        \"quality\": data.propertyValues[0].quality\n    }\n]\n\nreturn msg",
          "outputs": 1,
          "timeout": "",
          "noerr": 0,
          "initialize": "",
          "finalize": "",
          "libs": [],
          "x": 560,
          "y": 340,
          "wires": [
            [
              "b658bf337ea2e316"
            ]
          ]
        },
        {
          "id": "b689403d2c80816b",
          "type": "mqtt in",
          "z": "95fce448fdd43b47",
          "name": "Subscribe to MQTT broker",
          "topic": "/Renton/WindFarm/Turbine/WindSpeed",
          "qos": "1",
          "datatype": "auto-detect",
          "broker": "5744207557fa19be",
          "nl": false,
          "rap": true,
          "rh": 0,
          "inputs": 0,
          "x": 290,
          "y": 340,
          "wires": [
            [
              "9432d39af35b202f"
            ]
          ]
        },
        {
          "id": "4f59bed8e829fc35",
          "type": "comment",
          "z": "95fce448fdd43b47",
          "name": "Data Publish Flow",
          "info": "dfgh",
          "x": 270,
          "y": 160,
          "wires": []
        },
        {
          "id": "b218c7fc58c8b6e7",
          "type": "comment",
          "z": "95fce448fdd43b47",
          "name": "Data Retention flow",
          "info": "",
          "x": 270,
          "y": 300,
          "wires": []
        },
        {
          "id": "5744207557fa19be",
          "type": "mqtt-broker",
          "name": "emqx",
          "broker": "emqx",
          "port": "1883",
          "clientid": "",
          "autoConnect": true,
          "usetls": false,
          "protocolVersion": "5",
          "keepalive": 15,
          "cleansession": true,
          "autoUnsubscribe": true,
          "birthTopic": "",
          "birthQos": "0",
          "birthPayload": "",
          "birthMsg": {},
          "closeTopic": "",
          "closePayload": "",
          "closeMsg": {},
          "willTopic": "",
          "willQos": "0",
          "willPayload": "",
          "willMsg": {},
          "userProps": "",
          "sessionExpiry": ""
        },
        {
          "id": "2f1c38495035d2e4",
          "type": "influxdb",
          "hostname": "influxdb",
          "port": 8086,
          "protocol": "http",
          "database": "",
          "name": "InfluxDB",
          "usetls": false,
          "tls": "",
          "influxdbVersion": "2.0",
          "url": "http://influxdb:8086",
          "timeout": "",
          "rejectUnauthorized": false
        }
      ]

  nodered_flows_cred:
    content: |
      {
        "2f1c38495035d2e4": {
          "token": "${INFLUXDB_TOKEN}"
        }
      }

  nodered_settings:
    content: |
      module.exports = {
        flowFile: 'flows.json',
        credentialSecret: false,
        adminAuth: null,
        editorTheme: {
          projects: {
            enabled: false
          }
        }
      }
```

### Actualice la implementación de SiteWise Edge
<a name="w2aac17c19c19c26c27b7c11"></a>

1. Vaya a la [consola AWS IoT](https://console.aws.amazon.com/iot/).

1. Elija **dispositivos Greengrass** en el menú de navegación izquierdo, en la sección **Administrar**, y luego Dispositivos **principales**.

1. Seleccione el dispositivo principal conectado a su SiteWise Edge Gateway.

1. Elija la pestaña **Implementaciones y**, a continuación, seleccione el valor del **ID de implementación**.

1. Elija **Acciones** y, a continuación, seleccione **Revisar**. 

1. Lea el mensaje emergente y, a continuación, seleccione **Revisar Deployment**.

1. En el **paso 2: Seleccione los componentes**, seleccione los siguientes componentes y, a continuación, elija **Siguiente**.
   + `aws.greengrass.clientdevices.mqtt.EMQX`
   + `aws.iot.SiteWiseEdgePublisher`

1. En el **paso 3: Configurar los componentes**, seleccione el valor del `aws.greengrass.clientdevices.mqtt.EMQX` componente y añada la siguiente configuración de red:

   ```
   {
       "emqxConfig": {
           "authorization": {
               "no_match": "allow"
           },
           "listeners": {
               "tcp": {
                   "default": {
                       "enabled": true,
                       "enable_authn": false
                   }
               }
           }
       },
       "authMode": "bypass",
       "dockerOptions": "-p 127.0.0.1:1883:1883 --network=SiteWiseEdgeNodeRedDemoNetwork",
       "requiresPrivilege": "true"
   }
   ```

1. Elija **Siguiente**.

1. En el **paso 4: Configurar los ajustes avanzados**, seleccione **Siguiente**.

1. Elija **Implementar**.

### Inicie los servicios
<a name="linux-docker-launch"></a>

1. Inicie los servicios con el archivo Docker Compose. Ejecute el siguiente comando en el directorio que contiene el `compose.yaml` archivo.

   ```
   docker compose up -d
   ```

1. Cree un túnel SSH para acceder a los servicios:

   ```
   ssh -i path_to_your_ssh_key -L 1880:127.0.0.1:1880 -L 3000:127.0.0.1:3000 -L 8086:127.0.0.1:8086 username@gateway_ip_address
   ```

Esta implementación crea los siguientes servicios en: `SiteWiseEdgeNodeRedDemoNetwork network`

**InfluxDB v2 (puerto 8086)**  
Incluye una organización preconfigurada (iot-sitewise-edge), un depósito de WindFarmData InfluxDB y credenciales de administrador

**Node-RED (puerto 1880)**  
Incluye nodos InfluxDB y flujos preconfigurados para la integración AWS IoT SiteWise 

**Grafana (puerto 3000)**  
Incluye un usuario administrador, una fuente de datos de InfluxDB y un panel de monitoreo

### Acceda a los servicios
<a name="linux-docker-access-services"></a>

Tras la implementación, acceda a los servicios con URLs las siguientes credenciales:

**nota**  
Puede acceder a cada servicio desde su host o desde la máquina de puerta de enlace.


**Detalles de acceso al servicio**  

| Servicio | URL | Credenciales | 
| --- | --- | --- | 
| Node-RED | [http://127.0.0.1:1880](http://127.0.0.1:1880) | No se requieren credenciales | 
| InfluxDB | [http://127.0.0.1:8086](http://127.0.0.1:8086) |  Nombre de usuario: admin Contraseña: \$1INFLUXDB\$1PASSWORD  | 
| Grafana | [http://127.0.0.1:3000](http://127.0.0.1:3000) |  Nombre de usuario: admin Contraseña: \$1GRAFANA\$1PASSWORD  | 

## Verifique la implementación
<a name="linux-docker-verify-deployment"></a>

Para garantizar que la implementación se realice correctamente, realice las siguientes comprobaciones:

1. En el caso de Node-RED, compruebe la presencia de dos flujos precargados:
   + Flujo de publicación de datos
   + Flujo de retención de datos

1. Para AWS IoT SiteWise, en la AWS IoT SiteWise consola, confirme la presencia de un flujo de datos con el alias`/Renton/WindFarm/Turbine/WindSpeed`.

1. En el caso de InfluxDB, utilice el explorador de datos para verificar el almacenamiento de los datos en la `TurbineData` medición dentro del `WindFarmData` depósito.

1. En el caso de Grafana, consulta el panel para confirmar la visualización de los datos de series temporales generados por Node-RED.

# Procesa datos para integraciones de código abierto
<a name="open-source-data-processing-open-source"></a>

Los datos se pueden procesar (por ejemplo, mediante la transformación o la agregación) en diferentes etapas y utilizando diversas herramientas, cada una de las cuales cumple diferentes requisitos de monitoreo.

## Procese los datos con los nodos Node-RED
<a name="open-source-nodered-nodes"></a>

Transforme sus datos en tiempo real utilizando los nodos de procesamiento integrados de Node-RED®. Configure estos nodos a través de la consola Node-RED para crear su canalización de datos.

### Nodos de transformación de datos
<a name="open-source-data-transformation-nodes"></a>

Transforme puntos de datos individuales, de forma similar a Transforms in AWS IoT SiteWise, mediante estos nodos:
+ **cambiar de nodo**: realiza modificaciones de valores sencillas en los datos.
+ **nodo de función**: permite JavaScript transformaciones personalizadas para el procesamiento de datos complejos.

### Nodos de cálculo de métricas
<a name="open-source-metrics-calculation-nodes"></a>

Combine varios puntos de datos en una sola salida, de forma similar a Metrics in AWS IoT SiteWise, mediante estos nodos:
+ **nodo por lotes**: agrupa varios mensajes para su procesamiento por lotes.
+ **nodo de unión**: combina varios flujos de datos en una sola salida.
+ **nodo agregador**: calcula las métricas agregadas a partir de varios puntos de datos.

Para ver opciones de nodos adicionales, consulte la biblioteca [Node-RED](https://flows.nodered.org/).

## Cree tareas de InfluxDB
<a name="open-source-influxdb-tasks"></a>

Si bien Node-RED destaca en el procesamiento básico de datos con una configuración rápida, los cálculos métricos complejos pueden resultar complicados en la programación basada en flujos. Las tareas de InfluxDB® ofrecen una alternativa a través de los scripts Flux programados para necesidades de procesamiento avanzadas.

Utilice las tareas de InfluxDB para:
+ Agregaciones estadísticas en grandes conjuntos de datos
+ Operaciones matemáticas en múltiples propiedades
+ Mediciones derivadas de múltiples fuentes

### Características de la tarea
<a name="open-source-task-features"></a>
+ **Ejecución programada**: ejecuta tareas basadas en expresiones cron
+ **Procesamiento por lotes**: optimice las operaciones para datos de series temporales
+ **Recuperación de errores**: reintente automáticamente las operaciones fallidas
+ **Supervisión**: realice un seguimiento de la ejecución mediante registros detallados

Administre las tareas a través de la interfaz de usuario, la API o la CLI de InfluxDB. Para obtener más información, consulte [Procesar datos con tareas de InfluxDB](https://docs.influxdata.com/influxdb/cloud/process-data/).

## Usa las transformaciones de Grafana
<a name="open-source-grafana-transformations"></a>

Transforme la visualización de datos en Grafana® sin modificar los datos de origen en InfluxDB. Las transformaciones de Grafana se aplican solo a la capa de visualización.
+ **Visual Builder**: cree transformaciones sin escribir código
+ **Vista previa en vivo**: vea los resultados de la transformación en tiempo real
+ **Fuentes múltiples**: procese datos de múltiples fuentes de bases de datos
+ **Almacenamiento eficiente**: transforme los datos en el momento de la visualización sin almacenar resultados intermedios

Para obtener más información, consulte [Transformar datos](https://grafana.com/docs/grafana/latest/panels/transform-data/).

## Solución de problemas de integraciones de código abierto
<a name="open-source-troubleshoot"></a>

Para obtener más información sobre la solución de problemas relacionados con las integraciones de código abierto para las puertas de enlace SiteWise Edge, consulte. [Solución de problemas de integraciones de código abierto en Edge](troubleshooting-gateway.md#open-source-troubleshooting)