cover image
IoT

Control de luces LED ZigBee con Go Web App

Normalmente, cuando se compra una luz doméstica que se desea controlar electrónicamente, es necesario instalar un software personalizado. Pero con el protocolo ZigBee y la pasarela RaspBee II, puedes utilizar dispositivos compatibles y software de código abierto. En este artículo te mostraré cómo agregar un servicio Go REST personalizado a la pila. En el siguiente diagrama, puedes ver la pila de software que utilizo para el proyecto:

Pila de software

ZigBee

ZigBee es una especificación basada en IEEE 802.15.4 para un conjunto de protocolos de comunicación de alto nivel utilizados para crear redes de área personal con radios digitales pequeñas y de baja potencia. Se utiliza a menudo en domótica, pero también en otros contextos como la producción industrial o los dispositivos médicos. Su principal característica es que no consume mucha energía. Por eso, a menudo puede funcionar con batería durante mucho tiempo. La otra cara de esta moneda es que su velocidad de transmisión de datos también es baja. Pero para encender y apagar las luces es suficiente. Cuando compras un dispositivo habilitado para ZigBee, como una tira de luces LED, necesitas una pasarela para controlar el dispositivo.

RaspBee II Gateway

Una de estas pasarelas ZigBee es la Raspbee II gateway que utilizo para este artículo. RaspBee II es desarrollado por Dresden Elektronik en Alemania y es una tarjeta de extensión que encaja en una Raspberry Pi estándar. RaspBee II viene con una aplicación de software llamada "deCONZ" que interactúa con el hardware.

Lo bueno de deCONZ es que se puede integrar fácilmente con Home Assistant, lo que le permite controlar la pasarela ZigBee directamente desde Home Assistant.

Home Assistant

Home Assistant es una aplicación de automatización del hogar de código abierto ampliamente utilizada. Fue desarrollado originalmente por Paulus Schoutsen y lanzado inicialmente en 2013. Está escrito en Python y tiene una interfaz web, pero también lanza aplicaciones móviles. En Home Assistant puedes añadir deCONZ como integración.

De este modo, tus dispositivos ZigBee reconocidos por deCONZ también estarán disponibles en Home Assistant. A continuación, puedes configurar rutinas de automatización sencillas. Por ejemplo, si usted tiene un dispositivo detector de movimiento, podría añadir una rutina de automatización que cada vez que se detecta un movimiento, las luces se encienden. Pero para nuestro propósito, queremos integrar MQTT y controlar las luces a través de MQTT.

Mosquitto

MQTT es un protocolo ligero de publicar-suscribir que se utiliza a menudo en escenarios de automatización del hogar. Las aplicaciones pueden comunicarse entre sí con un mecanismo de mensajería publicar-suscribir. En nuestro caso lo utilizo para controlar el estado de las luces LED.

Pero primero, necesitamos instalar un broker MQTT. Un popular broker MQTT de código abierto es Eclipse Mosquitto. Es fácil de instalar y configurar. En mi caso lo instalé junto en la misma máquina donde se ejecuta Home Assistant. A continuación, se configura una automatización en Home Assistant que reacciona a los mensajes recibidos en un canal MQTT y enciende o apaga las luces LED. Puedes ver mi configuración en la siguiente captura de pantalla:

Home Assistant MQTT

Como tema MQTT elegí "/homeassistant/sleep-light", pero la nomenclatura depende de ti. Sólo tiene que ser coherente con la aplicación web Go que programemos más tarde y que publique un mensaje MQTT. Una vez que Home Assistant está configurado, escucha los mensajes MQTT entrantes en el tema "/homeassistant/sleep-light" y activa la luz LED en consecuencia. Ahora tenemos que crear una API REST y una aplicación web sencilla para controlar las luces.

Go App

Para escribir la API REST y la aplicación web sencilla, elegí Go como lenguaje de programación. Con Go es fácil compilar para procesadores de arquitectura ARM. Además, el despliegue es sencillo en la Raspberry Pi. Este es el código fuente de la aplicación 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")
}

Como framework de API REST utilizo Fiber. La librería MQTT es Paho MQTT. Antes de ejecutar esta aplicación Go, necesitas adaptar el endpoint "broker" a tu servidor. Esta aplicación escucha en el endpoint GET "/v1/lights" y envía un mensaje MQTT al broker MQTT Mosquitto. Dado que Home Assistant escucha este tipo de mensajes MQTT, una vez que invoques el punto final REST, las luces LED se encenderán. Una pieza que falta es la aplicación web. Se trata de un simple botón que invoca el punto final REST "/v1/lights". Así, las luces se conmutan cuando se pulsa el botón.

Aquí está la aplicación 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>

Esta página web se entrega al navegador a través del endpoint "/" tal y como está configurado en la aplicación Go Fiber. En la página web he utilizado XMLHttpRequest() en lugar del ahora estándar fetch() porque el sitio web tiene que funcionar en navegadores heredados para mí. Si este no es tu caso, entonces puedes sustituir estas líneas por fetch(). Ahora puedes controlar las luces ZigBee con una aplicación web y una API REST. Esto pone fin a nuestra historia de cómo controlar las luces LED ZigBee con una aplicación web. Espero que hayas disfrutado del paseo.

Conclusión

Como has podido ver en este artículo, la integración de una luz LED ZigBee en la palabra de estándar web como REST y aplicaciones web requiere bastantes piezas. Pero por suerte, muchas piezas son de código abierto y de libre disposición. Estoy seguro de que hay otras maneras de alcanzar el mismo objetivo, y me encantaría escuchar tu historia. Puedes ponerte en contacto conmigo pulsando el botón de contacto de abajo.

Referencias

Foto de portada de Dejan Nasteski en Unsplash

Published 21 Mar 2024

Creative Commons License
.
Thomas Derflinger

Escrito por Thomas Derflinger

Soy un empresario visionario y desarrollador de software. En este blog escribo principalmente sobre programación web y temas relacionados como el IoT.