# Ejemplo de configuración de flujo

Este ejemplo demuestra cómo configurar un flujo que recopila datos de dispositivos IoT, realiza cálculos para derivar métricas relevantes para el negocio y reenvía los datos enriquecidos a un sistema externo. El ejemplo utiliza un patrón de flujo lineal que puede adaptarse a diversos casos de uso de la industria.

## Escenario de negocio

En este escenario, una organización ha desplegado rastreadores IoT en sus activos y necesita procesar los datos de estos dispositivos para análisis empresariales. La organización recibe los siguientes parámetros directamente desde sus dispositivos de seguimiento:

* `speed`: Velocidad del vehículo en kilómetros por hora
* `temperature`: Temperatura ambiental en grados Celsius
* `odometer`: Distancia recorrida en kilómetros
* `ignition`: Estado de encendido del motor (1 = encendido, 0 = apagado)
* `fuel_level`: Medición actual del nivel de combustible
* `pressure_psi`: Lectura de presión en PSI
* `voltage`: Voltaje de la batería en voltios
* `throttle`: Posición del pedal del acelerador desde el bus CAN (0-255)
* `fuel_level_1`: Primera medición del nivel del tanque de combustible
* `fuel_level_2`: Segunda medición del nivel del tanque de combustible

La organización necesita:

1. Recopilar datos telemétricos sin procesar desde los dispositivos para mantener un registro completo de las operaciones de los activos
2. Convertir las unidades de medida para que coincidan con su formato estándar de informes (unidades imperiales) para mantener la coherencia con los sistemas empresariales existentes
3. Calcular métricas basadas en el tiempo que indiquen patrones de uso para optimizar la utilización de activos y los calendarios de mantenimiento
4. Crear métricas derivadas para generar información operativa que no es proporcionada directamente por el hardware
5. Reenviar los datos enriquecidos a un sistema externo de análisis para su integración con plataformas de inteligencia empresarial
6. Enviar los datos sin cambios a Navixy para su monitorización

Este flujo transformará los datos sin procesar del dispositivo a un formato que respalde directamente la toma de decisiones empresariales, manteniendo la integridad de las mediciones originales.

## Pasos de configuración del flujo

Siga estos pasos para construir un flujo integral de transformación y reenvío de datos:

{% stepper %}
{% step %}

### **Crear un nuevo flujo**

1. Haga clic en el **New flow** botón en la parte superior de la interfaz de IoT Logic
2. Introduzca *Asset Telemetry Processing* como nombre del flujo
3. Agregue una descripción: "*Recopila datos del dispositivo, calcula métricas derivadas y los reenvía a la plataforma de análisis.*"
4. Asegúrese de que el **Flow enabled** interruptor esté activado
5. Haga clic en **Guardar** para crear el flujo

<figure><img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-d2a74f7968dab62f5634e7a048a9fda7bd93b8bb%2Fimage-20250407-200203.png?alt=media" alt="Create flow dialog with filled-in name and description, Flow enabled toggle on"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Configurar la fuente de datos**

1. Arrastre un **Fuente de datos** nodo desde el menú izquierdo al espacio de trabajo
2. Haga doble clic en el nodo para abrir su panel de configuración
3. En **Nombre del nodo** escriba *Asset Trackers*
4. Seleccione los dispositivos que desea incluir en este flujo desde la lista filtrada

* Para este ejemplo, seleccione al menos dos dispositivos con capacidades similares

5. Haga clic en **Aplicar** para guardar la configuración del nodo

<figure><img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-5d3308c8c7e9a9bd01f1a090ba8c14cd33b6e2b1%2Fimage-20250407-200511.png?alt=media" alt="Data source node configuration with selected devices" width="375"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Configurar las transformaciones de datos básicas**

1. Arrastre un **Iniciar atributo** nodo desde el menú izquierdo al espacio de trabajo
2. Conecte el **Fuente de datos** nodo a este **Iniciar atributo** nodo
3. Haga doble clic en el nodo para abrir su configuración
4. En **Nombre del nodo** escriba *Conversiones de unidades*
5. Cree los siguientes atributos para la conversión de unidades (todos los ejemplos usan sintaxis corta, refiriéndose a los valores de atributo más recientes sin verificación de validez):
   1. Agregue un nuevo atributo para la conversión de velocidad (km/h a mph): 1. Nombre del atributo: *speed\_mph* 2. Valor: `speed/1.609`
   2. Agregue un nuevo atributo para la conversión de temperatura (Celsius a Fahrenheit): 1. Nombre del atributo: *temperature\_F* 2. Valor: `temperature*1.8 + 32`
   3. Agregue un nuevo atributo para la conversión de distancia (kilómetros a millas): 1. Nombre del atributo: *distance\_miles* 2. Valor: `odometer/1.609`
   4. Agregue un nuevo atributo para la conversión de presión (PSI a Bar): 1. Nombre del atributo: *pressure\_bar* 2. Valor: `pressure_psi * 0.06895`
6. Haga clic en **Aplicar** para guardar la configuración del nodo

<figure><img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-e88dbb7ac084cc181b9a1344644c350ac263a398%2Fimage-20250407-201226.png?alt=media" alt="First Initiate attribute node showing the unit conversion attributes"><figcaption></figcaption></figure>

{% hint style="info" %}
Para obtener explicaciones sobre los cálculos introducidos en este paso, consulte [Basic unit conversions](#basic-unit-conversions)
{% endhint %}
{% endstep %}

{% step %}

### **Crear métricas calculadas avanzadas**

1. Arrastre otro **Iniciar atributo** nodo desde el menú izquierdo al espacio de trabajo
2. Conecte el primer **Iniciar atributo** nodo a este nuevo
3. Haga doble clic en el nodo para abrir su configuración
4. En **Nombre del nodo** escriba *Advanced calculations*
5. Cree los siguientes atributos para métricas avanzadas:
   1. Agregue un atributo para la detección de cambios de temperatura:
      1. Nombre del atributo: *temperature\_change*
      2. Valor: `value('temperature', 0, 'valid') - value('temperature', 1, 'valid')`&#x20;
      3. `genTime('temperature', 0, 'valid')`
   2. Agregue un atributo para encontrar el tiempo transcurrido entre las dos últimas lecturas:&#x20;
      1. &#x20;Nombre del atributo: *time\_between\_readings\_ms*&#x20;
      2. Valor: `srvTime('speed', 0, 'valid') - srvTime('speed', 1, 'valid')`&#x20;
      3. Hora de generación: `genTime('speed', 0, 'valid')`
   3. Agregue un atributo para redondear la temperatura al entero más cercano:
      1. Nombre del atributo: *temperature\_rounded*&#x20;
      2. Valor: `math:round(value('temperature', 0, 'valid'))`
   4. Agregue un atributo para el cálculo de valor estandarizado (normalizando el nivel de combustible a 0-100%):&#x20;
      1. Nombre del atributo: *fuel\_level\_percent*&#x20;
      2. Valor: `(value('fuel_level', 0, 'valid') - 0) / (100 - 0) * 100`
   5. Agregue un atributo para el cálculo del porcentaje de carga de la batería:&#x20;
      1. Nombre del atributo: *battery\_percentage*&#x20;
      2. Valor: `(value('voltage', 0, 'valid') - 11) / (14 - 11) * 100`
   6. Agregue un atributo para el cálculo de la posición del acelerador:&#x20;
      1. Nombre del atributo: *throttle\_percentage*&#x20;
      2. Valor: `value('throttle', 0, 'valid') / 255 * 100`
   7. Agregue un atributo para el nivel promedio de combustible a partir de múltiples sensores:&#x20;
      1. Nombre del atributo: *avg\_fuel\_level*&#x20;
      2. Valor: `(value('fuel_level_1', 0, 'valid') + value('fuel_level_2', 0, 'valid')) / 2`
6. Haga clic en **Aplicar** para guardar la configuración del nodo

<figure><img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-bec2e2d25385ec3b81e31fd2f78da9fab2e3f1b8%2Fimage-20250407-202303.png?alt=media" alt="Second Initiate attribute node showing the advanced calculated metrics"><figcaption></figcaption></figure>

{% hint style="info" %}
Para obtener explicaciones sobre los cálculos introducidos en este paso, consulte [Cálculos de métricas avanzadas](#advanced-metrics-calculations).
{% endhint %}
{% endstep %}

{% step %}

### **Configurar el endpoint de salida**

1. Arrastre un **Punto final de salida** nodo desde el menú izquierdo al espacio de trabajo
2. Conecte el segundo **Iniciar atributo** nodo a este **Punto final de salida** nodo
3. Haga clic en el nodo para abrir su configuración
4. Configure los siguientes ajustes:
   1. **Tipo de endpoint**: *MQTT endpoint*
   2. **Nombre del endpoint**: *Analytics Platform*
   3. **Protocolo**: default *Navixy Generic Protocol (JSON)*
   4. **IP/Dominio**: Introduzca la dirección del sistema de destino (p. ej., "*analytics.example.com*")
   5. **Puerto**: *8883* (por defecto para MQTT, puede dejarlo vacío)
   6. **Habilitar SSL**: *activar el interruptor*
   7. **Versión de MQTT**: *5.0*
   8. **MQTT Client ID**: *asset-telemetry-client*
   9. **Tema**: *telemetry/assets/raw*
   10. **QoS**: *1*
   11. **Autenticación MQTT**: *Sí* (si lo requiere su sistema de destino)
   12. **Inicio de sesión y contraseña MQTT**: Introduzca credenciales si corresponde
5. Haga clic en **Crear** para guardar la configuración del nodo

<figure><img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-5bba126378b9c39ca8546d7caf4630e800855eb1%2Fimage-20250407-202704.png?alt=media" alt="Output endpoint node configuration with filled-in connection settings" width="375"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Agregar endpoint de salida predeterminado**

1. Arrastre un **Punto final de salida** nodo desde el menú izquierdo al espacio de trabajo
2. En **Tipo de endpoint** seleccionar **Default Endpoint**
3. Haga clic en **Guardar** para aplicar la configuración del nodo
4. Conecte el *Asset Trackers* (**Fuente de datos**) node to it

Esto garantiza que los datos sin procesar se envíen a Navixy directamente desde los dispositivos, sin ninguna transformación ni enriquecimiento.
{% endstep %}

{% step %}

### **Guardar y probar el flujo**

Su configuración final se verá así:

<figure><img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-1602478802bdfdba0a251ec29eaf677ef6562456%2Fimage-20250407-203757.png?alt=media" alt="Complete flow configuration with all nodes connected in IoT Logic workspace"><figcaption></figcaption></figure>

Haga clic en el **Guardar flujo** botón en el **Nodes** panel para almacenar la configuración de su flujo.
{% endstep %}
{% endstepper %}

{% hint style="success" %}
Use [Data Stream Analyzer (DSA)](https://www.navixy.com/docs/user/es/guide/account/iot-logic/data-stream-analyzer) para supervisar los datos entrantes y verificar:

* Los dispositivos están enviando datos al flujo
* Los cálculos están funcionando como se espera
* Los datos se están reenviando al destino Por ejemplo, verifiquemos que las conversiones de velocidad se calculan correctamente en un camión. Para hacerlo en DSA, seleccione el **Volvo** dispositivo y atributos **speed** y **speed\_mph**:\ <img src="https://3876955220-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-dd91833c4e91cbf04798d44c3604cd4ef38c0937%2Fimage-20250407-204530.png?alt=media" alt="Speed attributes for one device in Data Stream Analyzer" data-size="original">

¡Todo bien! Los datos se reciben y se convierten con éxito.
{% endhint %}

## Transformaciones de datos explicadas

Examinemos los cálculos clave utilizados en este flujo.

### Basic unit conversions

El primer **Initiate attribute node** realiza conversiones de unidades sencillas:

* **Speed**: Convierte km/h a mph dividiendo por 1.609
* **Temperatura**: Convierte Celsius a Fahrenheit usando la fórmula °F = °C × 1.8 + 32
* **Distance**: Convierte kilómetros a millas dividiendo por 1.609
* **Pressure**: Convierte PSI a Bar multiplicando por 0.06895, haciéndolo compatible con los estándares internacionales de medición de presión

Estas conversiones garantizan coherencia con los formatos de informes estándar y hacen que los datos sean inmediatamente utilizables para el análisis. Las conversiones de unidades son particularmente valiosas para organizaciones multinacionales que operan en regiones con diferentes estándares de medición.

### Cálculos de métricas avanzadas

El segundo **Initiate attribute node** realiza cálculos más complejos:

* **Detección de cambio de temperatura**: Calcula la diferencia entre las lecturas de temperatura actuales y anteriores para identificar cambios bruscos. Esto ayuda a detectar fallos en el equipo, como fallos de refrigeración en vehículos de transporte o problemas HVAC en las instalaciones. Por ejemplo, un aumento repentino de 5°C en un contenedor refrigerado podría indicar una falla del sistema de enfriamiento que requiere atención inmediata.
  * **Hora de generación**: Usar `genTime('temperature', 0, 'valid')` es crucial aquí porque preserva la marca de tiempo exacta cuando la lectura de temperatura fue generada por el dispositivo, asegurando un análisis temporal preciso de los cambios de temperatura.
  * **Hora del servidor**: El valor predeterminado `now()` captura automáticamente cuándo el servidor recibió los datos. Dado que no necesitamos modificar esta marca de tiempo, podemos dejar este campo vacío durante la configuración.
* **Tiempo entre lecturas**: Mide el intervalo entre transmisiones de datos consecutivas comparando las marcas de tiempo del servidor. Este cálculo ayuda a identificar problemas de comunicación o validar que los dispositivos están reportando con las frecuencias esperadas. Intervalos irregulares podrían indicar problemas de conectividad, mientras que retrasos consistentes podrían sugerir congestión de red o problemas de configuración del dispositivo.
* **Redondeo de valores**: Aplica redondeo matemático a las lecturas de temperatura, reduciendo la precisión decimal a enteros. Esto simplifica la visualización y los reportes de datos mientras reduce los requisitos de almacenamiento para datos históricos. Los valores redondeados son especialmente útiles para pantallas de panel y alertas basadas en umbrales donde la precisión decimal no es necesaria.
  * **Hora de generación**: Especificar `genTime('speed', 0, 'valid')` conecta estos metadatos directamente con la marca de tiempo de la lectura original, haciendo posible analizar tanto el intervalo de tiempo como cuándo ocurrió.
  * **Hora del servidor**: El valor predeterminado `now()` captura automáticamente cuándo el servidor recibió los datos. Dado que no necesitamos modificar esta marca de tiempo, podemos dejar este campo vacío durante la configuración.
* **Cálculo de valor estandarizado**: Normaliza las lecturas brutas del sensor a una escala porcentual (0-100%). Esta estandarización facilita la comparación de lecturas entre diferentes tipos de sensores y modelos de vehículo. Para la gestión de flotas, esto permite reportes consistentes del nivel de combustible independientemente de la implementación específica del sensor de combustible en cada modelo de vehículo, posibilitando alertas uniformes de bajo nivel de combustible y análisis de consumo.
* **Cálculo del porcentaje de carga de la batería**: Normaliza las lecturas de voltaje de la batería (rango 11V-14V) a una escala de 0-100% para facilitar la monitorización. Por ejemplo, una lectura de 12.5V se normalizaría a 50%, proporcionando un indicador intuitivo del estado de la batería entre diferentes tipos de vehículos.
* **Cálculo de la posición del acelerador**: Convierte los datos brutos de la posición del acelerador (rango 0-255) del bus CAN del vehículo a una escala porcentual. Esta estandarización ayuda a los operadores a comprender rápidamente el comportamiento del conductor y el rendimiento del vehículo sin necesidad de interpretar valores de sensor sin procesar.
* **Nivel promedio de combustible a partir de múltiples sensores**: Combina lecturas de dos sensores de combustible separados para producir una medición general del nivel de combustible más precisa. Esto es especialmente valioso para vehículos con formas complejas de tanque o múltiples tanques, donde un único sensor podría no proporcionar lecturas fiables debido al desplazamiento del combustible durante el movimiento.

## Resumen del flujo de ejemplo

Esta configuración de flujo demuestra varias capacidades clave de IoT Logic:

1. **Estandarización**: Convierte lecturas específicas del dispositivo en métricas empresariales estandarizadas
2. **Enriquecimiento**: Crea nuevas métricas significativas que no están disponibles directamente desde los sensores del dispositivo
3. **Transformación**: Cambia las unidades para que coincidan con los requisitos de informes comerciales
4. **Contexto histórico**: Utiliza lecturas anteriores para calcular métricas basadas en tendencias
5. **Determinación de estado**: Crea valores categóricos basados en múltiples entradas de sensores

Esta combinación de capacidades transforma los datos sin procesar del dispositivo en inteligencia empresarial accionable, apoyando directamente la toma de decisiones operativas mientras mantiene la integridad de las mediciones originales.
