La pantalla de abajo es una estación de bombeo de aguas residuales: un pozo húmedo, dos bombas, una válvula de descarga, caudal y presión en vivo, controles de operador con un paso de confirmación, una lista de alarmas y una tendencia de nivel. Es un solo Custom Widget en un dashboard de TagoIO. TagoAI lo escribió a partir de una descripción escrita, y construirlo todo, incluido el simulador que lo alimenta, llevó una tarde.

Este artículo cuenta qué hay en la pantalla, cómo se mueven los datos y los comandos por la plataforma y cómo construir lo mismo en tu propia cuenta. Incluimos el prompt con el que empezamos en TagoAI, así que puedes partir de él y poner tus propios equipos.
Por qué TagoIO no tiene biblioteca de símbolos
Las pantallas SCADA se dibujan igual desde hace décadas: una biblioteca de símbolos (tanques, bombas, válvulas), un lienzo con coordenadas fijas y un diálogo de vinculación por cada símbolo. La biblioteca marca el techo. Cada equipo que el proveedor no dibujó se convierte en una tarea de desarrollo, por lo general edición de SVG más una capa de scripting que solo esa herramienta entiende.
En TagoIO nunca lanzamos una biblioteca de símbolos, y no lo vamos a hacer. Un Custom Widget puede ser un componente React que la plataforma empaqueta y aloja, con hooks que entregan datos en vivo del dispositivo y escriben comandos de vuelta. Desde julio de 2026, TagoAI escribe esos componentes a partir de un prompt en su panel de chat, dentro del dashboard. Un P&ID se convierte en una descripción: “un pozo húmedo con dos bombas, una válvula de descarga y un transmisor de presión en el colector de descarga”. Ese equipo poco común que opera tu cliente pasa a ser una frase más. El diagrama se escala solo porque es SVG dentro de un único widget, así que no hay una cuadrícula de columnas fijas que administrar.
El trato es claro. No tienes 100 símbolos para arrastrar. Tienes una pantalla dibujada para tu proceso, con el estilo que esperan tus operadores, y la cambias describiendo el cambio.
Qué hay en la pantalla
El diagrama sigue los principios de la HMI de alto rendimiento: fondo neutro, equipos en gris y el color reservado para el estado. El cian indica líquido, caudal, una válvula abierta o un motor en marcha. El ámbar y el rojo quedan para las alarmas, los límites de alarma y las advertencias, así un problema resalta sobre todo lo demás en la pantalla.
Pozo húmedo. El nivel llena el tanque, con una pequeña ola en la superficie. Las líneas discontinuas marcan el punto de consigna (SP) y los límites de alarma alto y bajo (HH, LL). El número grande es la lectura del transmisor de nivel LT-101.
Bombas P-101 y P-102. El impulsor gira mientras la bomba está en marcha y la etiqueta muestra la corriente del motor. Una falla pone la bomba en rojo con un anillo que pulsa, y los botones Start y Stop se reemplazan por Reset fault.
Válvula V-101 y colector de descarga. Una bomba en marcha anima sus propias tuberías, y el colector solo se anima mientras la válvula está abierta. Detén las dos bombas y el colector se queda quieto. PT-101 muestra la presión de descarga, FT-102 muestra el caudal de salida, y una presión por encima de 5,5 bar pone el instrumento en ámbar.
Controles del operador. Start y Stop por bomba, Open y Close para la válvula, y un control para subir o bajar el punto de consigna. Cada comando pide confirmación, y después un comando de bomba o de válvula muestra PENDING hasta que el campo reporta el nuevo estado o pasan 20 segundos. Los comandos de equipo quedan bloqueados mientras la estación está en AUTO; el punto de consigna sigue siendo editable.
Alarmas y tendencia. Las alarmas activas se derivan de los valores en vivo: nivel por encima de HH, nivel por debajo de LL, una bomba en marcha contra una válvula cerrada, una falla del variador o 30 minutos sin datos. Debajo está el historial de alarmas con su estado de reconocimiento, y un botón Acknowledge en el encabezado del panel reconoce todas las entradas de una vez. La tendencia muestra las últimas cuatro horas de nivel contra las mismas referencias SP, HH y LL.
Encabezado. El selector AUTO/MANUAL, un indicador en vivo con la antigüedad del registro más reciente que recibió el widget, y un contador de alarmas que parpadea mientras hay una alarma de severidad alta activa.
Cómo funciona
Todo lo que hay en la pantalla es una variable del dispositivo, y cada comando es un registro del dispositivo. El widget nunca confía en su propio clic sobre una bomba o una válvula: marca el equipo como PENDING y espera a que el estado vuelva desde el campo.
El dispositivo Pump Station 01 guarda todos los valores de la pantalla: wet_well_level con su punto de consigna y sus límites, inflow, outflow, discharge_pressure, el estado, la corriente y las horas de funcionamiento de cada bomba, valve_state, station_mode, y los eventos de alarma y sus reconocimientos. El widget lee esas variables, tal como están vinculadas en sus fuentes de datos, con el hook useRealtimeData del SDK de Custom Widget de TagoIO. Al cargar recibe los últimos registros guardados, hasta el límite de registros configurado en el widget, y después cada registro nuevo a medida que llega, así que la tendencia, las alarmas activas y las marcas PENDING salen todas de un mismo flujo de datos.
Los comandos hacen el camino inverso. Cuando el operador confirma Start en la P-102, el widget llama a sendData del hook useSendData con { variable: "pump_2_cmd", value: "start" }. El dashboard escribe ese registro en el dispositivo y, como el widget está configurado para ejecutar un Analysis cuando envía datos, ejecuta Pump Station Controller con el registro como scope. El Analysis es donde vive el comando de campo real: una publicación MQTT, un downlink LoRaWAN, un comando de TagoTiP por MQTT o una llamada HTTP a un gateway. En la demo también simula la respuesta del proceso, así que el nivel se mueve y las bombas cambian de estado sin hardware.
Las alarmas usan los mismos registros. Cada vez que se ejecuta, el Analysis escribe un evento de alarma por cada condición que se volvió verdadera desde su ejecución anterior; la alarma de datos desactualizados queda a cargo del widget. El widget deriva la lista de alarmas activas de los valores en vivo y marca como reconocidas las entradas del historial cuando un registro alarm_ack es más reciente que el evento.
Constrúyela en tu cuenta
Necesitas una cuenta de TagoIO con TagoAI activado en el perfil (Profile Settings, Services, AI Provider) y alrededor de una hora. Para la primera vuelta no hace falta hardware; el Analysis simula la estación.
- Crea el dispositivo. Usa Custom HTTPS para una estación simulada: no necesita número de serie y su parser deja tus registros tal como los envías. Elige almacenamiento mutable para poder editar valores a mano más adelante. Envía un primer lote de registros con los nombres de variable que usa la HMI:
wet_well_level,level_setpoint,level_high_alarm,level_low_alarm,inflow,outflow,discharge_pressure,pump_1_state,pump_1_speed,pump_1_current,pump_1_runtime, las mismas cuatro para la bomba 2,valve_state,station_mode,alarm,alarm_ackyalarm_state. Unas decenas de puntos dewet_well_levelrepartidos en las últimas horas le dan a la tendencia algo que dibujar. - Crea un dashboard Normal y abre el panel de TagoAI. Pega el prompt de abajo, pon el nombre de tu dispositivo y envíalo. TagoAI crea el Custom Widget, escribe el código y configura sus fuentes de datos. Después ajusta por chat: “agranda las bombas”, “pon las alarmas encima de la tendencia”, “usa nuestros tags”.
- Revisa las vinculaciones. Abre la configuración del widget y confirma que las fuentes de datos incluyen cada variable que lee la pantalla y cada comando que escribe (
pump_1_cmd,pump_2_cmd,pump_1_reset,pump_2_reset,valve_cmd,level_setpoint,station_mode,alarm_ack), y que cargan registros suficientes para llenar la tendencia de cuatro horas. Una variable que no está vinculada se descarta sin aviso cuando el widget la envía. - Crea el Analysis de control. Runtime Deno o Node, con el token del dispositivo como variable de entorno. Lee el último valor de cada variable de estado, aplica los comandos que llegaron en el scope, envía el comando de campo y escribe el nuevo estado de vuelta. Selecciona este Analysis en la opción “Run analysis when sending data” del widget. Para una demo, agrega un paso de simulación para que el nivel responda a las bombas.
- Agrega un widget Input Control debajo de la HMI con campos de texto para las variables de proceso. Escribir
faultenpump_1_stateo90enwet_well_leveles la forma más rápida de probar en pantalla los estados de los equipos y de las alarmas. - Dimensiona el widget. Ancho completo y unos 800 px de alto, con Background en transparente, Disable shadow activado y Header visibility en Show only buttons. Un botón en el encabezado que ejecute el Analysis con un scope vacío es un control cómodo para “avanzar la simulación”.
El prompt del que partimos, listo para adaptar:
Crea una HMI estilo SCADA de una estación de bombeo de aguas residuales para el dispositivo Pump Station 01, como un solo widget que ocupe todo el lienzo. Estilo HMI de alto rendimiento con tema oscuro: fondo neutro, equipos en gris, color solo para estados y alarmas.
Dibuja un diagrama de proceso en SVG: un pozo húmedo que muestre wet_well_level como un nivel relleno, con una línea de punto de consigna (level_setpoint) y líneas de alarma alta y baja (level_high_alarm, level_low_alarm); una tubería de entrada con inflow; dos bombas centrífugas, P-101 y P-102, que reflejen pump_1_state y pump_2_state (running, stopped, fault), con impulsores que giren mientras están en marcha y etiquetas pump_1_current / pump_2_current; un colector de descarga con la válvula V-101 (valve_state open o closed), el transmisor de presión PT-101 (discharge_pressure) y el medidor de caudal de salida FT-102 (outflow). Anima el flujo solo en las tuberías que llevan caudal.
Agrega un panel de operador: botones Arrancar y Parar por bomba (envía pump_1_cmd o pump_2_cmd = start o stop), Abrir y Cerrar para la válvula (envía valve_cmd), un control para subir y bajar el punto de consigna que envíe level_setpoint, y un selector AUTO/MANUAL (envía station_mode) que bloquee los comandos de equipo mientras esté en AUTO. Cada comando necesita un paso de confirmación y un estado PENDIENTE hasta que el dispositivo reporte el nuevo valor.
Agrega un panel de alarmas: alarmas activas derivadas de los valores en vivo (nivel por encima del límite alto, nivel por debajo del límite bajo, bomba en marcha con la válvula cerrada, falla de bomba, 30 minutos sin datos) más el historial de la variable alarm con su estado de reconocimiento; un botón Reconocer envía alarm_ack. Agrega una franja de KPI (inflow, outflow, presión, corrientes de motor, horas de funcionamiento) y una tendencia de nivel de cuatro horas con las mismas líneas de punto de consigna y de límites.
El resultado de TagoAI varía de una ejecución a otra, y la precisión del prompt importa. Pide un cambio a la vez y mantén los nombres de tags iguales a los del dispositivo; la mayoría de los errores vienen de una variable que se llama de una forma en el prompt y de otra en el dispositivo.
De la demo al campo
Reemplaza el simulador. Conserva el Analysis, borra el paso de simulación y el estado que escribe de vuelta, y apunta el comando de campo a tu gateway: un topic MQTT al que se suscribe el PLC, un downlink LoRaWAN o un comando de TagoTiP por MQTT. A partir de ahí el dispositivo recibe su estado del PLC y la pantalla no cambia. Crea el dispositivo de producción con almacenamiento Hybrid: un dispositivo mutable tiene capacidad para 50.000 registros, mientras que uno Hybrid manda las lecturas a una parte inmutable y deja editables los comandos y los puntos de consigna.
Cubre toda la flota con una sola pantalla. Construye el mismo widget en un Blueprint Dashboard. El widget se vincula a un dispositivo Blueprint y se resuelve a la estación que elija el usuario, así una sola HMI sirve para todas las estaciones de bombeo de la empresa de agua. Haz que el encabezado muestre la estación seleccionada y que el Analysis actúe sobre el dispositivo del que vino cada comando, no sobre uno fijo.
Lleva la pantalla a los operadores con TagoRUN. Los Custom Widgets funcionan en los portales de TagoRUN. Entrega la HMI en tu aplicación con tu marca, y deja que Access Management decida qué usuarios ven cada estación. Cada comando que envía un operador es un registro del dispositivo guardado con fecha y hora, así que el historial de comandos forma parte de los datos de la propia estación.
Avisa fuera de la pantalla. Ejecuta el Analysis también desde una Action sobre la telemetría entrante, para que los registros de alarma se escriban aunque nadie esté haciendo clic. Una Action sobre la variable alarm envía entonces una notificación push, un webhook, o email y SMS a través de tu cuenta de SMTP, SendGrid o Twilio en cuanto se escribe un nuevo registro de alarma. Una Action programada también puede ejecutar el Analysis para escalar una alarma que siga sin reconocer.
Haz que la pantalla diga la verdad. El widget muestra la antigüedad del registro más reciente que recibió y dispara una alarma de datos desactualizados después de 30 minutos sin registros. En una estación real, haz que solo la telemetría de campo cuente para esa antigüedad; una HMI que parece en vivo mientras el enlace está caído es peor que una en blanco.
Dibuja tu proceso
Abre un dashboard Normal o Blueprint, haz clic en el icono de TagoAI, pega el prompt y cambia nuestros tags por los tuyos. Un parque de tanques, una planta de chillers, un skid de compresores o una línea de envasado siguen el mismo patrón: variables que entran, comandos que salen a través de un Analysis y una pantalla descrita en lenguaje natural.
Los detalles están en la introducción al Custom Widget, en la guía de HMI estilo SCADA y en la documentación de TagoAI. Publica la pantalla que construyas en la Comunidad de TagoIO. Queremos verla.