BaiYi
BaiYi
发布于 2026-04-03 / 8 阅读
0
0

【智能家居计划】部署 MQTT,连通HomeAssistant

前言

在构建家庭数据中心的过程中,,一个稳定、独立的MQTT是核心基础设施。

今天记录一下在Proxmox VE上通过 LXC 容器快速部署全过程,以及解决“配置生效却无法连接”和“权限导致服务崩溃”的实战经验。


一、 为什么选择独立部署

虽然HomeAssistant自带MQTT插件,但我坚持在PVE中使用独立的LXC容器部署:

  1. 稳定性解耦: 即使HA重启或崩溃,MQTT依然在线,传感器的数据不会中断。

  2. 多终端接入: 方便以后可能存在的新部署的服务通过接入或HA不再使用,无需依赖HA。


二、 部署流程

1. 创建 LXC 容器

使用 Proxmox VE Helper Scripts 一键部署:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/mqtt.sh)"

2. 初始化账号密码

进入容器后,执行以下命令生成加密密码文件:

# 创建 admin 账号
mosquitto_passwd -c /etc/mosquitto/passwd admin

3. 权限设置

当我修改完配置尝试重启服务时,遇到了 Job for mosquitto.service failed。通过 systemctl status 发现服务死循环重启。

原因: 由于我使用 root 账号创建了密码文件 /etc/mosquitto/passwd,导致以 mosquitto 用户运行的服务进程没有权限读取该文件

解决办法:

chown mosquitto:mosquitto /etc/mosquitto/passwd

执行后再次 systemctl restart mosquitto,绿灯亮起。


四、 验证对接 HomeAssistant

在 HA 的“设备与服务”中添加 MQTT 集成:

  • Broker: 192.168.0.109

  • Port: 1883

  • Username/Password: 填入刚才创建的 admin 账号密码。

成功! 家里的消息邮局正式营业。

下一步计划:

1、接入一个小米温湿度计,看看能不能通过MQTT读到数据,让消息先运转起来。

2、搭建一个 InfluxDB 数据库用来存MQTT收到的数据,为统计图表做准备。

作为测试工程师,在硬件还没到货时,利用 MQTTX 模拟一个设备,验证 HomeAssistant 的自动发现机制。

Topic: homeassistant/sensor/mock_temp/config

{
  "name": "模拟自动发现设备",
  "device_class": "temperature",
  "state_topic": "home/sensor/fake_temp/state",
  "unit_of_measurement": "°C",
  "unique_id": "fake_sensor_001"
}

发送之后,就可以在HA刚才配置的MQTT中看到这个模拟的设备,就是图中显示的1个实体

在刚才发送的消息中有一行

"state_topic": "home/sensor/fake_temp/state"

这行的意思是告诉 HA:“如果你想看我的实时温度,请订阅 home/sensor/fake_temp/state 这个频道。”

然后在home/sensor/fake_temp/state 这个频道发送了数字:26.5,刚才的频道就会拿到这个数据

接收到了在第二个频道发送的26.5

那么如何删除这个模拟的设备呢?

MQTT 自动发现协议规定:如果你向 Topic 发送一个 空白 的消息,就代表这个频道已经永久下线了。

发送空白消息之后可以看到,之前显示的1个实体,现在不见了

总结:

在 MQTT 发现协议中,一个设备通常有两个最重要的频道:

  1. 配置频道 (Config Topic): 就像是入职面试

    • homeassistant/sensor/xxx/config

    • 作用:告诉 HA 我叫什么,我的数据在哪。只需要发一次,通常带 Retain(保留消息)。

  2. 状态频道 (State Topic): 就像是日常汇报

    • 在配置里填写的那个 state_topic 的值。

    • 作用:上报真正的业务数据(温度、湿度等)。需要频繁发送。

一旦配置完成,在状态频道里,不需要再发那一大串 JSON。只需要发原始数据即可,比如 26.5 或者 off

HA 会根据之前的定义,自动给这个数字加上 °C 单位。


评论