Hello,
Petite problématique de la semaine, HA sur pi5 ondulé avec remontée d’info via nut, comment stopper proprement une série de pi ondulés (sur un autre onduleur sans remontée d’infos ) et surtout comment les redémarrer sans WOL (tous les pi sont alimentés via un HAT POE) le tout sur un vieil enterasys 48ports POE, j’ai un peu galéré après avoir tenté un accès ssh non fiable à priori, mais je pense avoir trouvé la soluce.
connexion du pi5 via un câble série/usb sur le port com du switch, j’ai aussi tenté snmp mais ça me semble plus complexe ( et je ne maîtrise pas )
Mise en place d’un système d’extinction propre via mqtt

script python pour éteindre une ou plusieurs machine
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import subprocess
import sys
# Configuration MQTT - ADAPTEZ À VOTRE CONFIG
MQTT_BROKER = "xxx" # IP de votre Pi5 Home Assistant
MQTT_PORT = 1883
MQTT_USER = "xxx" # Si vous avez un user/pass MQTT
MQTT_PASS = "xxx" # Supprimez les lignes user/pass si pas d'auth
MQTT_TOPIC = "homeassistant/halt/+"
def on_connect(client, userdata, flags, rc):
print(f"Connecté MQTT : {rc}")
if rc == 0:
print(f"Souscription au topic: {MQTT_TOPIC}")
client.subscribe(MQTT_TOPIC)
print("Souscription effectuée")
else:
print(f"Erreur de connexion: {rc}")
def on_subscribe(client, userdata, mid, granted_qos):
print(f"Souscription confirmée: {mid}, QoS: {granted_qos}")
def on_message(client, userdata, msg):
topic = msg.topic
message = msg.payload.decode()
print(f"=== MESSAGE REÇU ===")
print(f"Topic: {topic}")
print(f"Payload: {message}")
print(f"==================")
hostname = subprocess.check_output(['hostname']).decode().strip()
print(f"Mon hostname: {hostname}")
if topic == f"homeassistant/halt/{hostname}" or topic == "homeassistant/halt/all":
print(f"✅ Condition OK pour {hostname}")
if message == "halt":
print("🔥 Ordre d'extinction reçu, mise en halt...")
subprocess.run(['sudo', 'halt']) # HALT RÉEL ACTIVÉ !
# print("HALT serait exécuté maintenant !") # Commenté
else:
print(f"❌ Message non reconnu: {message}")
else:
print(f"❌ Topic non reconnu pour {hostname}")
client = mqtt.Client()
if MQTT_USER and MQTT_PASS and MQTT_USER != "votre_user_mqtt":
client.username_pw_set(MQTT_USER, MQTT_PASS)
print("Authentification MQTT activée")
else:
print("Pas d'authentification MQTT")
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.on_message = on_message
try:
print(f"Connexion à {MQTT_BROKER}:{MQTT_PORT}")
client.connect(MQTT_BROKER, MQTT_PORT, 60)
print("En attente de messages...")
client.loop_forever()
except Exception as e:
print(f"Erreur MQTT: {e}")
il a fallu ensuite
trouver les commandes d’allumage et d’extinction des ports
Extinction > set port inlinepower ge.1.20 admin off
Allumage > set port inlinepower ge.1.20 admin auto
On poursuit avec un petit réglage de terminal et SSH
on installe un pyserial dans un environnement virtuel et on test que ça fonctionne
python3 -m venv venv
source venv/bin/activate
pip install pyserial
echo "import serial; print('OK:',serial.__version__)" > test.py
python test.py
on cherche le bon port pour le câble…
dmesg | grep tty
ici [ 2.242847] usb 3-2.6: pl2303 converter now attached to ttyUSB0c
et avec un petit script python tjs en cours d’écriture, on se connecte au switch, environnement virtuel lancé, srcript pyton lancé en manuel pour le moment
et testé sur un port pour vérifier que ça fonctionne
python3 /config/scripts/test_serial.py on puis python3 /config/scripts/test_serial.py off
et enfin en interface graphique
c’est testé, ça fonctionne j’uploaderai les videos sur youtube
j’en suis là pour ce soir, en l’état je peux éteindre n’importe quel pi proprement potentiellement, éteindre le port poe ensuite, puis le rallumer et le pi redémarre normalement.
Reste à gérer en fonction des remontées d’onduleur, mais ça sera vraiment facile à côté
je vais faire tremper mon cerveau dans les glaçons ![]()
cdt







