Table des matières

NUT - Gestion d'un onduleur

Mise en place du matériel

Le choix de l'onduleur

FIXME à faire !

Première mise sous tension

Après achat et déballage, j'ai testé l'onduleur. Branché sur une charge quasi résistive, un projecteur halogène de 150W, Je peux lire sur l'afficheur 153W 177VA. Il semble donc que l'on puisse se fier à la mesure de puissance …

Configuration de l'onduleur

Deux paramètre sont à mon avis important : * La langue : fr ; * La détection de l'inversion phase/neutre : actif. D'ailleurs, dés remise en service, l'onduleur annonce qu'il n'est pas heureux ! Après inversion des deux fils de l'alimentation, tout redevient pleinement opérationnel. Ce prérequis est important car l'onduleur sera “inséré” dans la distribution électrique. Il faut donc identifier clairement le rôle des deux fils en entrée et en sortie. Bien sur le troisième fil de la liaison équipotentielle (terre) est aussi relié.

Schéma de topologie

Le schéma ci dessous est emprunté à l'article d'Olivier Van Hoof sur un sujet similaire à celui traité ici.

Schéma topologique

Pour ceux qui n'auraient pas compris, le master computer est Hal9000 et les slaves sont mes autres machines.

Schéma de raccordement électrique

FIXME

Mise en place du logiciel

Le choix du logiciel découle du choix de l'onduleur. L'excellent projet Network UPS Tool propose la suite adéquate avec de nombreux exemples (celui ci en est un) d'application.

Installation de NUT

Sous Debian, il existe un meta-paquet nut.

# apt show nut
Package: nut
Version: 2.7.4-8
Priority: optional
Section: metapackages
Maintainer: Arnaud Quette <aquette@debian.org>
Installed-Size: 270 kB
Depends: nut-client, nut-server

Le paquet force l'installation de nut-server et de nut-client.

Installation de nut-server

Ce paquet fournit les services nut-driver (driver bas niveau) et nut-server (démon TCP).

Configuration et démarrage manuel du driver

On renseigne le fichier pour gérer un MGE PULSAR 3000 (on le nommera ainsi) sur lien série.

$ vi /etc/nut/ups.conf

[pulsar3000]
        driver = mge-shut
        port = /dev/ttyS0
        desc = "Chaufferie MISO"

Attention, si l'utilisateur nut ne fait pas partie du groupe dialout, il n'a pas accès au port série. Donc, il faut le rajouter à ce groupe.

$ vi /etc/group
...
dialout:x:20:nut 
...

Un petit test manuel s'impose pour tester la communication entre l'onduleur et le driver, ici c'est un MGE via liaison série..

$ upsdrvctl start 
Network UPS Tools - UPS driver controller 2.2.2 
Network UPS Tools - MGE UPS SYSTEMS/SHUT driver 0.66 (2.2.2) 
Detected Pulsar M 3000 [AQ3J4302V] on /dev/ttyS0 

L'onduleur est détecté et le pilote fonctionne.

$ps auxf
...
nut ........ bla-bla ....... /lib/nut/mge-shut -a pulsar3000 
...

upsdrvctl n'est en fait qu'un lanceur qui active les pilotes des onduleurs présents dans ups.conf. Dans syslog, on trouve :

$ tail /var/log/syslog
Dec 21 11:18:30 labo mge-shut[5004]: Startup successful

Chaque pilote possède ses propres options. Selon man mge-shut on peut modifier son comportement. Mais on restera sur du standard !

Configuration et démarrage manuel du serveur

L'intérêt majeur de nut, c'est son orientation réseau. On va donc limiter les accès localhost et au machines du réseau local.

$ vi /etc/nut/upsd.conf

....
# depuis la boucle locale
LISTEN 127.0.0.1:3493
# ce réseau est relativement sécurisé au niveau physique
LISTEN 192.168.254.200:3493

Dans le même optique, on déclare une liste d'utilisateurs.

$ vi /etc/nut/upsd.users

# 1 seul utilisateur avec tous les droits ! 
[personne] 
password = secret 
allowfrom = localhost localnet 
upsmon master

On teste le lancement à la main du démon réseau :

$ upsd 
Network UPS Tools upsd 2.2.2 
listening on 0.0.0.0 port 3493 
Connected to UPS [pulsar3000]: mge-shut-pulsar3000

$ ps auxf
nut ....bla-bla....... upsd

$ tail /var/log/syslog
...
Dec 21 11:24:14 labo upsd[5007]: listening on 0.0.0.0 port 3493 
Dec 21 11:24:14 labo upsd[5007]: Connected to UPS [pulsar3000]: mge-shut-pulsar3000 
Dec 21 11:24:14 labo upsd[5008]: Startup successful

Il y a donc un démon à l'écoute. On le teste avec le client léger fourni dans le paquet logiciel.

$ upsc pulsar3000@localhost
battery.charge: 100 
battery.charge.low: 20 
...
ups.load: 15
ups.mfr: MGE UPS SYSTEMS 
ups.model: Pulsar M 3000 
...
ups.test.result: Done and passed

Tous les accès au démon sont tracés :

$ tail /var/log/syslog 
Dec 21 11:50:18 labo upsd[5008]: Connection from 127.0.0.1 
Dec 21 11:50:18 labo upsd[5008]: Client on 127.0.0.1 logged out

Configuration de la supervision sur le maître

Configuration du moniteur

Le moniteur de supervision va surveiller l'onduleur et lancer différentes actions en fonction des évènements constatés.

$vi /etc/nut/upsmon.conf
# On surveille l'onduleur qui est directement relié (master) 
MONITOR pulsar3000@localhost 1 personne secret master 
# Notre serveur n'a pas d'alimentation redondante = 1 
MINSUPPLIES 1 
# Commande d'arrêt du serveur en cas de fin d'autonomie
SHUTDOWNCMD "/sbin/shutdown -h +0" 
# Commande lancée quand quelque chose se passe 
NOTIFYCMD /sbin/upssched
# Intervalle entre deux interrogations de upsd 
POLLFREQ 5 
# Intervalle entre deux interrogations de upsd en mode "batterie" 
POLLFREQALERT 5 
# Temps d'attente pour la déconnexion des upsmon salves 
HOSTSYNC 15 
# Temps pendant lequel on tolère la non-réponse d'un onduleur, multiple de POLLFREQ 
DEADTIME 15 
# Fichier d'état 
POWERDOWNFLAG /tmp/killpower 
# Actions spécifiques autres que par défaut (SYSLOG et WALL) réalisées en fonction de l'état retourné par l'onduleur 
NOTIFYFLAG COMMBAD EXEC
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN EXEC
NOTIFYFLAG COMMOK IGNORE
# Intervalle de 1 jour, pour répéter le message de "remplacement de batteries - NOTIFY_REPLBATT" 
RBWARNTIME 86400 
# Intervalle de 5minutes, pour répéter le message de "onduleur injoignable - NOTIFY_NOCOMM" 
NOCOMMWARNTIME 300 
# Intervalle entre la "notification d'arrêt - NOTIFY_SHUTDOWN" et le lancement de SHUTDOWNCMD 
FINALDELAY 5

On remarque que, à part l'arrêt du système sur fin de batteries qui est géré par upsmon, toutes les notifications le sont par upssched.

Configuration du distributeur d'évènements

L'utilitaire upssched permet de « temporiser » les actions liées aux évènements générés par upsmon. C'est surtout intéressant lorsque des évènements furtifs se produisent (microcoupures).

$vi /etc/nut/upssched.conf

# Script lancé par upssched pour gérer les évènements et les timers associés 
CMDSCRIPT /usr/local/sbin/mfa_upssched-cmd 
# Fichier pour noter les états internes de upssched 
PIPEFN /var/run/nut/upssched.pipe 
# Fichier de lock pour éviter un conflit en cas de notification de deux évènements simultanés 
LOCKFN /var/run/nut/upssched.lock 

# En cas de perte de communication avec l'onduleur
AT COMMBAD * EXECUTE perte-liaison

# En cas de retour secteur, on stope la minuterie et on notifie 
AT ONLINE * CANCEL-TIMER attente-retour-secteur 
AT ONLINE * EXECUTE charge-sur-secteur

# En cas de perte de secteur, on se laisse au maximum 20 minutes avant d'agir et on notifie 
AT ONBATT * START-TIMER attente-retour-secteur 1200 
AT ONBATT * EXECUTE charge-sur-batterie 

# En cas de niveau de batteries trop bas
AT LOWBATT EXECUTE batteries-vides

# En cas de fin de vie des batteries on sera prévenu 
AT REPLBATT * EXECUTE batteries-hs

# En cas d'arrêt (fin des 20 minutes  ou fin d'autonomie), on notifie. 
AT SHUTDOWN * EXECUTE arret-en-cours

Configuration de la prise en charge des évènements

$ vi /usr/local/sbin/mfa_upssched-cmd

#! /bin/sh

# Ce script gère les différents évenements renvoyés pas upssched.
logger $1

FROM="nut@facerias.org"
TO="root@facerias.org"

case $1 in
	charge-sur-batterie)
		SUBJECT="UPS - Charge sur batteries"
		BODY="L'onduleur est passé sur batteries ...\nL'arrêt système sera demandé si le secteur ne revient pas."
	;;

	attente-retour-secteur)
		SUBJECT="UPS - Fin d'attente de retour secteur"
		BODY="Cela fait trop longtemps que le secteur est absent.\nUn arrêt forcé est en cours !"

		# Demande d'arrêt forcé (force shut down)
		/sbin/upsmon -c fsd
	;;

	charge-sur-secteur)
		SUBJECT="UPS - Charge sur secteur"
		BODY="L'onduleur est revenu sur secteur."
	;;

	batteries-vide)
		SUBJECT="UPS - Batteries vides"
		BODY="Les batteries sont vides, l'arrêt est imminent."
	;;

	arret-en-cours)
		SUBJECT="UPS - Arrêt en cours"
		BODY="Le système est en cours d'arrêt."
	;;

	perte-liaison)
                SUBJECT="UPS - Perte de liaison avec l'onduleur"
                BODY="La communication avec l'onduleur est interrompue."
        ;;


	batteries-hs)
                SUBJECT="UPS - URGENT - batteries HS"
                BODY="Les batteries sont à remplacer d'urgence."
	;;

	*)
		SUBJECT="UPS - Commande inconnue ..."
		BODY="Une commande inconnue a été envoyée par l'onduleur.\nLa commande est : $1"
	;;
esac

/bin/echo -e "Content-Type: text/plain; charset=UTF-8\nFrom: $FROM\nTo: $TO\nsubject: $SUBJECT\n\n$BODY" | /usr/sbin/sendmail $TO