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.

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.

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.

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.

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.

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.

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.

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.