要通过 MQTT 将温度、湿度数据以及一个灯的开关状态传输到 Home Assistant 并实现设备自动发现,可以按照以下步骤操作:
1.前期准备工作
-
安装MQTT服务器(
EMQX)配置好(可以在HA加载项中安装,也可以在NAS上Docker安装)

-
HA的集成中安装MQTT,并且连接上(
EMQX)

2.设备需要通过 MQTT 发送三条配置消息,HA会自动识别:
- 温度传感器配置消息:
发布到主题:homeassistant/sensor/temp_sensor/config
{
"name": "Temperature Sensor",
"device_class": "temperature",
"state_topic": "homeassistant/all/esp8266/state",
"unit_of_measurement": "°C",
"value_template": "{{ value_json.temperature }}",
"unique_id": "temp_sensor",
"device": {
"identifiers": ["esp8266_sensor"],
"name": "ESP8266 Sensor",
"manufacturer": "Espressif",
"model": "ESP8266EX",
"sw_version": "1.0.0"
}
}

- 湿度传感器配置消息:
发布到主题:homeassistant/sensor/hum_sensor/config
{
"name": "Humidity Sensor",
"device_class": "humidity",
"state_topic": "homeassistant/all/esp8266/state",
"unit_of_measurement": "%",
"value_template": "{{ value_json.humidity }}",
"unique_id": "hum_sensor",
"device": {
"identifiers": ["esp8266_sensor"]
}
}

- 灯的开关配置消息:
发布到主题:homeassistant/switch/light/config
{
"name": "Light Switch",
"command_topic": "homeassistant/switch/light/set",
"state_topic": "homeassistant/all/esp8266/state",
"value_template": "{{ value_json.light}}",
"unique_id": "light_switch",
"device": {
"identifiers": ["esp8266_sensor"]
}
}

上面只是分别将3个传感器暴露给HA,并没有附带数据
3.状态消息
设备需要定期发送状态消息,包含温度、湿度和灯的状态:
发布到主题:homeassistant/all/esp8266/state
{
"temperature": 23.5,
"humidity": 45.2,
"light": "ON"
}

"light": 可以输入 "ON" 或 "OFF"
灯的状态也可以单独控制,发布ON/OFF(不是"ON"没有冒号的哦)到 homeassistant/all/esp8266/state
4.配置分析
{
"name": "Temperature Sensor",
"device_class": "temperature",
"state_topic": "homeassistant/all/esp8266/state",
"unit_of_measurement": "°C",
"value_template": "{{ value_json.temperature }}",
"unique_id": "temp_sensor",
"device": {
"identifiers": ["esp8266_sensor"],
"name": "ESP8266 Sensor",
"manufacturer": "Espressif",
"model": "ESP8266EX"
}
}
name
"name": "Temperature Sensor"
作用:在 Home Assistant 的设备列表或仪表盘中,这个传感器会显示为“Temperature Sensor”。
device_class
"device_class": "temperature"
作用:指定设备的类别。device_class 告诉 Home Assistant 这是一个温度传感器,从而可以正确地处理和显示数据。Home Assistant 会根据设备类别自动选择合适的图标和单位显示方式。
| device_class | 用途 | 单位 | 示例 |
|---|---|---|---|
| temperature | 1.测量温度 | °C 或 °F | 温度传感器、恒温器等 |
| humidity | 2.测量湿度 | %(百分比) | 湿度传感器 |
| pressure | 3.测量压力 | hPa(百帕)等 | 气压传感器、水压传感器 |
| gas | 4.测量气体浓度 | ppm(百万分之一)、ppb(十亿分之一)等 | 一氧化碳传感器、天然气传感器 |
| pm25 | 5.(PM2.5)浓度 | µg/m³(微克/立方米) | 空气质量传感器 |
| pm10 | 6.(PM10)浓度 | µg/m³(微克/立方米 | 空气质量传感器 |
| voltage | 7.测量电压 | V(伏特) | 电池电压传感器、电源电压传感器 |
| current | 8.测量电流 | A(安培) | 电流传感器、电源电流传感器 |
| power | 9.测量功率 | W(瓦特) | 功率传感器、智能插座功率监测 |
| energy | 10.测量能量消耗 | kWh(千瓦时) | 电表、智能插座能量监测 |
| frequency | 11.测量频率 | Hz(赫兹) | 频率传感器 |
| distance | 12.测量距离 | m(米)、cm(厘米)等 | 超声波距离传感器、激光测距仪 |
| illuminance | 13.测量光照强度 | lx(勒克斯) | 光照传感器 |
| carbon_dioxide | 14.测量二氧化碳浓度 | ppm(百万分之一) | 室内空气质量传感器 |
| battery | 15.测量电池电量 | %(百分比) | 设备电池电量传感器 |
| signal_strength | 16.信号强度 | dB(分贝)、dBm(分贝毫瓦) | Wi-Fi 信号强度传感器、蓝牙信号强度传感器 |
| water | 17.水位或水量 | m³(立方米)、L(升)等 | 水表、水位传感器 |
| door / window | 18.检测门或窗的开合状态 | 无(状态为 open 或 closed) | 门磁传感器、窗磁传感器 |
| smoke | 19.检测烟雾 | 无(状态为 detected 或 clear) | 烟雾报警器 |
| carbon_monoxide | 20.检测一氧化碳 | 无(状态为 detected 或 clear) | 一氧化碳报警器 |
| flame | 21.检测火焰 | 无(状态为 detected 或 clear) | 火焰传感器 |
| moisture | 22.检测水浸或湿度 | 无(状态为 detected 或 clear) | 水浸传感器 |
| … | 50… | … | … |
state_topic
"state_topic": "homeassistant/all/esp8266/state"
作用:指定设备状态消息的主题。设备会将温度数据发送到这个 MQTT 主题。设备定期发送如下消息到该主题:
{"temperature": 23.5}
Home Assistant 会从这个主题读取数据并更新传感器的状态。
unit_of_measurement
"unit_of_measurement": "°C"
作用:指定传感器数据的单位。这会影响 Home Assistant 如何显示数据。在 Home Assistant 的界面中,温度数据会显示为 23.5°C。
value_template
"value_template": "{{ value_json.temperature }}"
作用:定义如何从设备发送的 JSON 数据中提取实际的温度值。假设设备发送的消息是:
{"temperature": 23.5, "humidity": 45.2}
使用 {{ value_json.temperature }},Home Assistant 会提取 temperature 的值23.5 作为温度传感器的值。
unique_id
"unique_id": "temp_sensor"
作用:每个传感器需要独立的 unique_id:即使是同一个物理设备上的多个传感器,也需要为每个传感器分配独立的 unique_id。
重要性:确保每个设备中的传感器的 unique_id 是唯一的,否则 Home Assistant 可能会覆盖或拒绝重复的设备。
例如:我一个设备里就有温度,湿度,灯开关,3个不同的传感器,这3个的unique_id就不能相同。
device
"device": {
"identifiers": ["esp8266_sensor"],
"name": "ESP8266 Sensor",
"manufacturer": "Espressif",
"model": "ESP8266EX",
"sw_version": "1.0.0"
}
作用:定义设备的详细信息,这些信息用于将传感器与其他设备关联起来,形成一个设备的“设备”。
identifiers:设备的唯一标识符,用于在 Home Assistant 中识别设备。
name:设备的名称,用于在 Home Assistant 的设备列表中显示。
manufacturer:设备的制造商。
model:设备的型号。
sw_version:软件版本。
command_topic
"command_topic": "homeassistant/switch/light/set", //HA--->设备
"state_topic": "homeassistant/all/esp8266/state", //设备--->HA
在灯/开关的配置信息里,多出一个command_topic这个主题需要设备进行订阅,当HA对开关进行修改,会通过这个主题通知设备,设备收到后也需要响应,将灯开关状态发送给HA
5.配置主题分析
上面示例使用的配置主题分别有
homeassistant/sensor/temp_sensor/config
homeassistant/sensor/hum_sensor/config
homeassistant/switch/light/config
| 设备类型 | 类型 | 用途 | 示例 |
|---|---|---|---|
| sensor | 传感器(50多种) | 传感器用于测量各种物理量,如温度、湿度、压力等 | homeassistant/sensor/<unique_id>/config |
| switch | 开关 | 开关 | homeassistant/switch/<unique_id>/config |
| light | 灯 | 灯用于控制灯光的开关、亮度和颜色 | homeassistant/light/<unique_id>/config |
| binary_sensor | 二进制传感器 | 二进制传感器用于检测状态(如门是否打开、运动是否检测到) | homeassistant/binary_sensor/<unique_id>/config |
| cover | 封盖 | 封盖用于控制窗帘、百叶窗等设备的开/关和位置 | homeassistant/cover/<unique_id>/config |
| climate | 气候 | 气候设备用于控制温度和模式(如空调、恒温器) | homeassistant/climate/<unique_id>/config |
| vacuum | 真空吸尘器 | 真空吸尘器用于控制智能吸尘器的状态和行为 | homeassistant/vacuum/<unique_id>/config |
| button | 按钮 | 按钮用于执行一次性的操作 | homeassistant/button/<unique_id>/config |
| select | 选择器 | 选择器用于选择一个值或模式 | homeassistant/select/<unique_id>/config |
| number | 编号器 | 编号器用于设置一个数值 | homeassistant/number/<unique_id>/config |
| alarm_control_panel | 警报控制器 | 警报控制器用于控制安全系统 | homeassistant/alarm_control_panel/<unique_id>/config |
| camera | 相机 | 相机用于接收视频流或图片 | homeassistant/camera/<unique_id>/config |
| sensor_group | 传感器组 | 传感器组用于组合多个传感器 | homeassistant/sensor_group/<unique_id>/config |
6.HA识别设备在线/离线
- 第1步:发送配置消息(增加:在线/离线识别主题,标识):
{
"name": "Temperature Sensor",
"device_class": "temperature",
"state_topic": "homeassistant/all/esp8266/state",
"availability_topic": "homeassistant/all/esp8266/availability",
"payload_available": "online",
"payload_not_available": "offline",
"unit_of_measurement": "°C",
"value_template": "{{ value_json.temperature }}",
"unique_id": "ecda3bd1063c",
"device": {
"identifiers": ["esp8266_sensor"],
"name": "ESP8266 Sensor",
"manufacturer": "Espressif",
"model": "ESP8266EX"
}
}
"availability_topic": 是用来发布在线/离线的主题
"payload_available": 在线识别符
"payload_not_available": 离线识别符
注意:上面的配置信息中添加了设备在线/离线功能,如果你直接发送传感器的状态(温度/湿度/开关等),HA是不会显示出来的,会一直显示不可用
必须将设备修改成在线之后才能正常显示数据

- 第2步:发送设备在线状态
在homeassistant/all/esp8266/availability主题上发布online(注意:需要设置成保留消息)

这时候HA才会正常显示数据

3. 第3步:设备离线
设备掉电离线是一瞬间的,根本不可能来得及发送数据,所以我们需要将离线信息添加到遗嘱中
"homeassistant/all/esp8266/availability" //遗嘱主题
"offline" //遗嘱信息(注意:需要设置成保留消息)
4226

被折叠的 条评论
为什么被折叠?



