Administrando energía durante un corte eléctrico

Usualmente en casa desde que me mudé, suele haber 1 o 2 cortes de energía eléctrica por trimestre de menos de 15 minutos de duración. Ya sea que sean atribuibles a ENSA o ETESA o alguna falla de equipos cerca, siempre es bueno mantener la red funcionando y permitir el correcto apagado de los dispositivos de red para evitar potenciales daños a los equipos.

En el mundo Linux tenemos el demonio apcupsd para gestionar los sistemas de alimentación ininterrumpida de la marca APC. En específico adquirí un APC Back-UPS BE850M2, un unidad compacta que entrega 850 VA lo que correspondería a 450 W con 6 conexiones a batería y 3 de regulación de subidas eléctricas.

Esto es más que suficiente para mantener la red funcionando durante el tiempo promedio de los apagones y en caso tal que un evento de interrupción de suministro eléctrico se prolongue más de lo habitual, entonces ocurra el correcto apagado de los equipos.

Instalación

Para hacer la gestión de energía lo primero que hice fue conectar el bastión hobbiton por USB al UPS. Luego solo fue cuestión de instalar el demonio apcupsd que no esta disponible en los repositorios oficiales, sino en EPEL.

1
sudo dnf install apcupsd

Ahora lo activamos e iniciamos con la ayuda de systemd:

1
2
sudo systemctl enable apcupsd
sudo systemctl start apcupsd

Desde la terminal con apcaccess podemos ver el estado actual del UPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apcaccess

APC      : 001,036,0875
DATE     : 2023-08-09 10:19:59 -0500
HOSTNAME : hobbiton
VERSION  : 3.14.14 (31 May 2016) redhat
UPSNAME  : BAYANO1
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  : Stand Alone
STARTTIME: 2023-08-09 10:19:58 -0500
MODEL    : Back-UPS ES 850M2
STATUS   : ONLINE
LINEV    : 117.0 Volts
LOADPCT  : 8.0 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 82.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
SENSE    : Medium
LOTRANS  : 92.0 Volts
HITRANS  : 139.0 Volts
ALARMDEL : 30 Seconds
BATTV    : 13.7 Volts
LASTXFER : Unacceptable line voltage changes
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
SELFTEST : NO
STATFLAG : 0x05000008
SERIALNO : 4B2021117124
BATTDATE : 2020-05-21
NOMINV   : 120 Volts
NOMBATTV : 12.0 Volts
NOMPOWER : 450 Watts
FIRMWARE : 931.a10.D USB FW:a1
END APC  : 2023-08-09 10:20:04 -0500

De aquí resulta interesante conocer 3 variables. LOADPCT, BCHARGE y TIMELEFT. LOADPCT muestra la cantidad de carga puesta en la batería con la corriente activa. BCHARGE es la carga de la batería. TIMELEFT es el tiempo estimado que funcionaría el UPS con la carga actual. Creo que 82 minutos no está nada mal, considerando que este UPS mantiene funcionando el USG, uno de los USW-8-150, el modem 4G, el servidor bastión hobbiton y el UniFi DVR.

Hasta ahora, todo parece estar en orden y funcionando correctamente.

Para trastear un poco, tenemos el comando apcaccess que nos permite hacer algunos ajustes, aunque esto depende en gran medida que el modelo lo soporte, pero antes de usarlo debemos detener la unidad systemd apcupsd.

Notificaciones

En cierto modo tener un registro de notificaciones de los modos del UPS te permitirá llevar un registro de los apagones. Dentro del directorio /etc/upsapcd hay varios scripts que nos interesan y que se activan tras ciertas condiciones, vamos a modificarlos un poco para que nos avisen vía Telegram.

/etc/apcupsd/onbattery: este script se ejecuta cuando hay un corte eléctrico y comienza a funcionar la batería.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/sh
#
# This shell script if placed in /etc/apcupsd
# will be called by /etc/apcupsd/apccontrol when the UPS
# goes on batteries.
# We send an email message to root to notify him.
#
HOSTNAME=`hostname`
MSG="$HOSTNAME UPS $1 Power Failure !!!"
#
telegram_bot_API_Token="<inserte-su-token>"
telegram_chat_id="<inserte-su-chat-id>"
curl -s -o /dev/null -X GET "https://api.telegram.org/bot${telegram_bot_API_Token}/sendMessage?chat_id=${telegram_chat_id}" --data-urlencode "text=[$HOSTNAME] ⚡ $1 sin servicio eléctrico."
#
(
   echo "Subject: $MSG"
   echo " "
   echo "$MSG"
   echo " "
   /sbin/apcaccess status
) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN
exit 0

/etc/apcupsd/offbattery: este script se ejecuta cuando se reestablece el servicio eléctrico.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/sh
#
# This shell script if placed in /etc/apcupsd
# will be called by /etc/apcupsd/apccontrol when the
# UPS goes back on to the mains after a power failure.
# We send an email message to root to notify him.
#
HOSTNAME=`hostname`
MSG="$HOSTNAME UPS $1 Power has returned"
#
telegram_bot_API_Token="<inserte-su-token>"
telegram_chat_id="<inserte-su-chat-id>"
curl -s -o /dev/null -X GET "https://api.telegram.org/bot${telegram_bot_API_Token}/sendMessage?chat_id=${telegram_chat_id}" --data-urlencode "text=[$HOSTNAME] ⚡ $1 servicio eléctrico reestablecido."
#
(
   echo "Subject: $MSG"
   echo " "
   echo "$MSG"
   echo " "
   /sbin/apcaccess status
) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN
exit 0

/etc/apcupsd/changeme: este script se ejecuta cuando se detecta que la batería debe ser reemplazada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/sh
#
# This shell script if placed in /etc/apcupsd
# will be called by /etc/apcupsd/apccontrol when apcupsd
# detects that the battery should be replaced.
# We send an email message to root to notify him.
#
HOSTNAME=`hostname`
MSG="$HOSTNAME UPS $1 battery needs changing NOW."
#
telegram_bot_API_Token="<inserte-su-token>"
telegram_chat_id="<inserte-su-chat-id>"
curl -s -o /dev/null -X GET "https://api.telegram.org/bot${telegram_bot_API_Token}/sendMessage?chat_id=${telegram_chat_id}" --data-urlencode "text=[$HOSTNAME] 🪫 $1 la batería necesita ser reemplazada pronto."
#
(
   echo "Subject: $MSG"
   echo " "
   echo "$MSG"
   echo " "
   /sbin/apcaccess status
) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN
exit 0

Una vez hecho estos cambios en los archivos, podemos reiniciar la unidad de apcupsd para que se apliquen.

1
sudo systemctl restart apcupsd

Mensajes y lógica de eventos según nivel de batería

Si bien apcupsd puede controlar y apagar el equipo según los parámetros con los que se configura, prefiero tener un script que me permita un control más fino sobre los UPS, BAYANO1 y BAYANO2, y su nivel de batería. Los BAYANO# fueron nombrados así en reminiscencia a la hidroeléctrica Ascanio Arosemena del Río Bayano.

En el evento de interrupción eléctrica apcupsd enviará el mensaje que pasa a funcionar con batería 6 segundos después del corte en BAYANO1 y BAYANO2.

BAYANO2 mantiene funcionando varios servidores, una vez alcanzado un porcentaje de 75% de batería, envía un mensaje vía Telegram con el porcentaje y apaga los servidores no escenciales dejando solamente el que mantiene los sitios web.

Tanto BAYANO1 como BAYANO2, una vez alcanzado el 30% de batería el script envía un mensaje que se ha alcanzado ese nivel. Al llegar a 20% enviará un nuevo mensaje informando que se ha alcanzado un nivel crítico y apaga el bastión hobbiton y el servidor web barad-dur. Los dispositivos de red continúan funcionando hasta que la batería se descargue completamente.

Remotamente en Google Cloud Platform una instancia e2-micro se mantiene supervisando el dominio de manera que lanza un mensaje vía Telegram cuando deja de responder la IP por completo después de un tiempo prudencial considerando un posible cambio en la IP del DNS.

En el evento del restablecimiento del servicio eléctrico, si el UPS se descargo por completo, cuando el USG enciende nuevamente por medio de wake on lan levanta el servidor bastión hobbiton y este una vez inicia el servidor web barad-dur al detectar que no esta en línea.

Cuando BAYANO2 alcanza 80% de batería, entonces barad-dur inicia por medio de wake on lan los demás servidores y así se automatiza el despliegue de toda la red.


Moisés Serrano Samudio Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud. Médico, apasionado del EdTech/eHealth y diseñador/desarrollador de sitios web de salud.
Moisés Serrano Samudio

@linkmoises

Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth.

Entradas relacionadas

  1. Aún no hay comentarios...

Deja una respuesta

Su email no será publicado. Required fields are marked *