Featured image of post NUT sur Proxmox

NUT sur Proxmox

J’implémente l’utilisation d’un onduleur Eaton 3S sur ma machine Proxmox via l’utilitaire NUT (Network UPS Tool).

Préambule

Mon MSI GS30 2M Shadow que j’avais démonté et reconditionné en serveur est tombé en panne.
La batterie à gonfler et je pense que celle-ci à endommager la carte mère.
Du coup, j’ai commandé un Mini PC de chez Minisforum, le NAB6 sur lequel j’ai mis PVE de Proxmox.

De ce fait, j’ai perdu le maintient en fonction en cas de coupure de courant. J’ai donc concédé à acheter un onduleur. J’ai pris le Eaton 3S 700 FR sur lequel sera branché mon serveur, mon NAS (Synology 918+) ainsi que le commutateur Ethernet (switch) sur lequel sont branché ces équipements.

Introduction

L’onduleur possède une interface USB permettant de communiquer avec, et donc de connaitre son état de fonctionnement.
De ce fait, je vais connecter mon onduleur à mon serveur Proxmox afin d’avoir une extinction automatique lorsque l’onduleur passe sous batterie et qu’il ne reste plus beaucoup de batterie.
Idéalement, je ferais en sorte que mon NAS soit aussi de la partie.

Pour cela, on va utiliser l’utilitaire NUT (Network ‘Uninterruptible Power Supply’ Tool) qui permet d’interroger l’onduleur.
De plus, on pourra aussi publier un service afin que ces informations soient accessible aux autres éléments du réseau.

Remarque

Avant d’acheter un onduleur, vérifier sa compatibilité avec NUT sur leur site.

NUT

UPS

On installe donc nut :

apt update
apt install nut

Ensuite, on crée le fichier de configuration /etc/nut/ups.conf :

[eaton1]
driver = usbhid-ups
port = auto
desc = "Eaton 3S 700 FR"

Pour le nom entre crochet et la description, vous pouvez mettre ce que vous voulez.

Pour le driver, référez-vous au Driver spécifier sur le site : Type de Driver

Vous pouvez aussi utiliser la commande nut-scanner pour vous aider.

Ainsi, on démarre le service :

upsdrvctl start eaton1

Astuce

N’oubliez pas d’adapter le nom du service.

Ce qui donne le résultat suivant :

Network UPS Tools - UPS driver controller 2.8.0
Network UPS Tools - Generic HID driver 0.47 (2.8.0)
USB communication driver (libusb 1.0) 0.43
Using subdriver: MGE HID 1.46

UPSD

On va maintenant configurer upsd afin de pouvoir communiquer avec le service de l’UPS (onduleur).

On crée donc le fichier de configuration /etc/nut/upsd.conf :

# Help : https://networkupstools.org/docs/man/upsd.conf.html
# Listen to all interfaces
LISTEN * 3493

Et le fichier des comptes utilisateurs /etc/nut/upsd.users :

# Help : https://networkupstools.org/docs/man/upsd.users.html

[admin]
    password = ADMIN-PASSWORD
    actions = set
    instcmds = all
    upsmon master

[netone]
    password = NETONE-PASSWORD
    upsmon slave

[nettwo]
    password = NETTWO-PASSWORD
    upsmon slave

Ici, j’ai créé deux autres utilisateurs pour récupérer les informations sur HomeAssistant et mon NAS.

Ainsi, on peut consulter les informations de l’UPS :

upsc eaton1@localhost

battery.charge: 100
battery.charge.low: 20
battery.runtime: 1795
battery.type: PbAc
device.mfr: EATON
device.model: Eaton 3S 700
device.serial: Blank
device.type: ups
driver.name: usbhid-ups

On peut avoir accès à une information spécifique en la précisant dans la commande (ex: upsc eaton1@localhost driver.parameter.pollfreq).

UPSMON

upsmon communique avec upsd afin d’agir en fonction de l’état de l’UPS.

Via la variable NOTIFYCMD, on peut spécifier un script qui va être lancer.
Comme a mon habitude, je vais faire un script qui notifie via Gotify.

On réalise donc le fichier de monitoring /etc/nut/upsmon.conf :

# Help : https://networkupstools.org/docs/man/upsmon.conf.html

MONITOR eaton1@localhost 1 admin ADMIN-PASSWORD master
POWERDOWNFLAG /etc/killpower
SHUTDOWNCMD "/sbin/shutdown -h now"

## This command is called with the full text of the message as one argument.
## The environment string NOTIFYTYPE will contain the type string of whatever
## caused this event to happen.
NOTIFYCMD "/usr/sbin/my-ups-notify.sh"

NOTIFYMSG ONLINE "UPS %s is getting line power"
NOTIFYMSG ONBATT "Someone pulled the plug on %s"
NOTIFYMSG LOWBATT "UPS %s is on battery and has a low battery (is critical)"
NOTIFYMSG COMMOK "Communications established with the UPS %s"
NOTIFYMSG COMMBAD "Communications lost to the UPS %s"
NOTIFYMSG SHUTDOWN "The system is being shutdown"
NOTIFYMSG REPLBATT "The UPS %s battery is bad and needs to be replaced"
NOTIFYMSG NOCOMM "UPS %s is unavailable (can’t be contacted for monitoring)"
NOTIFYMSG BYPASS "UPS %s on bypass (powered, not protecting)"
NOTIFYMSG NOTBYPASS "UPS %s no longer on bypass"
NOTIFYMSG SUSPEND_FINISHED "OS just finished sleep/suspend/hibernate mode, de-activating obsolete UPS %s readings to avoid an unfortunate shutdown"

Remarque

Depuis un PC distant

Il est possible de faire la même chose depuis un PC distant

Du coup, mon fichier /usr/sbin/my-ups-notify.sh :

#!/bin/bash

# Send Gotify notifications about UPS

# Gotify parameters (if not using configuration file)
GOTIFY_URL="https://gotify.blablabla.mu"
GOTIFY_TOKEN="Az3rTy"
# Tag to see in log file
LOGGER_TITLE="UPS-Notify"

# Configuration file
FILE_CONF="/etc/gotify-notify.conf"

# Handling configuration file (if present)
if [[ -f "${FILE_CONF}" ]]; then
  GOTIFY_URL=$(grep "server-url=" $FILE_CONF | cut -d'=' -f2)
  GOTIFY_TOKEN=$(grep "access-token=" $FILE_CONF | cut -d'=' -f2)
fi

# https://networkupstools.org/docs/man/upsmon.conf.html
## This command is called with the full text of the message as one argument.
## The environment string NOTIFYTYPE will contain the type string of whatever caused this event to happen.

# Processing notification content
## Title
title="UPS : $NOTIFYTYPE"

## Message
message="$1"

# Finally cURLing !
curl_http_result=$(curl "${GOTIFY_URL}/message?token=${GOTIFY_TOKEN}" -F "title=${title}" -F "message=${message}" -F "priority=5" --output /dev/null --silent --write-out %{http_code})
if [[ $? -ne 0 ]]; then
  logger -t $LOGGER_TITLE "FATAL ERROR: cURL command failed !"
  exit 1
fi

# Check HTTP return code ("200" is OK)
if [[ $curl_http_result -ne 200 ]]; then
  logger -t $LOGGER_TITLE "FATAL ERROR: API call failed ! Return code is $curl_http_result instead of 200."
  exit 2
fi

logger -t $LOGGER_TITLE "Notification sent"

exit 0

Activation

On active ensuite le tout et on spécifie de les lancer au démarrage de la machine.

systemctl start nut-driver@eaton1.service
systemctl start nut-client
systemctl start nut-monitor

systemctl enable nut-driver@eaton1.service
systemctl enable nut-client
systemctl enable nut-monitor

Intégrations

HomeAssistant

Pour obtenir les informations de l’UPS sur HA, il suffit d’ajouté l’intégration NUT : Open your Home Assistant instance and start setting up a new integration.

Configuration de l’intégration Une fois les informations remplie, on a accès aux valeurs de l’UPS.

J’ai en plus activé deux capteurs supplémentaires que ceux par défaut : Infos de l’UPS sur HA

Afin de pouvoir ajouter ce consommateur aux Appareils individuels du dashboard Energy, il faut convertir la valeur en Watt en Wh/kWh.
Pour cela, on va faire une intégrale de cette valeur.

On crée donc une entité de type Capteur d’intégrale selon les paramètres suivant : Intégral

On peut donc intégrer ce nouveau capteur au dashboard Energy.

Nagios

J’ai ajouté le script check_nut en lançant la commande par SSH :

/usr/local/nagios/etc/objects/commands.cfg :

# NUT by SSH
define command {
    command_name    check_ssh_local_nut
    command_line    $USER1$/check_by_ssh -H $HOSTADDRESS$ -i $USER12$ -C "$USER2$/check_nut.pl -d $ARG1$ $ARG2$ 2> /dev/null" -t 60
}

/usr/local/nagios/etc/objects/hosts/proxmox.cfg :

define service {
    use                             generic-service-with-perf
    host_name                       Proxmox
    service_description             UPS Status
    check_period                    24x7                    ; The service can be checked at any time of the day
    check_interval                  5                       ; Check the service every 2 hours under normal conditions
    max_check_attempts              3                       ; Re-check the service up to 3 times in order to determine its final (hard) state
    retry_interval                  1                       ; Re-check the service every 1 minutes until a hard state can be determined
    notification_options            w,u,c,r                 ; Send notifications about warning, unknown, critical, and recovery events
    notification_interval           0                       ; Don't re-notify about service problems
    notification_period             24x7                    ; Notifications can be sent out at any time
    check_command                   check_ssh_local_nut!eaton1!-w 50 -c 20 -t 20 -T 35 -l 50 -L 75
    icon_image                      ups.png
}

Synology

Le menu UPS de DSM (Synology) n’offre pas de solution directe de communication avec un UPS externe.

Synology - Menu UPS

La seule solution possible est de le faire via SNMP.
Il faut donc monter un serveur SNMP sur la machine qui a l’UPS en USB et qui sera interroger par le NAS pour connaitre l’état.

Je n’ai pas trouvé de ressource montrant cela mais un post sur le forum communautaire Synology me fait penser que je n’arriverais pas à mes fins…

Une autre solution serait de le faire via HA. En effet, il y a une intégration DSM permettant de commander l’arrêt du NAS.
Je ferais peut-être ainsi si je ne trouve rien.
Cet article sera mis à jour en conséquence.

Mots de la fin

Bien que je n’ai pas encore testé l’extinction automatique, je suis au moins assuré d’avoir un secours en cas de coupure de courant.

En cas de coupure total de courant, vu que ma box n’est pas secourus (elle est dans mon tableau électrique et je n’ai pas la place de mettre un onduleur dedans), je n’aurais sûrement pas de notification.

Généré avec Hugo
Thème Stack conçu par Jimmy