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 nutFicheros configuración NUT
/etc/nut/nut.conf
MODE=standalone/etc/nut/ups.conf
maxretry = 3
[salicru]
driver = blazer_usb
port = auto
desc = "Salicru SPS One"/etc/nut/upsd.conf
MAXAGE 15
STATEPATH /var/run/nut
LISTEN 127.0.0.1 3493
MAXCONN 1024Servicio NUT
service nut-server startConsultar estado del SAI
# salicru es el nombre que aparece entre [] en upsd.conf
upsc salicruUPS Monitoring
/etc/nut/upsd.users
[admin]
password = "TU_PASSWORD_AQUI"
actions = SET FSD
instcmds = ALL
upsmon master/etc/nut/upsmon.conf
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/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-badAñadir el usuario nut a sudoers
/etc/sudoers
# añadir al final:
nut ALL = (ALL:ALL) NOPASSWD: /bin/systemctl, /sbin/shutdownAñ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.tldScripts 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/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"/opt/halt_server.sh
#!/bin/bash
/usr/bin/sudo /sbin/shutdown -h now/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/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 0Reiniciar los servicios configurados
service nut-server restart
service nut-monitor restartDepuración y resolución de problemas
# estado del servicio NUT
systemctl status nut-server.service
systemctl status nut-monitor.service
# logs:
journalctl -xe
