El SAI en cuestión es un Riello iDialog 800VA, comprado en agosto de 2012. Ya tiene más de 13 años. En mayo de 2020 le cambié la batería por una CSB GP1272F2 12V 7Ah — la original aguantó casi 8 años, que no está nada mal. Las baterías de plomo-ácido selladas que usan este tipo de SAIs tienen una vida útil teórica de 3-5 años, aunque en la práctica, con buenas condiciones de temperatura y sin ciclos de descarga profunda continuos, pueden llegar a los 7-8 años perfectamente. La que puse en 2020 ya lleva casi 6 años, así que toca ir pensando en cambiarla pronto.
Desde hace tiempo tenía pendiente configurar correctamente NUT para que el SAI hiciera algo más que estar enchufado. Lo intenté en varias ocasiones sin éxito — siempre acababa atascado en algún punto de la configuración y lo dejaba para otro día. Esta vez, con la ayuda de la IA, el proceso ha sido mucho más fluido y productivo. Lo que antes me llevaba horas de prueba y error dando vueltas por foros, esta vez quedó resuelto en una sola sesión.
Este post recoge el proceso completo: diagnóstico, configuración del driver, apagado automático de las VMs y notificaciones por Telegram y email.
El estado inicial
NUT estaba instalado pero el driver no comunicaba bien con el SAI. El mensaje de error era constante:
Broadcast message from root@pve:
UPS riello@localhost is unavailableLo primero fue verificar que NUT realmente estaba instalado:
which upsc upsd upsmon nut-scannerSí estaba. El problema era otro.
Diagnóstico: el driver
Revisando los archivos de configuración, /etc/nut/ups.conf tenía el driver correcto para el Riello:
[riello]
driver = riello_usb
port = auto
desc = "Riello AIDG8001RU"Y nut-scanner detectaba el SAI sin problemas:
nut-scanner -U[nutdev1]
driver = "riello_usb"
port = "auto"
vendorid = "04B4"
productid = "5500"
product = "USB to Serial"
vendor = "Cypress Semiconductor"
bus = "001"El SAI usa un adaptador USB-Serie de Cypress Semiconductor. Detectado perfectamente.
El problema estaba en el servicio del driver. En versiones modernas de NUT, no existe un nut-driver.service genérico — cada dispositivo tiene el suyo:
systemctl list-units | grep nutEl servicio correcto era nut-driver@riello.service. Estaba corriendo, pero los logs mostraban pérdidas de comunicación intermitentes. Después de un reinicio del servicio todo volvió a la normalidad:
systemctl restart nut-driver@riello.service
upsc riello@localhostY ahí aparecieron todos los datos del SAI:
battery.voltage: 13.5
input.voltage: 233
output.voltage: 237
output.power.percent: 15
ups.load: 15
ups.power.nominal: 800
ups.status: OLOL significa On Line — el SAI está funcionando con corriente de red. La carga es del 15% sobre los 800VA nominales, unos 72W. Todo correcto.
Configuración del apagado automático
Antes de tocar ningún fichero de configuración, conviene hacer una copia de seguridad. Son pocos ficheros y el proceso es rápido:
cp /etc/nut/upssched.conf /etc/nut/upssched.conf.bak
cp /etc/nut/upssched-cmd /etc/nut/upssched-cmd.bak
cp /etc/nut/upsmon.conf /etc/nut/upsmon.conf.bak
cp /etc/nut/ups.conf /etc/nut/ups.conf.bak
cp /etc/nut/upsd.users /etc/nut/upsd.users.bakSi algo sale mal, restaurar es tan sencillo como copiar el .bak sobre el original.
Con el driver funcionando, toca configurar lo importante: que Proxmox se apague limpiamente si hay un corte de luz prolongado.
NUT usa dos archivos para esto: upsmon.conf para la monitorización y upssched.conf para la gestión de tiempos y eventos.
upssched.conf
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /var/run/nut/upssched.pipe
LOCKFN /var/run/nut/upssched.lock
AT ONBATT * START-TIMER earlyshutdown 600
AT ONLINE * CANCEL-TIMER earlyshutdown online
AT LOWBATT * EXECUTE earlyshutdown
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdownEl timer earlyshutdown está en 600 segundos (10 minutos). Con la batería en su estado actual — ya con algunos años encima — calculo unos 15 minutos de autonomía al 15% de carga. Los 10 minutos dan margen suficiente para que Proxmox apague las 10 VMs y CTs activos antes de que se acabe la batería.
Si la batería aguanta más, ajustaré el timer hacia arriba.
upssched-cmd
El script que ejecuta las acciones:
#!/bin/sh
case $1 in
earlyshutdown)
logger -t upssched-cmd "UPS on battery too long, initiating shutdown"
/etc/nut/notify.sh "UPS on battery too long - Initiating Proxmox shutdown"
/usr/sbin/upsmon -c fsd
;;
commbad)
logger -t upssched-cmd "UPS communication lost too long"
/etc/nut/notify.sh "UPS communication lost"
;;
online)
logger -t upssched-cmd "UPS back on line power"
/etc/nut/notify.sh "Power restored - UPS back on line"
;;
powerdown)
logger -t upssched-cmd "UPS shutdown in progress"
/etc/nut/notify.sh "Proxmox shutdown in progress"
;;
*)
logger -t upssched-cmd "Unrecognized command: $1"
;;
esacchmod +x /etc/nut/upssched-cmdupsmon.conf
Un detalle importante: los mensajes de NOTIFYMSG en upsmon.conf deben ser ASCII puro. Los emojis y las tildes hacen que NUT descarte caracteres y llene el log de warnings. Los mensajes bonitos van directamente en el script de notificaciones.
También hay que eliminar la directiva MAXAGE si aparece — fue eliminada en NUT 2.8.0:
sed -i '/^MAXAGE/d' /etc/nut/upsmon.confNotificaciones por Telegram y email
El script /etc/nut/notify.sh se encarga de enviar alertas tanto por Telegram como por email vía Migadu:
#!/bin/bash
TELEGRAM_TOKEN="tu_token"
TELEGRAM_CHAT_ID="tu_chat_id"
SMTP_SERVER="smtp.migadu.com"
SMTP_USER="proxmox@tudominio.com"
SMTP_PASS="tu_password"
MAIL_FROM="Proxmox Server <proxmox@tudominio.com>"
MAIL_TO="tu@email.com"
MESSAGE="$1"
# Telegram
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="🔋 Proxmox SAI: ${MESSAGE}" \
-d parse_mode="HTML"
# Email via Migadu
curl -s --ssl-reqd \
--url "smtps://${SMTP_SERVER}:465" \
--user "${SMTP_USER}:${SMTP_PASS}" \
--mail-from "${SMTP_USER}" \
--mail-rcpt "${MAIL_TO}" \
-T <(echo -e "From: ${MAIL_FROM}\nTo: ${MAIL_TO}\nSubject: SAI Proxmox: ${MESSAGE}\n\n${MESSAGE}")chmod +x /etc/nut/notify.shPara probarlo antes de dejarlo en producción:
/etc/nut/notify.sh "Test notification"Si llega al móvil y al email, todo listo.
Verificación final
upsc riello@localhost ups.status
systemctl status nut-monitor nut-driver@riello.service --no-pagerEl status debería mostrar OL y ambos servicios en active (running) sin errores ni caracteres inválidos en los logs.
Pendiente
La batería tiene ya unos años. Tengo pendiente hacer una prueba real: quitar la tensión al SAI y medir cuánto aguanta con la carga actual. Si no llega a los 15 minutos previstos, ajustaré el timer. Si aguanta más, esperaré al apagado automático y lo daré como bueno.
También tengo pendiente integrar el SAI en el dashboard de Home Assistant, que tiene soporte nativo para NUT.
Lo dejaré para el siguiente post.
¿Te ha sido útil?
Ayúdame a mejorar con tu puntuación y comentarios.
Comentarios
Los comentarios están gestionados por GitHub Discussions. Necesitas una cuenta de GitHub para participar. ¡Es gratis y rápido!