Cómo implementar la programación basada en eventos usando la hora Unix en IoT Logic
En esta sección, configuraremos un temporizador en IoT Logic para controlar la activación de salidas en los dispositivos. Esto funcionará como un programador al utilizar la hora Unix para el control basado en tiempo.

Primero, la lógica del programador se construyó basándose en la hora Unix, ya que es el único parámetro fiable y consistente en el que siempre podemos confiar. El segundo elemento clave es la marca de tiempo de los paquetes válidos recibidos por la plataforma. Es importante señalar que esta lógica requiere que el dispositivo envíe continuamente paquetes de datos válidos a la plataforma. La frecuencia en sí no es crítica; sin embargo, si no se reciben mensajes entrantes, resulta imposible evaluar el tiempo o activar cualquier acción programada.
Ahora, pasando al nodo de cálculo del atributo de lógica implementada. Este nodo recupera:
La hora actual del evento (current_time) del paquete más reciente
La hora anterior del evento (prev_time) del paquete anterior
Ambos valores se convierten de milisegundos a segundos.
Es importante señalar que genTime se proporciona en hora Unix (milisegundos) y debe dividirse entre 1000 para obtener la hora Unix en segundos, que es el formato que utilizaremos para todos los cálculos.
A partir de estos, el sistema calcula:
current_sod (segundos del día)
prev_sod (segundos del día para el paquete anterior)
Esto se hace utilizando la operación módulo, que extrae la cantidad de segundos transcurridos desde medianoche, convirtiendo de hecho la hora Unix en una referencia de hora del día.
Puede observarse un desplazamiento horario en estas fórmulas. Este desplazamiento está determinado por la zona horaria UTC en la que se realizan los cálculos.
En el escenario de prueba, los cálculos se realizaron en UTC -6, lo que dio como resultado una diferencia de 6 horas. Al convertirlo a segundos, esto equivale a: 6 horas × 60 min × 60 seg = 21.600 segundos.
Usando estos valores, el sistema detecta transiciones de tiempo, no estados continuos.
Por ejemplo:
Condición de encendido (p. ej., 20:00): El sistema comprueba cuándo el tiempo cruza el umbral:
Condición de apagado (p. ej., 5:00):
Esto garantiza que la acción se active solo una vez en el momento de la transición, en lugar de hacerlo continuamente durante toda la ventana de tiempo.
Una vez que se cumple la lógica, el nodo de acción activará el comando de salida para cambiar el estado de la salida. A lo largo de este flujo pueden surgir algunas limitaciones, y es importante destacarlas para que puedan tenerse en cuenta:
Dependiente de los datos entrantes:
Si el dispositivo deja de enviar datos, no se activará ninguna acción. Por eso se requiere una supervisión continua de la unidad. Si el dispositivo está desconectado, bloqueado o en modo de suspensión sin enviar datos válidos, el cambio de estado nunca se detectará.
Sin garantía de ejecución exacta en el tiempo:
Las acciones se ejecutan cuando llega el siguiente paquete de datos después de que se alcanza el umbral, no exactamente en el momento programado. Por ejemplo, si el dispositivo informa cada 5 minutos y el último paquete se recibió a las 20:58, el siguiente mensaje llegará a las 21:03. En ese momento, la lógica se cumplirá y se activará la acción (p. ej., activación de salida).
Se requiere gestión de la zona horaria:
Como la hora Unix está en UTC, debe aplicarse un desplazamiento para alinearla con la hora local deseada.
Sin estado de programación persistente:
El sistema no almacena tiempos futuros de activación; depende por completo de comparaciones en tiempo real entre paquetes entrantes consecutivos.
Esta solución simula un programador en un sistema basado en eventos mediante el uso de marcas de tiempo Unix y la detección de transiciones de tiempo entre paquetes de datos consecutivos. Aunque no es un verdadero programador, proporciona una forma fiable y escalable de implementar automatización basada en el tiempo sin requerir compatibilidad nativa con la programación.
Última actualización
¿Te fue útil?