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…!
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).
- 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 ».
- Installer NUT sur Proxmox
Dans le shell Proxmox (ou via SSH) :
Shell - Linux
apt update
apt install nut
- 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
- Activer les services
Shell - Linux
systemctl restart nut-server
systemctl restart nut-monitor
systemctl enable nut-server
systemctl enable nut-monitor
- 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
- Pour en définir un, rendez-vous sur votre home-assistant et cliquez en bas à gauche sur votre avatar.
- Dans l’onglet « Sécurité » regardez dans la partie tout en bas : Jetons d’accès longue durée
- Cliquez sur Créer un jeton et nommez-le par exemple : Shutdown Proxmox
- Récupérez le jetons et insérez-le dans le fichier précédent.
Connexion SSH
- 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…
- 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
- 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.




