Superviser votre onduleur avec un Raspberry pi

Communément appelé UPS (Uninterruptible Power Supply), un onduleur est un périphérique important de par le fait qu'il protège le matériel qui est branché dessus des aléas électriques et qu'il permet de maintenir l'alimentation (au moins quelques minutes) en cas de coupure de courant.

Pourquoi utiliser un onduleur

Communément appelé UPS (Uninterruptible Power Supply), un onduleur est un périphérique important de par le fait qu’il protège le matériel qui est branché dessus des aléas électriques et qu’il permet de maintenir l’alimentation (au moins quelques minutes) en cas de coupure de courant.

En fait, dans le cas d’une coupure de courant brève, l’onduleur prendra le relais pour permettre à votre matériel de continuer à fonctionner normalement. En revanche, dans le cas d’une coupure plus longue, l’onduleur peut permettre de gérer l’extinction propre des ordinateurs qui sont connectés dessus afin d’éviter de corrompre un système d’exploitation par exemple.

Que vient faire le Raspberry-pi avec mon onduleur ?

La plupart des onduleurs disposent d’une connexion, soit réseau soit USB. Selon les modèles, cette connectivité permet de récupérer des informations sur l’état de santé de l’onduleur, le niveau de charge de la batterie, mais également de définir les actions à déclencher lorsque le niveau de charge de la batterie atteint un seuil que vous pouvez lui aussi définir. Cette supervision peut être réalisée à l’aide du projet open-source NUT.

Malheureusement, pour superviser votre onduleur de la sorte, il faut avoir un ordinateur branché dessus en permanence, ce qui induit une consommation d’énergie continue. Presque n’importe quel ordinateur pourrait faire l’affaire mais l’avantage du Raspberry-Pi c’est qu’il est peu énergivore.

Ma configuration

Personnellement, c’est à la suite d’une coupure qui a provoqué la mise hors service du système de mon NAS OpenMediaVault et de l’un de mes serveurs Ubuntu que j’ai investi dans un onduleur Eaton Ellipse Pro 650 (je vous mets le lien sponsorisé vers Amazon pour le modèle que j’ai acheté) :

Je disposais déjà d’un vieux Raspberry Pi modèle 1b inutilisé que j’ai été ravi de retrouver car sa consommation électrique est vraiment minime. Vous pouvez tout aussi bien faire la même chose avec un autre Raspberry Pi mais gardez à l’esprit que la priorité ici est la performance énergétique.

Installation de NUT

Pour ma part, j’ai utiliser une carte SD de 16Go, vous pouvez vous reporter à mon précédent article sur le choix des carte microSD, les normes sont les même et pour peu que vous utilisiez un adaptateur, vous pouvez prendre une car microSD au lieu d’une carte SD car en 2021 ces dernières sont de moins en moins répandues.

J’ai ensuite utilisé Balena Etcher pour installer Raspberry Pi OS Lite sur mon support de stockage.

Une fois le système démarré, penser à mettre à jour le système

$ apt update
$ apt upgrade -y
$ apt dist-upgrade
$ apt autoremove

Redémarrer si nécessaire puis installer NUT, et vim si ce n’est pas déjà fait :

$ apt install -y nut nut-server nut-client vim

Configuration de NUT

La première étape consiste à permettre au système de démarrer nut :

$ sudo vim /etc/default/nut

# Renseigner le fichier de la sorte : 
START_UPSD=yes
START_UPSMON=yes

Ensuite, déclarer votre onduleur (dans mon cas c’est un eaton) :

$ sudo vim /etc/nut/ups.conf

# Voici les informations de ma configuration :
[eaton]
        driver=usbhid-ups
        port=auto
        desc="Eaton Ellipse Pro 650"

Attention : le nom entre crochets ne doit pas contenir d’espace

Permettre les connexions sur l’onduleur :

$ sudo vim /etc/nut/upsd.conf

# Voici les informations de ma configuration : 
LISTEN 0.0.0.0 3493
MAXCONN 1024

Déclarer l’utilisateur qui a le droit de se connecter à l’onduleur :

$ sudo vim /etc/nut/upsd.users

# Voici les informations à adapter chez vous avec votre mot de passe :
[pi]
    password = votre_mot_de_passe
    upsmon master

Définir enfin les actions à réaliser en cas de coupure :

$ sudo vim /etc/nut/upsmon.conf

# Voici les informations à adapter chez vous avec votre user/mot de passe :
MONITOR eaton@127.0.0.1 1 pi votre_mot_de_passe master
POLLFREQ 5
POLLFREQALERT 5
SHUTDOWNCMD "/sbin/shutdown -h now"
HOSTSYNC 15
POWERDOWNFLAG /etc/nut/killpower
FINALDELAY 5
NOTIFYCMD /sbin/upssched
NOTIFYMSG ONBATT "%s is on battery"
NOTIFYMSG ONLINE "%s is back online"
NOTIFYMSG LOWBATT "%s has a low battery!"
NOTIFYMSG SHUTDOWN "System is being shutdown!"

NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG NOCOMM SYSLOG+EXEC

La commande SHUTDOWNCMD est exécutée pour éteindre l’ordinateur connecté à l’onduleur.

La commande NOTIFYCMD est exécutée quand le statut d’alimentation change (quand l’onduleur passe d’une alimentation secteur à une alimentation sur batterie).

Ici, nous utilisons /sbin/upssched pour dire que si le courant n’est pas revenu au bout de 45 secondes alors nous effectuons des actions (éteindre des serveurs Linux en l’occurrence avec le script shutdown-servers.sh à écrire vous-même).

$ sudo vim /etc/nut/upssched.conf

# Voici un contenu exemple : 
# Le script à exécuter :
CMDSCRIPT /home/pi/scripts/shutdown-servers.sh

# Varibles à renseigner avant les instructions AT :
PIPEFN /var/run/nut/upssched.pipe
LOCKFN /var/run/nut/upssched.lock

# Minuteur de 45 secondes déclenché lorsque l'onduleur passe sur batterie :
AT ONBATT * START-TIMER onbatt 45

# Annuler le minuteur si le courant revient
AT ONLINE * CANCEL-TIMER onbatt

Configurer le serveur :

$ sudo vim /etc/nut/nut.conf

# Voici les informations de ma configuration :
MODE=standalone

Ajouter une règle UDEV afin que le système attribue bien ttyS0 à l’onduleur :

$ sudo vim /etc/udev/rules.d/99_nut-serialups.rules

# Voici les informations de ma configuration :
KERNEL=="ttyS0", GROUP="nut"

Rafraichir UDEV :

$ udevadm trigger
$ udevadm control --reload-rules

Changez manuellement le groupe de ttyS0 (ce sera automatique au prochain démarrage) :

$ chgrp nut /dev/ttyS0

Pour être certains d’avoir les bons droits :

$ sudo chown root:nut /etc/nut/*
$ sudo chmod 640 /etc/nut/*

Vous pouvez maintenant redémarrer votre Raspberry Pi :

$ sudo shutdown -r now

Installer et configurer nginx pour accéder à la supervision

Commencer par installer les packages requis :

$ sudo apt install nginx nut-cgi fcgiwrap

Le package nut-cgi installe les fichiers suivants :

  1. les fichiers HTML dans /usr/share/nut/www
  2. les fichiers CGI dans /usr/lib/cgi-bin/nut

Configurer le fichier hosts de nut :

$ sudo vim /etc/nut/hosts.conf

# Voici les informations de ma configuration :
MONITOR eaton@localhost "Eaton Ellipse PRO 650"

Configurer nginx :

$ sudo vim /etc/nginx/nginx.conf

# voici les informations de ma configuration :
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        ##
        # Great security headers
        # 
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-XSS-Protection "1; mode=block";
}

Ajouter nut aux “sites-available” :

$ sudo vim /etc/nginx/sites-available/default

# Voici le bloc à rajouter : 
        # nut for UPS: 
        location /nut {
        alias /usr/share/nut/www/;
        try_files $uri $uri/ /index.html;
        }

        location /cgi-bin/ {
                gzip off;
                root /usr/lib;

                include fastcgi_params;
                fastcgi_pass unix:/var/run/fcgiwrap.socket;
                fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }

Changer les droits des fichiers nécessaires à la supervision :

$ sudo chown www-data:www-data /usr/lib/cgi-bin/nut/*.cgi

Autoriser l’accès à la supervision :

$ sudo vim /etc/nut/upsset.conf

# Voici le bloc à décommenter :
###
I_HAVE_SECURED_MY_CGI_DIRECTORY
###

Redémarrer les services :

$ sudo systemctl restart fcgiwrap.service
$ sudo systemctl restart fcgiwrap.socket
$ sudo systemctl restart nginx

Accéder à la supervision de votre onduleur

Ouvrez votre navigateur et saisissez l’adresse IP de votre Raspberry Pi :

http://ip_du_raspberry/nut 

Vous aurez désormais accès à l’interface de supervision de votre onduleur. Voici la page que j’obtiens chez moi :

L’accès aux statistiques (en cliquant sur “Statistics”) :

L’accès à la configuration se fait avec le nom d’utilisateur / mot de passe que vous avez défini au préalable :

Et voilà !

Pour aller plus loin

4 Comments

  1. Bonsoir,

    J’ai du mal a saisir comment le Pi récupère les informations de l’onduleur.

    Cordialement;

    • Bonjour,

      En effet je n’ai pas été assez clair sur cette partie pourtant essentielle.
      Le Pi récupère les informations de l’onduleur via la connexion USB qui existe entre les deux appareils. C’est pour ça qu’il y a une section dans l’article qui parle d’attribuer ttyS0 à l’onduleur pour le Pi sache sur quel port il reçoit l’information. Je mettrai à jour pour clarifier ce point.
      Merci pour votre retour.

  2. Bonjour,
    merci pour votre Tuto.
    J’aimerais faire de même, mais avec plusieurs onduleurs, depuis un hub USB.
    Croyez vous cela possible ?
    cordialement

    • Bonjour Eric,
      Merci pour votre feedback, ça fait plaisir :-).
      Je pense qu’il faudrait déjà tester avec un 2nd UPS sans hub USB. Le Raspberry Pi offre déjà plusieurs ports USB.
      Ensuite il faudra dédier un port USB à un onduleur spécifique. Pour cela, il faut vérifier que chaque onduleur est identifiable avec un vendor_id et un product_id ou serial_id.
      Côté software, NUT est capable de gérer plusieurs UPS (cf. https://networkupstools.org/features.html) donc je pense que c’est jouable.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.