Lampadaire, Raspberry PI et Home Assistant

Les lampadaires de ma terrasse sont déjà pilotés par un Raspberry. Ayant récemment installé Home Assistant, je vais les y intégrer.

Il nous faut :

  • un raspberry PI,
  • un relai électrique.
  • un broker MQTT et Home Assistant.

L’installation des deux derniers a été décrite dans l’article Premiers pas avec Home Assistant et MQTT.

Le montage du Raspberry PI

Le relai a été acheté chez Conrad. Pour les plus ambitieux, il en existe aussi avec 16 voies. Il existe d’autres modèles et d’autres fournisseurs, l’offre est large.

Relai deux voies
Relai deux voies

Ce modèle dispose de petites LED en face de chaque module qui s’allument lorsque l’on ferme les relais – très pratique pour débugger sans brancher sur du 220V. En haut pour chaque relai, un bornier avec 3 bornes. Le commun (C : Common) est au milieu et de chaque côté, la borne fermée au repos (NC : Normally Closed) et la borne ouverte au repos (NO : Normally Opened). En bas à droite, un connecteur que nous allons relier au RPi. GND ( Ground, la masse, terre), VCC (l’alimenation en 5v) et In1, In2 pour piloter les relais. Truc contre intuitif, lorsque l’on met Inx à 0, le relai se ferme.

Raccordement relai RPi
Raccordement du relai sur le Raspberry PI

Côté courant fort, nous raccordons le Commun sur la phase côté secteur, la broche NC côté lampadaire. Le neutre n’est pas pas coupé. Nous câblons comme pour un interrupteur mural.

Côté courant faible, nous raccordons la broche de pilotage In1 sur une broche GPIOx du RPi – j’ai choisi GPIO5 – et alimentons le relai en 5V. Je conseille vivement de raccorder la lampe à la toute fin des développements, la LED du relai étant suffisante pour tester.

Switch Home Assistant

Regardons ce dont a besoin un switch dans Home Assistant. Au minimum un « command_topic » pour dire à l’interrupteur (switch) s’il doit s’éteindre ou s’allumer. Cela paraît suffisant, mais en cas d’indisponibilité d’un élément de la chaîne, relai MQTT ou RPi, Home Assistant va afficher un état incorrect. Home Assistant peut recevoir l’état de l’interrupteur sur « state_topic », s’il est défini c’est celui-ci qui détermine la couleur de l’affichage. Si le RPi est injoignable, il ne pourra émettre ce « topic » et l’état de l’interruption vu par Home Assistant ne changera pas.

Dans le fichier configuration.yaml ajoutons la ligne :

switch: !include switch.yaml

puis dans le fichier switch.yaml

- platform: mqtt
  name: "Terrasse"
  command_topic: "Terrasse/set"
  state_topic: "Terrasse/state"

Sur le RPi

De manière simple, à réception d’un topic ‘set’, nous positionnons l’état de la broche du GPIO et nous le renvoyons sur ‘state’.

Astuce : souscrire sur le topic ‘set’ à l’acquittement de la connexion permet de gérer les cas du démarrage du RPi et du redémarrage du broker. Nous publions aussi l’état de l’interrupteur.

De plus, j’ai ajouté une gestion d’exception sur la connexion. Au boot, je ne suis pas arrivé à positionner la bonne ‘target’ qui me permet de m’assurer que l’interface Wifi de mon RPi est bien disponible.

Rappelons-nous qu’un niveau bas sur la broche GPIO ferme le relai. Du coup, pour que le relai soit ouvert, nous initialisons la broche au niveau haut par GPIO.setup(monGPIO,GPIO.OUT,initial=GPIO.HIGH)

Voici le code du script python

#!/usr/bin/python3

import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import time
import sys

monGPIO=5
monTopic="Terrasse/"
monTopicSet = monTopic+"set"
monTopicState = monTopic+"state"

def on_message(client, userdata, msg):
    etat = msg.payload.decode("utf-8","ignore")
    print(msg.topic, ":", etat)
    mqttc.publish(monTopicState,etat,0)
    if etat== "ON":
        GPIO.output(monGPIO,GPIO.LOW)
    else:
        GPIO.output(monGPIO,GPIO.HIGH)

def on_dis(mqttc, obj, rc):
    print("deconnecte")
    .reconnect()

def on_con(client, userdata, flags, rc):
    print("connecte")
    mqttc.publish(monTopicState,etat,0)
    mqttc.subscribe(monTopicSet,0)

mqttc = mqtt.Client(client_id="test-recep")
while True:
    try:
        mqttc.connect("mqtt-relai.home", 1883,60)
        break
    except:
        print("Erreur connexion :", sys.exc_info()[0],file=sys.stderr)
        time.sleep(1)

GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(monGPIO,GPIO.OUT,initial=GPIO.HIGH)
etat="OFF"

mqttc.on_message = on_message
mqttc.on_disconnect = on_dis
mqttc.on_connect = on_con

mqttc.loop_forever()

Enfin, nous ajoutons un démarrage au boot, comme décrit dans Relever sa consommation d’électricité sur Home Assistant.

Home Assistant

Dans Home Assistant, nous ajoutons à l’interface une carte « entity button » comme suit :

crate entity button
Carte entity button

Voilà tout devrait fonctionner.

2 réponses sur “Lampadaire, Raspberry PI et Home Assistant”

    1. Merci pour le compliment, cela fait toujours plaisir.
      Pour répondre à ta question, premièrement j’ai découvert ESPhome récemment et tu me fais découvrir Sonoff. Deuxièmement, mon RPi est câblé et accroché au mur depuis 2ans. Jusqu’ici il portait un « site » web en PHP ultra basique qui affichait l’état et basculait sur un clic. Du coup le l’ai réutilisé.

Laisser un commentaire

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