问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

HomeAssistant 发现MQTT设备(温度,湿度,开关)

创作时间:
作者:
@小白创作中心

HomeAssistant 发现MQTT设备(温度,湿度,开关)

引用
CSDN
1.
https://m.blog.csdn.net/weixin_43808708/article/details/145711960

本文将详细介绍如何在Home Assistant中通过MQTT协议发现和配置温度、湿度传感器以及灯开关。通过本文,你将学会如何通过MQTT将温度、湿度数据以及一个灯的开关状态传输到Home Assistant,并实现设备的自动发现。

1. 前期准备工作

  1. 安装MQTT服务器(如EMQX),可以在Home Assistant的加载项中安装,也可以在NAS上通过Docker安装。
  2. 在Home Assistant的集成中安装MQTT,并连接到MQTT服务器(如EMQX)。

2. 设备需要通过 MQTT 发送三条配置消息,HA会自动识别:

  1. 温度传感器配置消息:
    发布到主题: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"
  }
}

  1. 湿度传感器配置消息:
    发布到主题: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"]
  }
}
  1. 灯的开关配置消息:
    发布到主题: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"
  }
}
  1. name
"name": "Temperature Sensor"

作用:在 Home Assistant 的设备列表或仪表盘中,这个传感器会显示为“Temperature Sensor”。

  1. 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… … …

  1. state_topic
"state_topic": "homeassistant/all/esp8266/state"

作用:指定设备状态消息的主题。设备会将温度数据发送到这个 MQTT 主题。设备定期发送如下消息到该主题:

{"temperature": 23.5}

Home Assistant 会从这个主题读取数据并更新传感器的状态。

  1. unit_of_measurement
"unit_of_measurement": "°C"

作用:指定传感器数据的单位。这会影响 Home Assistant 如何显示数据。在 Home Assistant 的界面中,温度数据会显示为 23.5°C。

  1. value_template
"value_template": "{{ value_json.temperature }}"

作用:定义如何从设备发送的 JSON 数据中提取实际的温度值。假设设备发送的消息是:

{"temperature": 23.5, "humidity": 45.2}

使用
{{ value_json.temperature }}
,Home Assistant 会提取
temperature
的值23.5 作为温度传感器的值。

  1. unique_id
"unique_id": "temp_sensor"

作用:每个传感器需要独立的 unique_id:即使是同一个物理设备上的多个传感器,也需要为每个传感器分配独立的 unique_id。
重要性:确保每个设备中的传感器的 unique_id 是唯一的,否则 Home Assistant 可能会覆盖或拒绝重复的设备。
例如:我一个设备里就有温度,湿度,灯开关,3个不同的传感器,这3个的unique_id就不能相同。

  1. 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
:软件版本。

  1. 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//config
switch 开关 开关 homeassistant/switch//config
light 灯 灯用于控制灯光的开关、亮度和颜色 homeassistant/light//config
binary_sensor 二进制传感器 二进制传感器用于检测状态(如门是否打开、运动是否检测到) homeassistant/binary_sensor//config
cover 封盖 封盖用于控制窗帘、百叶窗等设备的开/关和位置 homeassistant/cover//config
climate 气候 气候设备用于控制温度和模式(如空调、恒温器) homeassistant/climate//config
vacuum 真空吸尘器 真空吸尘器用于控制智能吸尘器的状态和行为 homeassistant/vacuum//config
button 按钮 按钮用于执行一次性的操作 homeassistant/button//config
select 选择器 选择器用于选择一个值或模式 homeassistant/select//config
number 编号器 编号器用于设置一个数值 homeassistant/number//config
alarm_control_panel 警报控制器 警报控制器用于控制安全系统 homeassistant/alarm_control_panel//config
camera 相机 相机用于接收视频流或图片 homeassistant/camera//config
sensor_group 传感器组 传感器组用于组合多个传感器 homeassistant/sensor_group//config

6. HA识别设备在线/离线

  1. 第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是不会显示出来的,会一直显示
不可用
必须将设备修改成
在线
之后才能正常显示数据

  1. 第2步:发送设备在线状态

    homeassistant/all/esp8266/availability
    主题上发布
    online
    (注意:需要设置成保留消息)
    这时候HA才会正常显示数据

  2. 第3步:设备离线
    设备掉电离线是一瞬间的,根本不可能来得及发送数据,所以我们需要将离线信息添加到遗嘱中

"homeassistant/all/esp8266/availability"	//遗嘱主题
"offline"									//遗嘱信息(注意:需要设置成保留消息)
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号