Allumer une lampe avec 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 (ici en version 2023.2).

L’installation des deux derniers a été décrite dans l’article 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 NO 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’interrupteur vu par Home Assistant ne changera pas.

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")
    #mqttc.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 Mieux que Linky avec Home Assistant.

Home Assistant

A la fin du fichier : /usr/share/hassio/homeassistant/mqtt.yaml ajoutons les lignes :

switch:
  - name: "Terrasse"
    command_topic: "Terrasse/set"
    state_topic: "Terrasse/state"

Vérifiez la configuration et redémarrez

Prise en compte de la configuration(copie d'écran)

Depuis le tableau de bord, clic sur les 3 petits points verticaux ‘Modifier le tableau de bord’. Puis clic en bas en bas à gauche ‘Ajouter une carte’. Sélectionnez le bouton.

Carte bouton

Choisissez l’entité Terrasse (ou le nom du switch du fichier mqtt.yaml) – il est en bas de la liste. Choisissez l’icône, puis clic sur enregistrer.

Configuration bouton (copie d'écran).
Configuration du bouton

Voilà tout devrait fonctionner.

Laisser un commentaire

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