UPS Eaton 3s

Noyé dans un océan de doutes

UPS Eaton 3s

Définition :

Un UPS (Uninterruptible Power Supply) est un dispositif électronique qui assure une alimentation électrique de secours en cas de panne de courant, protégeant ainsi les appareils contre les coupures et les fluctuations de tension.

Principe :

Le principe de base est très simple : en cas de coupure d’approvisionnement électrique de vos appareils, ces derniers (branchés à l’UPS) pourront toujours être alimentés, le temps que la batterie interne le permette.
Il faut donc composer en fonction de la puissance* sous-tirée pour dimensionner son UPS afin d’avoir le temps nécessaire de se retourner en cas de coupure prolongée.

Un calcul trop simpliste : 

\[
\text{Temps d’autonomie (en heures)} = \frac{\text{Capacité de la batterie (en Wh)}}{\text{Puissance consommée par l’équipement (en W)}}
\]

Si je prends par exemple le modèle que j’ai acheté Eaton 3S 550VA qui a une capacité de 330W (THEORIQUE) , à raison de 40W de puissance de mon homelab, j’obtiens une autonomie réel d’environ 45 minutes.
On est donc bien loin de la théorie…!

Informations de l’appareil dans home-assistant

Autonomie actuelle exprimée en secondes

Cette estimation affichée dans le tableau de home-assistant (une fois le service NUT paramétré) est réaliste et plus fiable qu’un rapide calcul ! Celui-ci tient compte de la courbe de décharge en fonction de la technologie de la batterie, de son état ainsi que de la puissance sous-tirée.

  • Sa petite consommation…

Une chose à laquelle je n’avais pas pensé c’était le consommation électrique de l’UPS, car oui, il consomme environ 4,6Wh soit 110,4Wh/j ou encore 40,296kWh/an…

Définition du besoin

Il me fallait un UPS simple qui puisse rentrer dans un espace technique exiguë, pas trop onéreux mais surtout connecté afin d’avoir un retour dans home-assistant.
Mes appareils, pour le moment, ne consomment pas beaucoup (environ 40W)
Je me suis orienté vers la gamme de chez EATON (3S) et j’ai opté pour le plus petit modèle répondant à mes besoins : le Eaton 3S 550 FR.

Sous 200W de consommation, il a une autonomie (théorique) maximale de 6 minutes, ce qui laisse le temps de lancer des automatismes en cas de détection de coupure prolongée.

La batterie à l’intérieur est une 12V 5ah remplaçable généralement après quelques années seulement (technologie au plomb). Comptez entre 20 et 40€.

Précision si besoin, la moitié des prises seulement sont protégées par la batterie. L’autre moitié est juste protégé des sur-intensités.

C’est quoi NUT ?


NUT = Network UPS Tools.
C’est juste un petit service qui parle avecl’onduleur via USB, récupère son état (batterie, autonomie, mode secteur/batterie, etc.), et partage ces infos au réseau (Proxmox, Home Assistant, etc.).

En gros :

  • Proxmox = le PC qui lit l’UPS (serveur NUT)
  • Home Assistant = le PC qui lit les infos du serveur NUT
  • L’UPS = la source d’infos


Grandes lignes :

  • installer/configurer NUT sur Proxmox (il devient serveur NUT)
  • connecter Home Assistant dessus (client NUT)
  • ajouter des automatisations HA (notifications, arrêt propre, etc.)

Proxmox

Une fois le bloc UPS en place, relié, branché, on va installer ce qu’il faut sur l’hôte (et non un conteneur/VM).

  1. Vérifier que Proxmox voit l’UPS
    Connecte l’UPS → puis dans Proxmox (shell) :

Shell - Linux

    lsusb   
            
                    
        

Vous devriez voir une ligne type “Eaton” ou « UPS ».

  1. Installer NUT sur Proxmox
    Dans le shell Proxmox (ou via SSH) :

Shell - Linux

    apt update
apt install nut   
            
                    
        
  1. Configurer NUT en mode serveur
  • Éditez le fichier principal :

Shell - Linux

    nano /etc/nut/ups.conf   
            
                    
        

Ajoutez :

Shell - Linux

    [eaton3s]
driver = usbhid-ups
port = auto
desc = "Eaton 3S 550"   
            
                    
        

Toujours dans le même fichier, on va en profiter maintenant pour modifier :

Shell - Linux

    LISTEN 127.0.0.1 3493
   
            
                    
        

En :

Shell - Linux

    LISTEN 0.0.0.0 3493
   
            
                    
        

Ca évite d’être limité au seul port local à écouter.
Chez moi j’ai du le modifier ainsi sinon HA ne pouvait accéder à l’UPS…

  • Ensuite :

Shell - Linux

    nano /etc/nut/nut.conf   
            
                    
        

Remplacez la ligne par :

Shell - Linux

    MODE=standalone   
            
                    
        
  • Puis :

Shell - Linux

    nano /etc/nut/upsd.users   
            
                    
        

Ajouter un utilisateur pour Home Assistant et Proxmox :

Shell - Linux

    [homeassistant]
password = 1234
upsmon master 
 
[monproxmox]
password = 4321
upsmon slave   
            
                    
        
  1. Activer les services

Shell - Linux

    systemctl restart nut-server
systemctl restart nut-monitor
systemctl enable nut-server
systemctl enable nut-monitor   
            
                    
        
  1. Pour tester :

Shell - Linux

    upsc eaton3s   
            
                    
        

→ Vous devriez voir battery.charge, battery.runtime, ups.status, etc.
S’il affiche “OL” = On Line (sur secteur).
En coupure secteur → “OB” (On Battery).

Shell - Linux

    battery.charge: 100
battery.runtime: 600
ups.status: OL
   
            
                    
        

Home-assistant

Maintenant que le serveur est fonctionnel, on va y connecter home-assistant afin qu’il y puise les informations !

Module NUT

Dans home-assistant on va commencer par installer une intégration du nom de… NUT !

La saisie des information devrait être simple.

  • A la place de localhost vous indiquez l’adresse IP de votre machine Proxmox (ou son hostname)
  • Le port doit rester 3493
  • Le nom correspond à celui enregistré plus haut « homeassistant« 
  • Le mot de passe, selon l’exemple est 1234

✍️ N’hésitez pas à afficher les entités « Diagnostic » qui ne sont pas toute activées par défaut.

Automatisation

Maintenant que l’on a la remontée des informations, on va pouvoir en faire quelque chose !

configuration.yaml

Il est nécessaire de rajouter une instruction dans le fichier configuration.yaml.
Nous verrons par la suite comment configurer l’accès SSH s’il n’est pas déjà activé.

YAML

    # Extinction demandé du homelab
shell_command:
  shutdown_proxmox: >
    ssh -i /config/ssh_keys/id_ed25519
    -o StrictHostKeyChecking=no
    root@192.168.0.11 "/root/shutdown_homelab.sh"   
            
                    
        

Le coeur

Voici directement le code yaml pour créer l’automatisme :

YAML

    alias: Gestion complète UPS Eaton / Homelab
description: Notifications + arrêt Proxmox si autonomie faible
triggers:
  - id: coupure_30s
    entity_id:
      - sensor.eaton3s_code_d_etat
    to:
      - OB
    for:
      hours: 0
      minutes: 0
      seconds: 5
    trigger: state
  - id: autonomie_critique
    entity_id: sensor.eaton3s_code_d_etat
    to: ALARM OB OL
    for:
      seconds: 30
    trigger: state
  - id: courant_retour
    entity_id:
      - sensor.eaton3s_code_d_etat
    to:
      - OL
    trigger: state
  - id: check_remaining
    trigger: event
    event_type: mobile_app_notification_action
    event_data:
      action: CHECK_REMAINING
conditions: []
actions:
  - choose:
      - conditions:
          - condition: trigger
            id: coupure_30s
        sequence:
          - action: notify.mobile_app_sm_s928b
            data:
              title: ⚠️ Coupure électrique détectée
              message: >-
                {% set s = states('sensor.eaton3s_autonomie_de_la_batterie') |
                int(0) %} {% if s > 0 %}
                  {% set h = s // 3600 %}
                  {% set m = (s % 3600) // 60 %}
                  {% set sec = s % 60 %}
                  {% set end = (now() + timedelta(seconds=s)).strftime("%H:%M:%S") %}
                  L'UPS est sur batterie depuis plus de 30 secondes.  
                  **Autonomie restante : {{ "%02d:%02d:%02d" | format(h, m, sec) }}**  
                  **Extinction estimée à : {{ end }}**
                {% else %}
                  L'UPS est sur batterie depuis plus de 30 secondes.  
                  Autonomie inconnue.
                {% endif %}
              data:
                sticky: true
                channel: UPS Alerts
                importance: high
                priority: high
                actions:
                  - action: CHECK_REMAINING
                    title: Vérifier l'autonomie
                  - action: FORCE_SHUTDOWN
                    title: Forcer l'arrêt du homelab
      - conditions:
          - condition: trigger
            id: autonomie_critique
        sequence:
          - action: notify.mobile_app_sm_s928b
            data:
              title: ⛔ Arrêt automatique homelab
              message: >-
                L'UPS signale un niveau de batterie < 20% (`ALARM OB OL`).
                Extinction immédiate et propre du cluster Proxmox.
              data:
                sticky: true
                clickAction: NONE
                channel: UPS Alerts
                importance: high
                priority: high
          - delay:
              seconds: 30
          - action: shell_command.shutdown_proxmox
      - conditions:
          - condition: trigger
            id: courant_retour
        sequence:
          - action: notify.mobile_app_sm_s928b
            data:
              title: 🔌 Courant rétabli
              message: >-
                L'alimentation secteur est revenue. L'UPS fonctionne
                normalement.
                            
              data:
                sticky: true
                clickAction: NONE
                channel: UPS Alerts
                importance: high
                priority: high
      - conditions:
          - condition: trigger
            id: check_remaining
        sequence:
          - action: notify.mobile_app_sm_s928b
            data:
              title: 🔍 Autonomie actuelle
              message: >-
                {% set s = states('sensor.eaton3s_autonomie_de_la_batterie') |
                int(0) %} {% if s > 0 %}
                  {% set h = s // 3600 %}
                  {% set m = (s % 3600) // 60 %}
                  {% set sec = s % 60 %}
                  {% set end = (now() + timedelta(seconds=s)).strftime("%H:%M:%S") %}
                  Check-in.  
                  **Autonomie restante : {{ "%02d:%02d:%02d" | format(h, m, sec) }}**  
                  **Extinction estimée à : {{ end }}**
                {% else %}
                  **Autonomie : inconnue**.
                  **Extinction estimée à : inconnue**
                {% endif %} **État UPS :** {{ states('sensor.eaton3s_etat') }}
              data:
                sticky: true
                clickAction: NONE
                channel: UPS Alerts
                importance: high
                priority: high
                actions:
                  - action: FORCE_SHUTDOWN
                    title: Forcer l'arrêt du homelab
mode: single
   
            
                    
        

Ce que ça fait :

3 déclencheurs différents pour 3 niveaux différent.

  • Niveau 1 : Avertissement

Après 30 secondes de coupure d »alimentation (donc de décharge de l’UPS) une notification est envoyée sur le téléphone pour signaler la dite coupure et notifier du temps restant estimé.

Un bouton d’action est présent pour demander l’arrêt (en douceur) immédiate des VM/LXC et arrêter le homelab.

  • Niveau 2 : Arrêt obligatoire

Si le temps restant est inférieur à 5 minutes, l’arrêt de Proxmox est automatiquement déclenché ainsi qu’une notification sur le téléphone portble.

  • Niveau 3 : Reprise de l’alimentation

Si le courant est rétabli avant l’extinction du homelab, une notification est envoyée.

Si le homelab s’est éteint, aucune notification sera envoyée.

Proxmox (arrêt doux)

J’ai déjà paramétré l’ordre d’allumage et donc d’extinction des machines gérées par l’hyperviseur Proxmox.

Mais il faut une petit script pour commander (via SSH) l’ordre effectif d’arrêt en douceur, propre et sans encombre.

  • Depuis le Shell (hôte) Proxmox, nous allons éditer un nouveau fichier :

Shell - Linux

    nano /root/shutdown_homelab.sh   
            
                    
        

Shell - Linux

    #!/bin/bash

LOG=/var/log/proxmox_safe_shutdown.log
echo "===== Shutdown triggered at $(date) =====" >> $LOG

# Configuration Home Assistant
HA_URL="http://192.168.0.100:8123"   # IP ou nom de la VM HA
HA_TOKEN="TON_LONG_LIVED_ACCESS_TOKEN"   # Token persistant dans HA

echo "[0/5] Arrêt propre de Home Assistant..." | tee -a $LOG
HA_VM_ID=$(qm list | awk 'NR>1 {print $1, $2}' | grep "homeassistant" | awk '{print $1}')

if [ -n "$HA_VM_ID" ]; then
    echo "→ Envoi stop à Home Assistant..." | tee -a $LOG
    curl -s -X POST -H "Authorization: Bearer $HA_TOKEN" \
         -H "Content-Type: application/json" \
         "$HA_URL/api/services/homeassistant/stop"
    echo "→ Attente 30s pour HA..." | tee -a $LOG
    sleep 30
else
    echo "→ VM Home Assistant non trouvée, passage..." | tee -a $LOG
fi

echo "[1/5] Arrêt propre des VM..." | tee -a $LOG
for vm in $(qm list | awk 'NR>1 {print $1}'); do
    echo "→ VM $vm : shutdown ACPI" | tee -a $LOG
    qm shutdown $vm --timeout 120 --skiplock 1
done

echo "[2/5] Attente arrêt complet des VM..." | tee -a $LOG
for vm in $(qm list | awk 'NR>1 {print $1}'); do
    echo "→ Attente extinction VM $vm..." | tee -a $LOG
    qm wait $vm 2>>$LOG
done

echo "[3/5] Arrêt des conteneurs LXC..." | tee -a $LOG
for ct in $(pct list | awk 'NR>1 {print $1}'); do
    echo "→ CT $ct : stop" | tee -a $LOG
    pct shutdown $ct --timeout 60 --forceStop 0
done

echo "[4/5] Attente arrêt complet des conteneurs LXC..." | tee -a $LOG
for ct in $(pct list | awk 'NR>1 {print $1}'); do
    while pct status $ct | grep -q "running"; do
        echo "→ Attente extinction CT $ct..." | tee -a $LOG
        sleep 5
    done
done

echo "[5/5] Arrêt du nœud Proxmox..." | tee -a $LOG
shutdown -h now
   
            
                    
        

Il faut donc adapter les lignes :

HA_URL="http://192.168.0.100:8123" # IP ou nom de la VM HA
HA_TOKEN="TON_LONG_LIVED_ACCESS_TOKEN" # Token persistant dans HA
Token persistant
  1. Pour en définir un, rendez-vous sur votre home-assistant et cliquez en bas à gauche sur votre avatar.
  2. Dans l’onglet « Sécurité » regardez dans la partie tout en bas : Jetons d’accès longue durée
  3. Cliquez sur Créer un jeton et nommez-le par exemple : Shutdown Proxmox
  4. Récupérez le jetons et insérez-le dans le fichier précédent.

Connexion SSH

  1. Générer une clé SSH dans Home Assistant

Depuis Home Assistant, il faut ouvrir un terminal.
👉Le faire via le plugin Advanced SSH & Web Terminal.

  • Dans le terminal HA, saisir :

Shell - Linux

    ssh-keygen -t ed25519   
            
                    
        

Appuiez 3× Entrée (emplacement + mot de passe vide).

La clé sera créée ici :

/root/.ssh/id_ed25519
/root/.ssh/id_ed25519.pub

☝️ Si on vous demande d’écraser un fichier déjà existant, c’est que vous aviez déjà généré un clé et il vaut mieux ne pas l’écraser sinon vous risqueriez d’être bloqué quelque part…

  1. Copier la clé publique dans Proxmox
  • Toujours dans le terminal HA :

Shell - Linux

    cat /root/.ssh/id_ed25519.pub   
            
                    
        

→ Copiez TOUTE la ligne affichée (commence par ssh-ed25519 AAAA…).

  • Ensuite, dans la fenêtre de shell Proxmox et ajoute la clé via :

Shell - Linux

    nano /root/.ssh/authorized_keys   
            
                    
        

→ Colle la clé → Enregistre (Ctrl+O / Ctrl+X)

☝️Si le fichier n’est pas nouveau ou vide, insérer le code sur une nouvelle ligne, tout simplement. Ne rien supprimer.

  • S’assure-toi d’avoir des droits minimaux :

Shell - Linux

    chmod 600 /root/.ssh/authorized_keys
chmod 700 /root/.ssh   
            
                    
        
  1. Tester la connexion SSH depuis home-assistant
  • Retour dans le Terminal HA :

Testez SSH avec exactement la même commande que dans Home Assistant :

Shell - Linux

    ssh -i /root/.ssh/id_ed25519 -o StrictHostKeyChecking=no root@192.168.0.11 "echo OK"   
            
                    
        

Le résultat attendu est sobrement :

OK

Si ça fonctionne, bravo !

Si ça demande un mot de passe → la clé n’est pas acceptée.

Si “permission denied” → clé absente ou droits incorrects.

Tags: , , , , ,

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *