要通过 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/sensor/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"}
}
- 湿度传感器配置消息:
发布到主题:homeassistant/sensor/hum_sensor/config
{"name": "Humidity Sensor","device_class": "humidity","state_topic": "homeassistant/sensor/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/switch/light/state","unique_id": "light_switch","device": {"identifiers": ["esp8266_sensor"]}
}
上面只是分别将3个传感器暴露给HA,并没有附带数据
3.状态消息
设备需要定期发送状态消息,包含温度、湿度和灯的状态:
发布到主题:homeassistant/sensor/esp8266/state
{"temperature": 23.5,"humidity": 45.2,"light": "ON"
}
"light": "ON" // 或 "OFF"
灯的状态也可以单独发布到 homeassistant/switch/light/state
"ON"
4.配置分析
{"name": "Temperature Sensor","device_class": "temperature","state_topic": "homeassistant/sensor/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 | 测量温度 | °C 或 °F | 温度传感器、恒温器等 |
humidity | 测量湿度 | %(百分比) | 湿度传感器 |
pressure | 测量压力 | hPa(百帕)等 | 气压传感器、水压传感器 |
gas | 测量气体浓度 | ppm(百万分之一)、ppb(十亿分之一)等 | 一氧化碳传感器、天然气传感器 |
pm25 | (PM2.5)浓度 | µg/m³(微克/立方米) | 空气质量传感器 |
pm10 | (PM10)浓度 | µg/m³(微克/立方米 | 空气质量传感器 |
voltage | 测量电压 | V(伏特) | 电池电压传感器、电源电压传感器 |
current | 测量电流 | A(安培) | 电流传感器、电源电流传感器 |
power | 测量功率 | W(瓦特) | 功率传感器、智能插座功率监测 |
energy | 测量能量消耗 | kWh(千瓦时) | 电表、智能插座能量监测 |
frequency | 测量频率 | Hz(赫兹) | 频率传感器 |
distance | 测量距离 | m(米)、cm(厘米)等 | 超声波距离传感器、激光测距仪 |
illuminance | 测量光照强度 | lx(勒克斯) | 光照传感器 |
carbon_dioxide | 测量二氧化碳浓度 | ppm(百万分之一) | 室内空气质量传感器 |
battery | 测量电池电量 | %(百分比) | 设备电池电量传感器 |
signal_strength | 信号强度 | dB(分贝)、dBm(分贝毫瓦) | Wi-Fi 信号强度传感器、蓝牙信号强度传感器 |
water | 水位或水量 | m³(立方米)、L(升)等 | 水表、水位传感器 |
door / window | 检测门或窗的开合状态 | 无(状态为 open 或 closed) | 门磁传感器、窗磁传感器 |
smoke | 检测烟雾 | 无(状态为 detected 或 clear) | 烟雾报警器 |
carbon_monoxide | 检测一氧化碳 | 无(状态为 detected 或 clear) | 一氧化碳报警器 |
flame | 检测火焰 | 无(状态为 detected 或 clear) | 火焰传感器 |
moisture | 检测水浸或湿度 | 无(状态为 detected 或 clear) | 水浸传感器 |
- state_topic
"state_topic": "homeassistant/sensor/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 是唯一的,否则 Home Assistant 可能会覆盖或拒绝重复的设备。
示例:temp_sensor 是这个温度传感器的唯一标识符。
- device
"device": {"identifiers": ["esp8266_sensor"],"name": "ESP8266 Sensor","manufacturer": "Espressif","model": "ESP8266EX"
}
作用:定义设备的详细信息,这些信息用于将传感器与其他设备关联起来,形成一个设备的“设备”。
identifiers
:设备的唯一标识符,用于在 Home Assistant 中识别设备。
name
:设备的名称,用于在 Home Assistant 的设备列表中显示。
manufacturer
:设备的制造商。
model
:设备的型号。