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

要通过 MQTT 将温度、湿度数据以及一个灯的开关状态传输到 Home Assistant 并实现设备自动发现,可以按照以下步骤操作:

1.前期准备工作

  1. 安装MQTT服务器(EMQX)配置好(可以在HA加载项中安装,也可以在NAS上Docker安装)
    在这里插入图片描述

  2. HA的集成中安装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用途单位示例
temperature1.测量温度°C 或 °F温度传感器、恒温器等
humidity2.测量湿度%(百分比)湿度传感器
pressure3.测量压力hPa(百帕)等气压传感器、水压传感器
gas4.测量气体浓度ppm(百万分之一)、ppb(十亿分之一)等一氧化碳传感器、天然气传感器
pm255.(PM2.5)浓度µg/m³(微克/立方米)空气质量传感器
pm106.(PM10)浓度µg/m³(微克/立方米空气质量传感器
voltage7.测量电压V(伏特)电池电压传感器、电源电压传感器
current8.测量电流A(安培)电流传感器、电源电流传感器
power9.测量功率W(瓦特)功率传感器、智能插座功率监测
energy10.测量能量消耗kWh(千瓦时)电表、智能插座能量监测
frequency11.测量频率Hz(赫兹)频率传感器
distance12.测量距离m(米)、cm(厘米)等超声波距离传感器、激光测距仪
illuminance13.测量光照强度lx(勒克斯)光照传感器
carbon_dioxide14.测量二氧化碳浓度ppm(百万分之一)室内空气质量传感器
battery15.测量电池电量%(百分比)设备电池电量传感器
signal_strength16.信号强度dB(分贝)、dBm(分贝毫瓦)Wi-Fi 信号强度传感器、蓝牙信号强度传感器
water17.水位或水量m³(立方米)、L(升)等水表、水位传感器
door / window18.检测门或窗的开合状态无(状态为 open 或 closed)门磁传感器、窗磁传感器
smoke19.检测烟雾无(状态为 detected 或 clear)烟雾报警器
carbon_monoxide20.检测一氧化碳无(状态为 detected 或 clear)一氧化碳报警器
flame21.检测火焰无(状态为 detected 或 clear)火焰传感器
moisture22.检测水浸或湿度无(状态为 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/<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. 第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才会正常显示数据
在这里插入图片描述
3. 第3步:设备离线
设备掉电离线是一瞬间的,根本不可能来得及发送数据,所以我们需要将离线信息添加到遗嘱中

"homeassistant/all/esp8266/availability"	//遗嘱主题
"offline"									//遗嘱信息(注意:需要设置成保留消息)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值