/
NUT + SAI/UPS Monitoring
Search
Try Notion
NUT + SAI/UPS Monitoring
Fecha publicación
2021/12/22
#
28
Dificultad
Intermedio
3 more properties
Descripción
No en todas las instalaciones industriales disponemos de buenos sistemas eléctricos. Y cuando si, a veces estos estan sujetos a fuertes tensiones debido a los motores de las máquinas. Una buena idea es instalar un sistema de alimentación ininterrupido (SAI, o UPS en inglés).
En Linux una de las herramientas más usadas para monitorizar el SAI y controlar el estado del equipo es NUT.
En este vídeo de contamos como lo hemos configurado en Industry 4.0 Systems para nuestras instalaciones.
Instalamos NUT desde los paquetes de sistema:
apt install nut
Bash
Ficheros configuración NUT
/etc/nut/nut.conf
MODE=standalone
Bash
/etc/nut/ups.conf
⚠️
ajustar fichero de configuración con valores para nuestro SAI
maxretry = 3 [salicru] driver = blazer_usb port = auto desc = "Salicru SPS One"
Bash
/etc/nut/upsd.conf
MAXAGE 15 STATEPATH /var/run/nut LISTEN 127.0.0.1 3493 MAXCONN 1024
Bash
Servicio NUT
service nut-server start
Bash
Consultar estado del SAI
# salicru es el nombre que aparece entre [] en upsd.conf upsc salicru
Bash
UPS Monitoring
/etc/nut/upsd.users
⚠️
cambia el password por el que tu quieras, se almacena en texto plano
[admin] password = "TU_PASSWORD_AQUI" actions = SET FSD instcmds = ALL upsmon master
Bash
/etc/nut/upsmon.conf
⚠️
fíjate que las credenciales que se referencian en la primera linia son las definidas en upsd.users
MONITOR salicru 1 "admin" "TU_PASSWORD_AQUI" master RUN_AS_USER nut MINSUPPLIES 1 SHUTDOWNCMD "/opt/ups/halt_server.sh" POLLFREQ 5 POLLFREQALERT 5 HOSTSYNC 15 DEADTIME 15 POWERDOWNFLAG /etc/killpower NOTIFYCMD "/sbin/upssched" NOTIFYMSG ONLINE "UPS: Normal state" NOTIFYMSG ONBATT "UPS: On battery" NOTIFYMSG LOWBATT "UPS: Battery low" NOTIFYMSG FSD "UPS: Starting shutdown" NOTIFYMSG COMMOK "UPS: Communication restored" NOTIFYMSG COMMBAD "UPS: Communication lose" NOTIFYMSG SHUTDOWN "UPS: Shutting down" NOTIFYMSG REPLBATT "UPS: Replace battery" NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC NOTIFYFLAG FSD SYSLOG+WALL+EXEC NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC RBWARNTIME 43200 NOCOMMWARNTIME 300 FINALDELAY 0
Bash
/etc/nut/upssched.conf
# Network UPS Tools - upssched.conf CMDSCRIPT /opt/ups/ups_event.sh ##Hay que crear la ruta /var/run/nut/upssched/ si no existe con propietario nut:nut #PIPEFN /var/run/nut/upssched/upssched.pipe #LOCKFN /var/run/nut/upssched/upssched.lock #/var/run/nut/upssched/ es borrada periódicamente por el sistema con lo cual #upssched deja de funcionar. La solución mas cómoda es usar /tmp/ para almacenar #ambos ficheros: PIPEFN /tmp/upssched.pipe LOCKFN /tmp/upssched.lock # Si hay corte de corriente, se lanza un timer que esperará 300 segundos (5 minutos) # antes de apagar AT ONBATT * START-TIMER ups-on-battery-shutdown 300 # Si vuelve la corriente, se cancela el timer AT ONLINE * CANCEL-TIMER ups-on-battery-shutdown # Si hay corte de corriente, se lanza un timer que esperará 15 segundos # antes de notificarlo AT ONBATT * START-TIMER ups-on-battery 15 AT ONLINE * CANCEL-TIMER ups-on-battery #En los siguientes eventos, llama al script de notificacion para que lo procese. AT ONLINE * EXECUTE ups-back-on-line AT REPLBATT * EXECUTE ups-change_battery AT LOWBATT * EXECUTE ups-low-battery AT COMMOK * EXECUTE ups-comunication-ok AT COMMBAD * EXECUTE ups-comunication-bad
Bash
Añadir el usuario nut a sudoers
⚠️
Recordar a editar el fichero /etc/sudoers con el comando: sudoedit /etc/sudoers
/etc/sudoers
# añadir al final: nut ALL = (ALL:ALL) NOPASSWD: /bin/systemctl, /sbin/shutdown
Bash
Añadir usuario nut al ssmtp
Se usa sSMTP para el envio de mensajes, así pues, se debe añadir en el fichero /etc/ssmtp/revaliases el usuario nut:
# cambia el email de notificación y servidor de relay por el tuyo nut:notification-email@example.tld:smtpserver.example.tld
Bash
Scripts de notificación y apagado
Scripts de notificación y apagado:
Para crear los scripts sube este fichero en tu IoT Gateway
# asumimos que el ups.tar.gz esta en /tmp cd / tar xvfz /tmp/ups.tar.gz # esto crará el directorio /opt/ups con sus correspondientes ficheros
Bash
/opt/ups/config
# IDENTIFICACION GATEWAY GW_ID="hostname" # NOMBRE DE LA PERSONA QUE RECIBIRA EL MAIL MAIL_NAME="YOUR_NAME" # MAIL AL QUE SE ENVIARA LA INFO MAIL_RCPT="user@domain.tld"
Bash
/opt/halt_server.sh
#!/bin/bash /usr/bin/sudo /sbin/shutdown -h now
Bash
/opt/ups/mail.sh
#!/bin/bash
source config
function mailSend() {
TMP_FILE="/tmp/ups.email"
/bin/echo "To: $MAIL_NAME <$MAIL_RCPT>" > $TMP_FILE
/bin/echo "Subject: $1" >> $TMP_FILE
/bin/echo "" >> $TMP_FILE
/bin/echo "$2" >> $TMP_FILE
/usr/sbin/sendmail -v $MAIL_RCPT < $TMP_FILE
/bin/rm $TMP_FILE
}
#mailSend titol contingut
view raw mail.sh hosted with ❤ by GitHub
/opt/ups/ups_event.sh
#!/bin/bash
DEBUG=0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export PATH
TZ='Europe/Madrid'
export TZ
function log() {
if [ $DEBUG -eq 1 ];
then
logger $1;
fi
}
log "ups_event.sh: running"
cd /opt/ups
source config
log "ups_event.sh: loaded config"
source mail.sh
log "ups_event.sh: loadad mail.sh"
MESSAGE_MAIL=""
EVENT_TYPE=$1
APAGADO="0"
FECHA=$(/bin/date '+%Y-%m-%d %H:%M:%S%z')
case "$EVENT_TYPE" in
"ups-on-battery-shutdown")
MESSAGE_MAIL="UPS on battery: shutdown now"
APAGADO="1"
;;
"ups-on-battery")
MESSAGE_MAIL="WARN: UPS on battery"
;;
"ups-comunication-bad")
MESSAGE_MAIL="Communications with UPS lost"
;;
"ups-change_battery")
MESSAGE_MAIL="UPS battery needs to be replaced"
;;
"ups-back-on-line")
MESSAGE_MAIL="INFO: UPS on line power"
;;
"ups-low-battery")
MESSAGE_MAIL="UPS battery is low"
;;
"ups-comunication-ok")
MESSAGE_MAIL="Communications with UPS established"
;;
esac
log "ups_event.sh: case finished, sending email..."
mailSend "[$FECHA] $MESSAGE_MAIL" "[UPS] Event $EVENT_TYPE de SAI IoT GW $GW_ID"
/bin/echo "[$FECHA] SAI: $MESSAGE_MAIL" >> /var/log/ups.log
log "ups_event.sh: mail sent, waiting.."
if [ $APAGADO = "1" ]
then
/bin/sleep 30
/opt/ups/halt_server.sh
fi
log "ups_event.sh: everything done, exit."
exit 0
view raw ups_event.sh hosted with ❤ by GitHub
Reiniciar los servicios configurados
service nut-server restart service nut-monitor restart
Bash
Depuración y resolución de problemas
# estado del servicio NUT systemctl status nut-server.service systemctl status nut-monitor.service # logs: journalctl -xe
Bash