Home Assistant : J'essaie de connecter une carte de 16 relais sur un Raspberry Pi 5

Bonjour,

J’essaie de connecter une carte de 16 relais sur un Raspberry Pi 5.
Tout est câblé, pas de problème.

  1. Pour l’instant, je n’arrive à activer/désactiver qu’un seul relais . J’ai demandé à ChatGPT de me faire un code Python pour contrôler les 15 autres relais, mais à chaque fois ça bloque les GPIO, ce qui me force à redémarrer pour les libérer. Donc pour l’instant, je me limite à un seul relais.

  2. Home Assistant : À distance, sur mon téléphone, j’ai réussi à créer les 16 relais comme on peut le voir sur la photo 1 . MQTT reçoit bien l’information, et comme on le voit, avec le nom : relais/pi5/Relais1/set. Je pense que de ce côté-là, tout est nickel, la communication fonctionne bien.

  3. Mais je n’arrive pas à faire communiquer MQTT avec le Raspberry Pi pour activer ce simple relais. C’est probablement juste une question de programme Python, mais comme ChatGPT fait souvent des erreurs et que je ne trouve pas beaucoup d’exemples sur Internet, je suis un peu bloqué. Merci d’avance.

Hello,

Je ne suis pas convaincu que l’accès sur le pi ou est installé HA soit facile, précise de quel matériel il s’agit éventuellement ( la carte relais ) ainsi qu’un schéma de câblage éventuel.

cdt

Quand le programme Python fonctionne correctement, j’ai réussi à allumer chaque relais un par un avec une action qui s’éteint au bout de deux secondes. Je t’envoie le lien de la carte.

https://www.kubii.com/fr/modules-relais/2566-module-relais-16-canaux-kubii-3272496015272.html

Sur la photo du premier message, on voit le paramétrage qui fonctionne pour le relais connecté au GPIO 17.

Maintenant, il faut que j’associe ce script Python à MQTT, qui reçoit bien les messages de home assistant .

Home Assistant est hébergé sur mon serveur, qui se trouve sur une autre adresse IP. J’avais oublié de le préciser, mais la communication fonctionne bien jusqu’au Raspberry Pi.

Salut ,
La question est , le RPI5 est dédier seulement pour faire fonctionner la carte relais ?

Salut, salut ! Oui, les GPIO sont en 3.3V et ça active bien les relais, mais c’est la programmation Python qui est difficile à trouver.

Bonjour,
je ne pourrais pas t’aider dans ce contexte, mais j’ai le même concept avec un PI pour HA et un ESP32 / ESPHOME qui pilote les relais sur une carte de ce type, ça me semble bien plus simple.

Bob

Utiliser un RPi 5 uniquement pour contrôler une carte relais peut sembler overkill si tu ne fais que contrôler des relais. Un ESP32 serait bien plus simple et économique.

2 « J'aime »

Tu peux donner ton code python qui écoute MQTT et qui passe le GPIO à On/Off
Mais la première chose a faire avant d’attaquer le GPIO, c’est de t’assurer que quand tu écoute ton ou tes TOPIC que tu lis bien la bonne information.

Tu pourrais aussi donner plus d’information sur ta carte relais, c’est 16 entrée logique 0/1 pour activer les relais ?
Donc tu utilise 16 ports sur ton RPi pour piloter les relais
Quel gpio utilise tu ?
Les relais s’activent avec un signal LOW (0V) ou HIGH ?
Privilégie les GPIO « libres » comme GPIO 4, 17, 27, 22, 23, 24, 25, 5, 6, 12, 13, 16, 19, 20, 21, 26.
Mais globallement, su tu n’arrive déjà pas a piloter les relais du Pi en Python c’est qu’il y a effectivement un probable.
Comme tu dit que seul le GPIO 17 arrive a actionner le relais, il faudrait aussi faire un petit python qui tourne en boucle sur ce port en faisant du on/off et que tu branche tes relais un a un sur le port GPIO 17 pour voir si tous les relais répondent bien.
Si tous les relais répondent bien sur le GPIO 17 c’est sans doute que l’un de tes ports utilisé met en defaut ton Pi.
Éventuellement cette petite boucle on/off tu change de port dans le code pour voir les ports qui fonctionnent et ceux qui ne fonctionnent pas.

1. Oui, j’ai fait un petit script Python pour le GPIO 17. On le voit sur la deuxième photo : le code que j’ai intégré fonctionne bien (marche/arrêt).

2. Oui, j’utilise les 16 ports du Raspberry, comme on le voit sur la première photo. Voici toutes les broches que j’utilise.

  1. GPIO17 - :door: Relais1 –

  2. GPIO18 - :light_bulb: Relais2 – Éclairage Garage

  3. GPIO27 - :light_bulb: Relais3 – Éclairage Cave

  4. GPIO23 - :light_bulb: Relais4 – Spots Extérieurs

  5. GPIO24 - :droplet: Relais5 – Pompe Chauffage

  6. GPIO5 - :counterclockwise_arrows_button: Relais6 – Vanne 3V Ouvrir (Exclusion GPIO6)

  7. GPIO6 - :repeat_button: Relais7 – Vanne 3V Fermer (Exclusion GPIO5)

  8. GPIO12 - :outbox_tray: Relais8 – Volet Ouvrir

  9. GPIO13 - :inbox_tray: Relais9 – Volet Fermer

  10. GPIO19 - :hammer_and_wrench: Relais10 – Réserve

  11. GPIO16 - :globe_with_meridians: Relais11 – Réserve

  12. GPIO20 - :evergreen_tree: Relais12 – Réserve

  13. GPIO21 - :electric_plug: Relais13 – Réserve

  14. GPIO26 - :free_button: Relais14 – Réserve

  15. GPIO22 - :automobile: Relais15 – Réserve

  16. GPIO25 - :fire: Relais16 – Réserve

  17. message de Home assistant:

  18. relais/pi5/Relais1/set
    relais/pi5/Relais2/set
    relais/pi5/Relais3/set
    relais/pi5/Relais4/set
    relais/pi5/Relais5/set
    relais/pi5/Relais6/set
    relais/pi5/Relais7/set
    relais/pi5/Relais8/set
    relais/pi5/Relais9/set
    relais/pi5/Relais10/set
    relais/pi5/Relais11/set
    relais/pi5/Relais12/set
    relais/pi5/Relais13/set
    relais/pi5/Relais14/set
    relais/pi5/Relais15/set
    relais/pi5/Relais16/set

3. Voici le dernier programme « écoute » que j’essaye de faire avec ChatGPT, mais qui ne fonctionne toujours pas.

4. C’est une carte relais alimentée en 12 V pour enclencher les relais. Le Raspberry envoie seulement un petit signal de 3,3 V, et la partie en 230 V est une alimentation séparée.

J’avais déjà réussi à activer et éteindre tous mes relais, mais je n’ai pas sauvegardé le bon programme. Comme ChatGPT ne propose jamais exactement le même code, je n’arrive plus à retrouver la bonne version Python.

3. Voici le dernier programme « écoute » que j’essaye de faire avec ChatGPT, mais qui ne fonctionne toujours pas.

j’essaie le petit pyton GPIO 17 de l’integer a MQTT comme le relais fonctionne :

Le relais doit être contrôlé exclusivement par le script controle_relais.py.

  • Le script MQTT mqtt_relais_control.py doit seulement écouter les messages MQTT, sans activer ou désactiver directement le relais, mais il doit simplement envoyer les commandes pour activer ou désactiver le relais via l’exécution du script controle_relais.py.

en exécutant le script controle_relais.py à partir du message MQTT reçu.

test ce code

#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time

# Configuration du broker MQTT
MQTT_BROKER = "x.x.x.x"      # Adresse IP de ton broker
MQTT_PORT = 1883                 # Port MQTT
MQTT_TOPIC = "Piscine_32/DS18B20/temperature_eau" # Remplace par ton topic MQTT a écouter
MQTT_USER = "mon_user"           # Remplace par ton utilisateur
MQTT_PASSWORD = "mon_mot_de_passe"  # Remplace par ton mot de passe

# Callback appelé quand le client se connecte au broker
def on_connect(client, userdata, flags, reason_code, properties=None):
    if reason_code == 0:
        print("Connecté au broker MQTT avec succès.")
        client.subscribe(MQTT_TOPIC)
    else:
        print(f"Échec de la connexion, code retour : {reason_code}")

# Callback appelé quand un message est reçu
def on_message(client, userdata, msg):
    print(f"Topic: {msg.topic} | Message: {msg.payload.decode('utf-8')}")

# Création du client MQTT avec le protocole v5 (ou v311 si nécessaire)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)

# Configuration de l'authentification
if MQTT_USER and MQTT_PASSWORD:
    client.username_pw_set(MQTT_USER, MQTT_PASSWORD)

# Assigner les callbacks
client.on_connect = on_connect
client.on_message = on_message

# Connexion au broker
try:
    client.connect(MQTT_BROKER, MQTT_PORT, 60)
    print(f"Tentative de connexion à {MQTT_BROKER} sur le port {MQTT_PORT}...")
    client.loop_forever()
except Exception as e:
    print(f"Erreur : {e}")
except KeyboardInterrupt:
    print("Arrêt demandé par l'utilisateur.")
finally:
    client.disconnect()
    print("Déconnecté du broker MQTT.")

Moi pour l’exemple j’écoute une sonde de température mis a jour dans mon Broker MQTT

root@debian-watermark:~/Scripts# python3 readmqtt.py 
Tentative de connexion à 192.168.x.x sur le port 1883...
Connecté au broker MQTT avec succès.
Topic: Piscine_32/DS18B20/temperature_eau | Message: 22.37
Topic: Piscine_32/DS18B20/temperature_eau | Message: 22.37
Topic: Piscine_32/DS18B20/temperature_eau | Message: 22.44
Topic: Piscine_32/DS18B20/temperature_eau | Message: 22.37
Topic: Piscine_32/DS18B20/temperature_eau | Message: 22.31

voila un code qui fonctionne et qui devrait te donner ce qui est publié dans ton TOPIC MQTT
Il faut déjà que ça ça fonctionne
Tant ce type de truc ne fonctionne pas, tu ne peut pas lui donner de condition pour actionner tes relais.

En lisant ton code, je pense que tu ne t’abonne pas au bon TOPIC

Miracle, merci pour tes bonnes ondes ! J’ai intégré un programme avec ChatGPT, l’action se fait via un Home Assistant, eurêka. Bon, ça ne veut pas marcher tout de suite : quand j’active le relais, il lance un programme d’allumage et d’extinction. Je t’envoie le programme si j’arrive à faire quelque chose.

Il faut procéder pas a pas quand ce merde comme ça et qu’il a plusieurs acteur en cause.
Prends les choses une par une
Avance fonction par fonction
Tu aurait une vision de ton broker avec MQTTExplorer par exemple ?

Ton code devrait tourner autour d’un truc comme ca

#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import time

# Configuration MQTT
MQTT_BROKER = "192.168.x.x" 
MQTT_PORT = 1883  
MQTT_TOPIC = "relais/pi5/Relais1/set"  
MQTT_USER = "mon_user"           
MQTT_PASSWORD = "mon_mot_de_passe"  

# Configuration GPIO
RELAY_PIN = 17  # Broche GPIO utilisée pour le relais

# Initialisation GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(RELAY_PIN, GPIO.OUT)
GPIO.output(RELAY_PIN, GPIO.HIGH)  # Désactive le relais au démarrage

# Callback appelé quand le client se connecte au broker
def on_connect(client, userdata, flags, reason_code, properties=None):
    if reason_code == 0:
        print("Connecté au broker MQTT.")
        client.subscribe(MQTT_TOPIC)
    else:
        print(f"Échec de la connexion, code : {reason_code}")

# Callback appelé quand un message est reçu
def on_message(client, userdata, msg):
    payload = msg.payload.decode('utf-8').strip().upper()
    print(f"Message reçu : {payload}")

    if payload == "ON":
        GPIO.output(RELAY_PIN, GPIO.LOW)  # Active le relais
        print("Relais activé.")
    elif payload == "OFF":
        GPIO.output(RELAY_PIN, GPIO.HIGH)  # Désactive le relais
        print("Relais désactivé.")
    else:
        print("Commande invalide. Utilise 'ON' ou 'OFF'.")

# Création du client MQTT
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
client.on_connect = on_connect
client.on_message = on_message

# Connexion au broker
try:
    client.connect(MQTT_BROKER, MQTT_PORT, 60)
    print(f"Tentative de connexion à {MQTT_BROKER} sur le port {MQTT_PORT}...")
    client.loop_forever()
except Exception as e:
    print(f"Erreur : {e}")
except KeyboardInterrupt:
    print("Arrêt demandé par l'utilisateur.")
finally:
    client.disconnect()
    GPIO.cleanup()
    print("Nettoyage GPIO et déconnexion MQTT.")

Alors attention dans le code, adapter si tes relais s’activent en HIGH ou en LOW

Ce code écoute le Topic relais/pi5/Relais1/set
Et suivant le contenu ON ou OFF actionne le GPIO 17

Merci, j’ai utilisé ce logiciel pour écouter également, mais là j’utilise les journaux sur le Le raspberry pour pouvoir voir si ça communique, et là c’est nickel. Maintenant qu’il y a le lien, j’ai compris pourquoi il y avait ces cinq secondes : c’est mon programme que j’ai intégré à l’intérieur. J’ai voulu l’enlever, mais elle reste active. C’est vraiment Python qui nous embête.

Merci pour ta configuration, je te tiens au jus.

C’est plutôt "c’est python que nous utilisons mal " :joy: :rofl:

1 « J'aime »

Utiliser un Raspberry5 uniquement pour piloter 16 relais ?

“Problème de riche” j’ai envie de dire…

C’est peut être un test, du dev, ou que ça sous la main.
Mais effectivement, j’aurais plutôt utilisé un ESP :rofl:

Et j’aurais plutot pris une interface I2C que 16 ports TTL
Mais ce n’était pas le sujet :grinning_face:

Ouais moi aussi, avec ESPhome ça serait déjà fini et pour l’application même un ESP est largement overkill (mais faut avouer que c’est pratique) si pas besoin d’interface utilisateur un Arduino ferrait largement le taff (mais bon même les derniers arduino ont des procs 4 coeurs ARM…)

Au rythme où va l’informatique, il faudra bientôt un processeur à 16 coeurs à 15 Ghz pour faire une simple calculette 4 operations…

1 « J'aime »

Merci beaucoup pour tous vos conseils. En fait, je débute dans le domaine et, comme je voyais des cartes relais chinoises avec un Raspberry pi intégré, je voulais avoir la dernière génération. Je voulais quelque chose d’automatique qui puisse se relancer tout seul. Donc, j’ai pris la dernière génération, avec un capteur de température, et je pourrai également commander une pompe de chauffage. Voilà, voici la configuration, et elle fonctionne enfin !

  1. Python uniquement pour le relais

  2. Python uniquement pour MQTT

  3. Lancer le script MQTT pour écouter

  4. Agir sur le relais virtuel dans Home Assistant