← Todas las publicaciones
Por qué reemplacé mis servicios NUT con ESP32s

Por qué reemplacé mis servicios NUT con ESP32s

Sí, este es otro episodio de "sobreingeniería para meterme en mi propio homelab con un montón de firmware de ESP-IDF que probablemente no debí haber escrito, pero se ve súper bien".

Este empezó con una sola pregunta que me tomó años responder bien: cómo saco el reporte de energía de mis unidades APC, en tiempo real, sin una computadora cuidando cada una.

Años peleando por un solo reporte HID desde las UPS

Empecé donde empieza todo el mundo, con PowerChute. Solo corre en Windows. Así que salí a comprar mini PCs, les puse una copia de Windows, y las conecté a los UPS únicamente para leer sus datos. Visualizar cualquier cosa era un problema aparte: o me conectaba por escritorio remoto a una máquina para mirar una ventana, o sacaba los números de los archivos de log y los mandaba a un Postgres central.

Años después encontré NUT, y fue una brisa de aire fresco. Podía por fin reemplazar Windows en los controladores, los datos salían en un formato manejable, y una Raspberry Pi barata podía hacer el trabajo en lugar de un mini PC.

Aun así seguía siendo una computadora entera por UPS. Un sistema operativo, una tarjeta SD que tarde o temprano se muere, actualizaciones, un consumo de corriente, todo eso ahí sentado para parsear un solo reporte HID. Para lo que en realidad es el trabajo, era exagerado.

Una sola placa, en modo host

La respuesta fue un ESP32-S3 Super Mini corriendo como host USB HID, conectado directamente al puerto de servicio del UPS. El modo host es donde pasa el trabajo de verdad, y es día y noche con respecto a lo anterior: la placa le habla al UPS igual que lo hace el software del fabricante, lee el reporte, y esa es toda la lista de dependencias. Sin sistema operativo en el medio, sin stack de drivers, sin una segunda máquina.

Es un dispositivo de muy bajo consumo del lado del UPS, es rápido, está hecho para una sola cosa, y es lo bastante pequeño como para esconderlo en cualquier lado. Incluso dentro del propio UPS.

La página de estado muestra las métricas ya parseadas junto a los reportes HID crudos que van llegando por el cable, lo cual fue invaluable mientras resolvía la lógica de parseo.

La página de estado del puente: métricas del UPS ya parseadas, estado de la conexión y el log de reportes HID crudos

Una vez que funcionó, decidí hacer una implementación completa. El dispositivo sirve su propia interfaz web tanto para los datos en vivo como para su configuración, publica a MQTT para Home Assistant, levanta un portal cautivo SoftAP para la configuración inicial, y acepta actualizaciones OTA, así que nunca tengo que abrir un gabinete para reflashearlo.

La página de configuración del dispositivo: identidad, WiFi, broker MQTT, intervalo de publicación y carga de firmware OTA

En Home Assistant el UPS simplemente aparece. El autodescubrimiento por MQTT trae el set completo de sensores: carga y autonomía de la batería, voltaje de entrada, carga conectada, tipo de batería y fecha de fabricación, estado del beeper, en fin, todo.

El UPS autodescubierto en Home Assistant por MQTT, con su lista completa de sensores

Con eso, PowerChute y los servidores NUT desaparecieron de mis tres nodos.

La ambición: un único dashboard para verlo todo junto

Una vez que cada UPS publicaba por su cuenta, el paso obvio era un solo lugar para ver todo el panorama de energía. De ahí salió HMS-NUT.

Toma todos los nodos y me da un resumen en vivo: medidores de batería y carga por unidad, mini gráficas de tendencia de 24 horas, y un indicador de última señal para que un dispositivo callado se note enseguida.

El estado en vivo de HMS-NUT: un resumen de toda la flota con batería y carga por unidad

Los dispositivos se gestionan desde la interfaz y los cambios aplican en vivo, sin reiniciar el servicio. Vale la pena decirlo claro: sigue hablando NUT. Mis propias unidades ahora son todas puentes ESP32-S3, pero si tienes un servidor NUT lo puedes agregar al mismo listado y cae en el mismo panel que todo lo demás.

La gestión de dispositivos en HMS-NUT, donde cada nodo se registra y se puede renombrar o deshabilitar

El historial es la parte que más uso. Cada métrica se guarda, así que puedo sacar tendencias de todos los nodos a la vez o meterme en una sola unidad, y comparar unidades entre sí en lugar de adivinar.

Gráficas históricas de todos los nodos, para detectar tendencias y comparar unidades

También hay un resumen diario. Una vez al día los agregados del día anterior de cada dispositivo van a un LLM, y este escribe el estado de mi infraestructura eléctrica: estabilidad del voltaje, carga, salud de las baterías, cualquier cosa que valga la pena vigilar. Los resúmenes se guardan, así que puedo hacer scroll hacia días anteriores, y cada uno registra el modelo que lo produjo.

El resumen diario de energía, escrito a partir de los agregados del día anterior, con los días anteriores guardados

Código abierto es la mejor política

  • hms-esp-apc, el firmware host USB del ESP32-S3 que lee el UPS y publica a MQTT
  • hms-nut, el microservicio en C++ que agrega todos los nodos, guarda el historial y escribe el resumen diario

Lo que viene

Imprimir 3D una caja para protegerlo. Hay un detalle que hay que sortear en el diseño: el puerto HID del APC no entrega corriente, espera una señal de 5 V entrando, así que el ESP32 necesita su propia fuente. Eso significa un puerto USB-C extra en la placa para la alimentación, y una carcasa que lleve los dos cables de forma limpia. Después la imprimo y la pego atrás del UPS.

Ojalá esto le ahorre a alguien más los mini PCs.

¿Quieres que te lo construya? Agenda una consulta