cover image
IdO

Contrôlez les lampes LED ZigBee avec l'application Web Go

Normalement, lorsque vous achetez un éclairage domestique que vous souhaitez contrôler électroniquement, vous devez installer un logiciel personnalisé. Mais avec le protocole ZigBee et la passerelle RaspBee II, vous pouvez utiliser des appareils compatibles et des logiciels libres. Dans cet article, je vais vous montrer comment ajouter un service Go REST personnalisé à la pile.

Dans le diagramme suivant, vous pouvez voir la pile logicielle que j'utilise pour le projet :

Pile logicielle

ZigBee

ZigBee est une spécification basée sur l'IEEE 802.15.4 pour une suite de protocoles de communication de haut niveau utilisés pour créer des réseaux personnels avec de petites radios numériques de faible puissance. Il est souvent utilisé dans la domotique, mais aussi dans d'autres contextes tels que la production industrielle ou les appareils médicaux.

Sa principale caractéristique est qu'il ne consomme pas beaucoup d'énergie. Par conséquent, elle peut souvent fonctionner sur batterie pendant une longue période. Le revers de la médaille est que son débit de données est également faible. Mais pour allumer et éteindre des lumières, c'est suffisant.

Lorsque vous achetez un appareil compatible ZigBee, comme une bande lumineuse LED, vous avez besoin d'une passerelle pour contrôler l'appareil.

RaspBee II Gateway

L'une de ces passerelles ZigBee est la Raspbee II gateway que j'utilise dans le cadre de cet article. RaspBee II est développé par Dresden Elektronik en Allemagne et est une carte d'extension qui s'adapte à un Raspberry Pi standard. RaspBee II est livré avec une application logicielle appelée "deCONZ" qui s'interface avec le matériel.

L'avantage de deCONZ est que vous pouvez l'intégrer facilement à Home Assistant, ce qui vous permet de contrôler la passerelle ZigBee directement dans Home Assistant.

Home Assistant

Home Assistant est une application de domotique open source très répandue. Elle a été développée à l'origine par Paulus Schoutsen et publiée en 2013. Elle est écrite en Python et dispose d'une interface web mais propose également des applications mobiles.

Dans Home Assistant, vous pouvez ajouter deCONZ en tant qu'intégration. Ainsi, vos appareils ZigBee reconnus par deCONZ sont également disponibles dans Home Assistant. Vous pouvez alors configurer des routines d'automatisation simples. Par exemple, si vous avez un détecteur de mouvement, vous pouvez ajouter une routine d'automatisation qui allume les lumières dès qu'un mouvement est détecté. Mais pour notre objectif, nous voulons intégrer MQTT et contrôler les lumières via MQTT.

Mosquitto

MQTT est un protocole léger de publication et d'abonnement qui est souvent utilisé dans les scénarios de domotique. Les applications peuvent communiquer entre elles à l'aide d'un mécanisme de messagerie de type publication-abonnement. Dans notre cas, je l'utilise pour contrôler l'état des lumières LED.

Mais tout d'abord, nous devons installer un courtier MQTT. Un courtier MQTT open source populaire est Eclipse Mosquitto. Il est facile à installer et à configurer. Dans mon cas, je l'ai installé sur la même machine que Home Assistant. Ensuite, vous configurez une automatisation dans Home Assistant qui réagit aux messages reçus sur un canal MQTT et qui allume ou éteint les lumières LED.

Vous pouvez voir ma configuration dans la capture d'écran suivante :

Home Assistant MQTT

Comme sujet MQTT, j'ai choisi "/homeassistant/sleep-light", mais le nommage est à votre convenance. Il doit juste être cohérent avec l'application web Go que nous programmerons plus tard et qui publiera un message MQTT. Une fois que Home Assistant est configuré, il écoute les messages MQTT entrants sur le topic "/homeassistant/sleep-light" et allume la lumière LED en conséquence. Maintenant, nous devons créer une API REST et une simple application web pour contrôler les lumières.

Go App

Pour écrire l'API REST et la simple application web, j'ai choisi Go comme langage de programmation. Avec Go, il est facile de compiler pour les processeurs d'architecture ARM.

Voici le code source de l'application Go :

package main

import (
	"fmt"
	"os"

	mqtt "github.com/eclipse/paho.mqtt.golang"
	"github.com/gofiber/fiber/v2"
)

func main() {
	broker := "tcp://your-server:1883"
	clientID := "go-mqtt-publisher"
	topic := "/homeassistant/sleep-light"
	message := "TOGGLE"

	opts := mqtt.NewClientOptions().AddBroker(broker).SetClientID(clientID)
	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		fmt.Println(token.Error())
		os.Exit(1)
	}

	app := fiber.New()

	app.Get("/", func(c *fiber.Ctx) error {
		return c.SendFile("./public/index.html")
	})

	app.Get("/v1/lights", func(c *fiber.Ctx) error {
		token := client.Publish(topic, 0, false, message)
		token.Wait()

		if token.Error() != nil {
			return c.SendString(token.Error().Error())
		} else {
			return c.SendString("Toggled lights!")
		}
	})

	app.Listen(":3005")
}

Comme framework API REST j'utilise Fiber. La bibliothèque MQTT est Paho MQTT. Avant de lancer cette application Go, vous devez adapter le point de terminaison "broker" à votre serveur. Cette application écoute le point de terminaison GET "/v1/lights" et envoie un message MQTT au broker MQTT Mosquitto.

Comme Home Assistant est à l'écoute de ce type de messages MQTT, une fois que vous invoquez le point de terminaison REST, les lumières LED s'allument. La pièce manquante est l'application web. Il s'agit d'un simple bouton qui invoque le point de terminaison REST "/v1/lights".

Voici l'application web :

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>Lights Toggler</title>
  </head>
  <body>
    <button id="myButton" style="font-size: 60px; padding: 10px 20px;">Toggle Lights</button>

    <script>
      document
        .getElementById("myButton")
        .addEventListener("click", function () {
          var xhr = new XMLHttpRequest();
          xhr.open("GET", "http://your-server:3005/v1/lights", true);
          xhr.send();
        });
    </script>
  </body>
</html>

Cette page web est livrée au navigateur via le point d'arrivée "/" tel que configuré dans l'application Go Fiber. Dans la page web, j'ai utilisé XMLHttpRequest() au lieu de la méthode standard fetch() parce que le site web doit fonctionner sur des navigateurs anciens pour moi. Si ce n'est pas le cas pour vous, vous pouvez remplacer ces lignes par fetch().

Vous pouvez maintenant contrôler les lumières ZigBee avec une application web et une API REST. Ceci met fin à notre histoire sur la façon de contrôler les lumières LED ZigBee avec une application web.

Conclusion

Comme vous avez pu le constater dans cet article, l'intégration d'une lampe LED ZigBee dans le monde des standards web tels que REST et les applications web nécessite un certain nombre d'éléments. Mais heureusement, de nombreux éléments sont open source et disponibles gratuitement. Je suis sûr qu'il existe d'autres moyens d'atteindre le même objectif, et j'aimerais entendre votre histoire. Vous pouvez me contacter en cliquant sur le bouton de contact ci-dessous.

Références

Photo de couverture par Dejan Nasteski sur Unsplash

Publié le 19 mars 2024

Creative Commons License
Cette œuvre est soumise à une licence Creative Commons Attribution 4.0 International License.
Thomas Derflinger

Écrit par Thomas Derflinger

Je suis un entrepreneur visionnaire et un développeur de logiciels. Dans ce blog, j'écris principalement sur la programmation web et des sujets connexes comme l'IdO.