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 :
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 :
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 :
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 :
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.
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.