【Follow me第二季第2期】进阶任务 MQTT协议接入到开源的智能家居HomeAssistant
[复制链接]
本帖最后由 eew_gz8e7C 于 2024-9-30 12:08 编辑
Follow me第二季第2期进阶任务之
通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
本期活动购置了树莓派zerow用于部署HA,首先介绍如何部署HA;
树莓派zerow部署HA
首先下载安装树莓派镜像安装工具,准备好SD卡和读卡器用于安装树莓派系统;
安装Imager后,通过单击树莓派Imager图标或运行来启动应用程序,单击CHOOSE DEVICE并从列表中选择您的树莓派zero。
接下来,单击选择操作系统并选择要安装的操作系统。Imager始终在列表顶部显示适合您的型号的树莓派OS推荐版本,这里选择Raspberry Pi OS(32-bit)。
然后单击选择SD卡并选择您的存储设备。
接下来,点击NEXT。
在弹出窗口中,自定义操作系统设置,包括:
- 用户名和密码
- WiFi认证
- 主机名
- 时区
- 键盘布局
- 远程连接
SERVICES选项卡用于远程连接树莓派的相关设置,根据需要进行设置,保存后即可开始写入。
完成后插入SD卡即可完成启动。启动后树莓派指示灯开始闪烁,通过SSH登录树莓派终端进行后续配置。
执行 sudo apt-get update、sudo apt-get upgrade进行软件环境的更新。
这里采用docker进行HA的部署。
首先完成docker的安装,由于网络不畅通,需要采用国内镜像源进行安装,这里采用腾讯源。
# 卸载旧版本(如果有):
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 添加 Docker 官方 GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL http://mirrors.tencent.com/docker-ce/linux/raspbian/gpg -o /etc/apt/keyrings/docker_tencentyun.asc
sudo chmod a+r /etc/apt/keyrings/docker_tencentyun.asc
# 添加仓库到 Apt 源:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker_tencentyun.asc] http://mirrors.tencent.com/docker-ce/linux/raspbian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker_tencentyun.list > /dev/null
sudo apt-get update
# 安装 Docker 软件包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证
sudo docker run hello-world
docker安装完毕后即可拉取HA镜像。
docker pull homeassistant/home-assistant
待镜像拉取完成即可运行HA容器。
docker run -d \
--name homeassistant \
--privileged \
--restart=unless-stopped \
-e TZ=Asia/Shanghai \
-v /data/homeassistant:/config \ #将物理机/data/homeassistant目录挂载至容器的/config目录
-v /run/dbus:/run/dbus:ro \ #将物理机/run/dbus目录挂载至容器的/run/dbus目录,否则HA蓝牙不可用
--network=host \
homeassistant/home-assistant
运行后执行docker ps即可查看运行状态,如果已经正常运行,则打开树莓派主机地址:8123端口即可进入HA页面进行注册配置,至此HA部署完成。
通过docker镜像搭建MQTT服务器,这里使用eclipse-mosquitto开源MQTT服务器。
#1. 拉取eclipse-mosquitto镜像
docker pull eclipse-mosquitto
#2. 为容器创建配置、数据等文件夹
sudo mkdir -p /data/mosquitto/config
sudo mkdir -p /data/mosquitto/data
sudo mkdir -p /data/mosquitto/log
#3. 更改文件夹权限
sudo chmod -R 755 /data/mosquitto
sudo chmod chmod -R 777 /data/ /mosquitto/log
#4. 设置配置文件
sudo nano /data/mosquitto/config/mosquitto.conf
# 配置文件内容:
# 配置端口号及远程访问IP
listener 1883
# 配置websocket的连接端口
listener 9001
# 以websocket方式连接mqtt服务
#protocol websockets
persistence true
# 数据存储路径
persistence_location /mosquitto/data/
# 运行日志存储路劲
log_dest file /mosquitto/log/mosquitto.log
# 设置匿名访问
allow_anonymous true
#5. 运行容器
docker run -td \
--name mqtt \
--privileged \
--restart=unless-stopped \
-v /data/mosquitto/config:/mosquitto/config \
-v /data/mosquitto/data:/mosquitto/data \
-v /data/mosquitto/log:/mosquitto/log \
--network=host \
eclipse-mosquitto
有需要远程访问MQTT服务器、HA面板的朋友可以参考在树莓派安装cpolar实现内网穿透。下载安装可以参考官网教程,需要注意配置文件的设置,可以参考:
authtoken: *****
tunnels:
mqtt:
proto: tcp
addr: "1883" #对应MQTT服务器端口
ha:
proto: tcp
addr: "8123" #对应HA面板服务器端口
UNO R4 WIFI 通过MQTT接入HA
下载安装ArduinoMqttClient库,可以快速调用实现MQTT客户端。
核心代码
#include <ArduinoMqttClient.h>
#include <WiFiS3.h>
#include "secrets.h"
//wifi信息
char ssid[] = SSID;
char pass[] = WIFIPWD;
//mqtt服务器信息
const char broker[] = BROKER;
const int port = BROKER_PORT;
//mqtt客户端
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
//最大重连次数
const int maxTryTimes = 10;
//测试用订阅主题
const char topic[] = "HA/echo";
//发送间隔
const long interval = 1000;
unsigned long previousMillis = 0;
int count = 0;
void setup() {
//初始化串口
Serial.begin(115200);
while (!Serial) {
;
}
// 连接WIFI
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("You're connected to the network");
Serial.println(WiFi.localIP());
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
int tryTimes=0;
//连接MQTT服务器
while (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
if (tryTimes>maxTryTimes-1)
{
printf("MQTT connection failed over %d times",maxTryTimes);
while(1){};
}
delay(500);
printf("Try more %d times\n",++tryTimes);
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
Serial.print("Subscribing to topic: ");
Serial.println(topic);
Serial.println();
//订阅主题
mqttClient.subscribe(topic);
Serial.print("Waiting for messages on topic: ");
Serial.println(topic);
Serial.println();
}
void loop() {
// 查看主题消息
int messageSize = mqttClient.parseMessage();
if (messageSize) {
// we received a message, print out the topic and contents
Serial.print("Received a message with topic '");
Serial.print(mqttClient.messageTopic());
Serial.print("', length ");
Serial.print(messageSize);
Serial.println(" bytes:");
// 打印输出主题消息
while (mqttClient.available()) {
Serial.print((char)mqttClient.read());
}
Serial.println();
Serial.println();
}
unsigned long currentMillis = millis();
//发送测试消息到主题
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Serial.print("Sending message to topic: ");
Serial.println(topic);
Serial.print("echo ");
Serial.println(count);
mqttClient.beginMessage(topic);
mqttClient.print("echo ");
mqttClient.print(count);
mqttClient.endMessage();
Serial.println();
count++;
}
}
进入HA面板,依次进入 设置->设备与服务->添加集成,搜索加载MQTT,然后进入MQTT配置如下,启动unr4 wifi的mqtt程序测试主题消息的发送与接收。
效果展示
MQTT
|