
用 Go 网络应用程序控制 ZigBee LED 灯
通常情况下,在购买家用灯具并对其进行电子控制时,您需要安装定制软件。但有了 ZigBee 协议和 RaspBee II 网关,您就可以使用兼容设备和开源软件了。在本文中,我将向您展示如何在堆栈中添加自定义 Go REST 服务。在下图中,您可以看到我在项目中使用的软件堆栈:
ZigBee
ZigBee 是基于 IEEE 802.15.4 的一套高级通信协议规范,用于使用小型、低功耗数字无线电创建个人区域网络。它的主要特点是耗电少。因此,它通常可以长时间使用电池。但反过来说,它的数据传输率也很低。但对于开关灯来说,这已经足够了。 当你购买一个支持 ZigBee 的设备(如 LED 灯条)时,你需要一个网关来控制该设备。
RaspBee II
网关 我在本文中使用的 Raspbee II 网关 就是这样一个 ZigBee 网关。RaspBee II 由德国 Dresden Elektronik 公司开发,是一种可安装在标准 Raspberry Pi 上的扩展卡。RaspBee II 附带一个名为 "deCONZ "的软件应用程序,用于连接硬件。
deCONZ 的最大优点是可以与 Home Assistant 轻松集成,从而让您可以直接在 Home Assistant 中控制 ZigBee 网关。
Home Assistant
Home Assistant是一个广泛使用的开源家庭自动化应用程序。它最初由 Paulus Schoutsen 开发,于 2013 年发布。它由 Python 编写,有一个网页界面,但也发布移动应用程序。 在 Home Assistant 中,您可以添加 deCONZ 作为集成。这样,deCONZ 可识别的 ZigBee 设备也可在 Home Assistant 中使用。然后,您就可以配置简单的自动化例程。例如,如果您有一个移动探测器设备,您可以添加一个自动化例程,每当检测到移动,灯就会打开。 但对于我们的目的,我们希望集成 MQTT 并通过 MQTT 控制灯。
Mosquitto MQTT
是一种轻量级的发布-订阅协议,常用于家庭自动化场景。在我们的案例中,我使用它来控制 LED 灯的状态。
但首先,我们需要安装一个 MQTT 代理。一个流行的开源 MQTT 代理是 Eclipse Mosquitto。它易于安装和配置。 在我的例子中,我将它安装在运行 Home Assistant 的同一台机器上。 然后,在 Home Assistant 中配置一个自动化程序,对 MQTT 频道上收到的消息做出反应,并打开或关闭 LED 灯。 你可以在下面的截图中看到我的配置:
作为 MQTT 主题,我选择了"/homeassistant/sleep-light",但命名由你自己决定。它只需与我们稍后编写的发布 MQTT 消息的 Go 网络应用程序保持一致即可。 一旦配置好 Home Assistant,它就会监听主题"/homeassistant/sleep-light "上传入的 MQTT 消息,并相应地切换 LED 灯。 现在,我们需要创建一个 REST API 和一个简单的网络应用程序来控制灯光。
Go 应用程序
为了编写 REST API 和简单的网络应用程序,我选择了 Go 作为编程语言。使用 Go 语言很容易编译到 ARM 架构处理器。这是 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")
}
作为 REST API 框架,我使用 Fiber。MQTT 库是 Paho MQTT。在运行此 Go 应用程序之前,您需要将 "broker "端点适配到您的服务器。 此应用程序监听 GET"/v1/lights "端点,并向 Mosquitto MQTT broker 发送 MQTT 消息。由于 Home Assistant 会侦听此类 MQTT 消息,因此一旦调用 REST 端点,LED 灯就会切换。 缺少的一部分是网络应用程序。这是一个调用"/v1/lights "REST 端点的简单按钮。下面是网络应用程序:
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>
本网页通过 Go Fiber 应用程序中配置的"/"端点传送到浏览器。 在网页中,我使用了 XMLHttpRequest() 而不是现在的标准 fetch(),因为网站必须在传统浏览器上运行。如果你的情况不是这样,那么可以用 fetch() 代替这些行。 现在,你可以用网络应用程序和 REST API 控制 ZigBee 灯了。 关于如何用网络应用程序控制 ZigBee LED 灯的故事到此结束。
结语
从本文中可以看出,将 LED ZigBee 灯集成到 REST 和网络应用程序等网络标准中需要很多组件。但幸运的是,许多部分都是开源的,可以免费获取。我相信还有其他方法可以实现同样的目标,我很乐意听听你的故事。您可以按下面的联系按钮与我联系。
参考资料
- ZigBee:https://csa-iot.org
- RaspBee II: https://phoscon.de/en/raspbee2
- Home Assistant: https://www.home-assistant.io
- Mosquitto: https://mosquitto.org
- Go: https://go.dev
- Fiber: https://gofiber.io
封面照片由 Dejan Nasteski 在 Unsplash 上拍摄。