[作品提交] 【Follow me第二季第2期】进阶任务 MQTT协议接入到开源的智能家居HomeAssistant

eew_gz8e7C   2024-9-30 12:10 楼主

Follow me第二季第2期进阶任务之

通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)

        本期活动购置了树莓派zerow用于部署HA,首先介绍如何部署HA;

        树莓派zerow部署HA

  •  树莓派zerow系统烧录

        首先下载安装树莓派镜像安装工具,准备好SD卡和读卡器用于安装树莓派系统;

        安装Imager后,通过单击树莓派Imager图标或运行来启动应用程序,单击CHOOSE DEVICE并从列表中选择您的树莓派zero。

 

choose-model.png

 

        接下来,单击选择操作系统并选择要安装的操作系统。Imager始终在列表顶部显示适合您的型号的树莓派OS推荐版本,这里选择Raspberry Pi OS(32-bit)。

 

choose-os.png

 

          然后单击选择SD卡并选择您的存储设备。

 

choose-storage.png

 

        接下来,点击NEXT

 

os-customisation-prompt.png

 

        在弹出窗口中,自定义操作系统设置,包括:

  • 用户名和密码
  • WiFi认证
  • 主机名
  • 时区
  • 键盘布局
  • 远程连接

 

os-customisation-general.png

 

        SERVICES选项卡用于远程连接树莓派的相关设置,根据需要进行设置,保存后即可开始写入。

 

os-customisation-services.png

        完成后插入SD卡即可完成启动。启动后树莓派指示灯开始闪烁,通过SSH登录树莓派终端进行后续配置。

image.png   image.png  

        执行 sudo apt-get update、sudo apt-get upgrade进行软件环境的更新。

        

  •  树莓派zerow部署HA

        这里采用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部署完成。

image.png    

  • 树莓派zerow搭建MQTT服务器

        通过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面板远程访问

        有需要远程访问MQTT服务器、HA面板的朋友可以参考在树莓派安装cpolar实现内网穿透。下载安装可以参考官网教程,需要注意配置文件的设置,可以参考:


authtoken: *****

tunnels:
  mqtt:
    proto: tcp
    addr: "1883" #对应MQTT服务器端口
  ha:
    proto: tcp
    addr: "8123" #对应HA面板服务器端口

 

        UNO R4 WIFI 通过MQTT接入HA

        下载安装ArduinoMqttClient库,可以快速调用实现MQTT客户端。

image.png  

核心代码

#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程序测试主题消息的发送与接收。

image.png  

效果展示

MQTT

 

 

本帖最后由 eew_gz8e7C 于 2024-9-30 12:08 编辑

回复评论 (1)

基于树莓派的HA,一天大概需要多少电?   

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2024-10-2 11:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复