NUT + SAI/UPS Monitoring

Fecha publicación
#
28
Dificultad
Intermedio
3 more properties
Publicado
tags
i40sys, industry 4.0, industry40.systems, industrial, plc, siemens, omron, ubuntu, linux, iot gateway, gateway, iot, internet of things, docker, container, ubuntu, grafana, influxdb, influx, sai, ups, nut, uninterruptible power supply, sistema de alimentación ininterrumpida


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:

Bash
apt install nut

Ficheros configuración NUT

/etc/nut/nut.conf

Bash
MODE=standalone

/etc/nut/ups.conf


Bash
maxretry = 3

[salicru]
  driver = blazer_usb
  port = auto
  desc = "Salicru SPS One"

/etc/nut/upsd.conf

Bash
MAXAGE 15
STATEPATH /var/run/nut
LISTEN 127.0.0.1 3493
MAXCONN 1024

Servicio NUT

Bash
service nut-server start

Consultar estado del SAI

Bash
# salicru es el nombre que aparece entre [] en upsd.conf
upsc salicru

UPS Monitoring

/etc/nut/upsd.users

Bash
[admin]
        password = "TU_PASSWORD_AQUI"
        actions = SET FSD
        instcmds = ALL
        upsmon master

/etc/nut/upsmon.conf

Bash

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

Bash
# 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

Añadir el usuario nut a sudoers

/etc/sudoers

Bash
# añadir al final:
nut ALL = (ALL:ALL) NOPASSWD: /bin/systemctl, /sbin/shutdown

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:
Bash
# cambia el email de notificación y servidor de relay por el tuyo
nut:notification-email@example.tld:smtpserver.example.tld

Scripts de notificación y apagado

Scripts de notificación y apagado:
Para crear los scripts sube este fichero en tu IoT Gateway
Bash
# 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

Bash
# 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

Bash
#!/bin/bash

/usr/bin/sudo /sbin/shutdown -h now

/opt/ups/mail.sh

Bash
#!/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

Bash
#!/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

Reiniciar los servicios configurados

Bash
service nut-server restart
service nut-monitor restart

Depuración y resolución de problemas

Bash
# estado del servicio NUT
systemctl status nut-server.service
systemctl status nut-monitor.service
# logs:
journalctl -xe