用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动
书接上回,拆了领普的ES1人在传感器,发现核心部件就是LD2410B。
https://post.smzdm.com/p/a8pokr56/
海凌科LD2410B
LD2410B 人体存在传感器介绍
LD2410B 是一款高精度人体存在传感器,广泛应用于智能家居、办公自动化和安全监控等领域。它通过检测微波信号的变化来感知人体的存在,即使在静止状态下也能精确检测。
![用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动](https://qnam.smzdm.com/202407/07/668a73953c7395201.png_e1080.jpg)
那么只要将LD2410B接入自己的可联网控制板,并写入驱动代码,就能制作自己的人体存在传感器。这里选用ESP32模块,能接入wifi,能接入homeassistant,有大量的例程参考,正所谓前人栽树后人乘凉,能CV就CV。理论上更为便宜的ESP8266也可以。
ESP32
ESP32 模块介绍
ESP32 是由乐鑫科技(Espressif Systems)开发的一款高性能、低功耗 Wi-Fi 和双模蓝牙芯片。该模块广泛应用于物联网 (IoT)、可穿戴设备、智能家居、工业自动化等领域。
![用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动](https://am.zdmimg.com/202407/07/668a73ac27e6e372.png_e1080.jpg)
一般来说,开发ESP32需要用到ESP-IDF,并在Arduino IDE等开发环境下写代码烧录,这需要懂一点代码,懂一点单片机。那么有没有更为简单的方法呢?
当然有!ESP32作为一款炙手可热的芯片,在市场拥有巨大的保有量,以及众多的开发者。其中ESPHOME可以说是一个专门为ESP芯片和homeassistant智能家庭定做的傻瓜式变成下载平台。
ESPHOME
ESPHome 介绍
ESPHome 是一个用于创建自定义固件以控制 ESP8266 和 ESP32 芯片的工具。它简化了物联网设备的配置、管理和集成,尤其适用于智能家居自动化系统。
主要特点
简化配置:
使用 YAML 文件进行配置,易于编写和维护。
丰富的配置选项,支持多种传感器、执行器和组件。
与 Home Assistant 集成:
无缝集成 Home Assistant,提供自动发现功能,方便设备管理和控制。
支持通过 Home Assistant 界面直接管理和更新设备固件。
广泛的硬件支持:
支持各种 ESP8266 和 ESP32 板子。
支持多种传感器和执行器,如温湿度传感器、继电器、LED 控制等。
自动更新:
通过 OTA(空中下载)更新设备固件,无需物理连接设备即可进行固件升级。
强大的功能:
支持复杂的自动化逻辑、脚本和定时任务。
支持 Wi-Fi 和蓝牙连接,适应多种应用场景。
总的来说,通过ESPhome,可以在网页上在线编译ESP系列的固件,并且通过有线或者WiFi的方式下载到ESP模块内。具体步骤是:
1、将ESP32模块通过USB串口连接到电脑
2、在ESPhome WEB界面连接设备,写入esphome专用的底层固件,并配置wifi信息联网。
3、刷入的底层固件后就可以在ESPhome里编写YAML文件生成固件,网页编译,在线OTA刷入,十分方便。
![ESPHOME WEB界面,这个是免安装的直接打开 https://web.esphome.io/](https://qnam.smzdm.com/202407/07/668a78ff2a0b34251.jpg_e1080.jpg)
安装ESPHOME
安装ESPhome的方法有两种,一种是在homeassistant的加载项里面直接安装addon,另一种是通过docker安装。
特别注意点是homeassistant有多种安装方式,我们一般用dokcer和虚拟机VM的方式安装homeassistant OS,只有在homeassistant os上才能直接安装esphome,通过docker安装的hs是没有的。至于homeassistant的安装可以搜索站内其他文章,这里默认大家都会homeassistant了。
所以这里建议用docker的方式安装ESPhome。同样这里默认大家都会docker了。
用群晖的,可以在注册表映像里面拉esphome/esphome,然后一路新建-next-启动就行。用docker管理器的,先登录终端,然后用root权限输入
docker run -d --name="ESPHome" -e TZ=Asia/Shanghai -v /home/esphome:/config -v /run/udev:/run/udev --privileged --restart=always --net=host esphome/esphome
安装好后,输入http://主机地址:6052就能访问ESPHOME了。小tips:现在dockerhub被和谐,可能需要一些魔法才能直接拉取,不然可能会报错。
![ESPHOME的dashboard控制面板](https://qnam.smzdm.com/202407/07/668a7d5f361cb5484.jpg_e1080.jpg)
这里要说明ESPHOME与ESPHOME WEB的区别,ESPHOME WEB 是一个在线网站无需安装,网址为https://web.esphome.io/,在这里可以直接给esp32安装底层固件以便在ESPHOME里面操作。而ESPHOME 要通过homeassistant OS里面的插件或者docker安装。
开始合成
准备工具:ESP32模块,LD2410B模块,模块转杜邦线,USB线,电脑一台。
准备环境:装好homeassistant,装好ESPHOME,浏览器一个。
模块连接
![模块连接](https://am.zdmimg.com/202407/07/668a820ede53c4880.jpg_e1080.jpg)
ESP32的IO17和IO16分别当做RX和TX,和LD2410B的TX和RX连接。不同的模块的IO口有出入,这里随便选两个就好,只要自己记住后面代码用到。由此可见只需要两个IO口便可,所以esp8266也是足够的。
![用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动](https://am.zdmimg.com/202407/07/668a8aed8a1c43575.jpg_e1080.jpg)
安装底层固件
首先,将ESP32模块连接到电脑并装好串口驱动,记录串口号如COM4口。打开esphome web网页,点击connect并选择COM4
![esphome web](https://am.zdmimg.com/202407/07/668a80277dd6417.jpg_e1080.jpg)
然后点击蓝色的prepare for fist install,网页会自动识别esp32并自动下载底层固件。安装完成可以设置路由器的ssid以及密码,随后ESP32就会自动联网了。点击visit device会跳转到esp32的后台,在后台我们能看到esp32模块的名字ESP32-XXXX-XXXX,以及当前模块的IP地址。
编写固件
打开ESPHOME(docker方式或者HSos方式),这时一般就会显示discover模块了。我们在右下角点击“new device”-“continue”-然后把发现的名字填进去ESP32-XXXX-XXXX,然后选择ESP32模块的型号,这时会自动生成一个api秘钥(后面会用到)该发现的模块就会从“discover”变成“online”了。
![esphome](https://qnam.smzdm.com/202407/07/668a83c49741c5189.jpg_e1080.jpg)
![重要的秘钥](https://qnam.smzdm.com/202407/07/668a84b14eed03639.jpg_e1080.jpg)
点击模块下面的edit,进入编程。
![默认生成的信息](https://qnam.smzdm.com/202407/07/668a84e9960c77341.png_e1080.jpg)
这些默认的信息橙色的都不要改动,是esp32的联网信息,秘钥凭证等。
牛逼的代码
就像上文说的,ESP32已经有海量成熟的代码,LD2410B也是一款商用的传感器,在开源社区已经有人合成了!所以只管CV!快乐CV!
但是有一些坑踩过的还是要造福值友的,就是要知道改什么地方,CV的价值就在于知道怎么CV能跑起来。
首先将上面默认生成的信息备份到记事本,再将YAML里面的信息全部删掉,将下面贴出的代码全部复制上去。然后需要改动的地方:
1、上面橙字的秘钥(改成记事本内备份的)
2、esp32:
board:后面的型号(改成记事本内备份的实际型号)
3、tx_pin和rx_pin的实际IO口(杜邦线连哪个改哪个)
#Define Project
substitutions:
name: diy-ld2410
device_description: ${name} guide by SmartHomeScene.com
esphome:
name: "${name}"
friendly_name: LD2410人在传感器
comment: DIY LD2410 人在传感器 with ESPHome by 核动力井盖
on_boot:
- priority: 900.0
then:
- lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
#Define Board Type
esp32:
board: esp-wrover-kit
framework:
type: arduino
# Enable Home Assistant API
api:
encryption:
key: "i+KlOgNL6ovigWNWNaXfKXyXFA/1SGLjSGXsyGuKb6M="
logger:
ota:
- platform: esphome
password: "558899a70f2ef41d3b2a2e270afbfc98"
captive_portal:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
#Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esphome-Web-17Eda4"
password: "RIxA0lr8td3y"
#Open web port for browser access
web_server:
port: 80
uart:
tx_pin: GPIO19
rx_pin: GPIO18
baud_rate: 256000
parity: NONE
stop_bits: 1
globals:
- id: cpu_speed
type: int
restore_value: no
initial_value: "0"
ld2410:
id: ld2410_radar
#Configuration entities
number:
- platform: ld2410
timeout:
name: Radar Timeout
max_move_distance_gate:
name: Radar Max Move Distance
max_still_distance_gate:
name: Radar Max Still Distance
g0:
move_threshold:
name: g0 move threshold
still_threshold:
name: g0 still threshold
g1:
move_threshold:
name: g1 move threshold
still_threshold:
name: g1 still threshold
g2:
move_threshold:
name: g2 move threshold
still_threshold:
name: g2 still threshold
g3:
move_threshold:
name: g3 move threshold
still_threshold:
name: g3 still threshold
g4:
move_threshold:
name: g4 move threshold
still_threshold:
name: g4 still threshold
g5:
move_threshold:
name: g5 move threshold
still_threshold:
name: g5 still threshold
g6:
move_threshold:
name: g6 move threshold
still_threshold:
name: g6 still threshold
g7:
move_threshold:
name: g7 move threshold
still_threshold:
name: g7 still threshold
g8:
move_threshold:
name: g8 move threshold
still_threshold:
name: g8 still threshold
# Setting ending of zone 1 occupancy
- platform: template
name: "Radar End Zone 1"
id: radar_z1_end
device_class: distance
min_value: 0
max_value: 600
step: 1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 10
icon: "mdi:arrow-collapse-right"
entity_category: CONFIG
# Setting ending of zone 2 occupancy
- platform: template
name: "Radar End Zone 2"
id: radar_z2_end
device_class: distance
min_value: 0
max_value: 600
step: 1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 36
icon: "mdi:arrow-collapse-right"
entity_category: CONFIG
# Setting ending of zone 3 occupancy
- platform: template
name: "Radar End Zone 3"
id: radar_z3_end
device_class: distance
min_value: 0
max_value: 600
step: 1
mode: box
update_interval: never
optimistic: true
restore_value: true
initial_value: 100
icon: "mdi:arrow-collapse-right"
entity_category: CONFIG
#Occupancy sensor
binary_sensor:
- platform: ld2410
has_target:
name: Radar Target
id: radar_has_target
has_moving_target:
name: Radar Moving Target
has_still_target:
name: Radar Still Target
## Set Up Radar Zones Based On Distance
- platform: template
name: "Radar Zone 1 Occupancy"
device_class: occupancy
icon: mdi:motion-sensor
lambda: |-
if ((id(radar_has_target).state) && (id(radar_detection_distance).state < id(radar_z1_end).state)) {
return true;
} else {
return false;
}
- platform: template
name: "Radar Zone 2 Occupancy"
device_class: occupancy
icon: mdi:motion-sensor
lambda: |-
if ((id(radar_has_target).state) && ((id(radar_z1_end).state < id(radar_detection_distance).state) && (id(radar_detection_distance).state < id(radar_z2_end).state))) {
return true;
} else {
return false;
}
- platform: template
name: "Radar Zone 3 Occupancy"
device_class: occupancy
icon: mdi:motion-sensor
lambda: |-
if ((id(radar_has_target).state) && ((id(radar_z2_end).state < id(radar_detection_distance).state) && (id(radar_detection_distance).state < id(radar_z3_end).state))) {
return true;
} else {
return false;
}
#Exposes configuration and status sensors
sensor:
#Device UPTIME
- platform: uptime
name: Uptime
id: sys_uptime
update_interval: 60s
#Device CPU Speed
- platform: template
name: "ESP Cpu Speed"
accuracy_decimals: 0
unit_of_measurement: Mhz
lambda: |-
return (id(cpu_speed));
entity_category: "diagnostic"
#Device Memory
- platform: template
id: esp_memory
icon: mdi:memory
name: ESP Free Memory
lambda: return heap_caps_get_free_size(MALLOC_CAP_INTERNAL) / 1024;
unit_of_measurement: "kB"
state_class: measurement
entity_category: "diagnostic"
#Device Temperature
- platform: template
id: sys_esp_temperature
name: ESP Temperature
lambda: return temperatureRead();
unit_of_measurement: °C
device_class: TEMPERATURE
update_interval: 60s
#Device RSSI
- platform: wifi_signal
name: RSSI
id: wifi_signal_db
update_interval: 60s
entity_category: "diagnostic"
- platform: ld2410
moving_distance:
name: Radar Moving Distance
id: moving_distance
still_distance:
name: Radar Still Distance
id: still_distance
moving_energy:
name: Radar Move Energy
still_energy:
name: Radar Still Energy
detection_distance:
name: Radar Detection Distance
id: radar_detection_distance
g0:
move_energy:
name: g0 move energy
still_energy:
name: g0 still energy
g1:
move_energy:
name: g1 move energy
still_energy:
name: g1 still energy
g2:
move_energy:
name: g2 move energy
still_energy:
name: g2 still energy
g3:
move_energy:
name: g3 move energy
still_energy:
name: g3 still energy
g4:
move_energy:
name: g4 move energy
still_energy:
name: g4 still energy
g5:
move_energy:
name: g5 move energy
still_energy:
name: g5 still energy
g6:
move_energy:
name: g6 move energy
still_energy:
name: g6 still energy
g7:
move_energy:
name: g7 move energy
still_energy:
name: g7 still energy
g8:
move_energy:
name: g8 move energy
still_energy:
name: g8 still energy
#Exposes control buttons
button:
- platform: restart
icon: mdi:power-cycle
name: "ESP Reboot"
- platform: factory_reset
disabled_by_default: True
name: "Factory Reset ESP"
id: factory_reset_all
- platform: ld2410
factory_reset:
name: "Factory Reset Radar"
restart:
name: "Restart Radar"
query_params:
name: query params
#Exposes control switches
switch:
- platform: ld2410
bluetooth:
name: "Radar Control Bluetooth"
id: radar_bluetooth
engineering_mode:
name: "Radar Engineering Mode"
time:
- platform: sntp
id: time_sntp
#Radar firmware version
text_sensor:
- platform: ld2410
version:
name: "Radar Firmware Version"
#Set distance resolution - 0.75m or 0.2m
select:
- platform: ld2410
distance_resolution:
name: "Radar Distance Resolution"
然后SAVE-INSTALL,等待编译。编译过程需要自动下载对应的库,可能也需要魔法来加速。编译完后就可以通过无线ota,或者有线串口的方式下载模块里面了。
重启模块电源。
homeassistant添加传感器
如无意外,重启后模块就能正常工作了。可以通过esphome控制面板看到模块的信息,点该模块下visit按钮
![模块后台信息](https://am.zdmimg.com/202407/07/668a8896351012635.png_e1080.jpg)
在homeassistant中,点击配置-设备与集成,一般如果模块正常工作就会出现在“已发现”列表里面,如果没有就右下角“添加集成-ESPHOME-输入模块的IP”,这时候HS会问你要API秘钥,可以在上述备份的记事本中找到,或者在ESPHOME控制面板的show api key中看到,即可。
![api key](https://am.zdmimg.com/202407/07/668a8a297ac2d6727.png_e1080.jpg)
![homeassistant添加模块后的样子](https://qnam.smzdm.com/202407/07/668a8a45671804890.png_e1080.jpg)
至此已经可以在HS中自定义各种联动场景了。
总结:
合成成功后的人体存在传感器可以说在功能上和领普的es1十分接近了,diy的话成本15+15=30吧,如果用裸esp32核心,或者esp8266会更便宜,适合手头上已经有esp芯片的垃圾佬。而领普es1各种券后也能做到44元的超好价格,还能直接在米家超控,也很超值!
但是垃圾佬的乐趣就是在于折腾,是吧!
下面欣赏下人体存在传感器-探索者版本的美照
![人体存在传感器-探索者版本](https://qnam.smzdm.com/202407/07/668a8b81c0bda3058.jpg_e1080.jpg)
![领普es1](https://qnam.smzdm.com/202407/07/668a8d7d655cc3911.jpg_e1080.jpg)
![手机客户端hs界面](https://am.zdmimg.com/202407/07/668a8bb65bf346254.jpg_e1080.jpg)
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
![](https://res.smzdm.com/pc/pc_shequ/dist/img/the-end.png)
PA1NCL0WN
校验提示文案
蝶思枫
校验提示文案
lihonest
校验提示文案
爱的昵称
校验提示文案
YikLiu
校验提示文案
等捡白菜叶子都没有
校验提示文案
默娜丽_娜丝
校验提示文案
frag0
校验提示文案
DreamOnion
校验提示文案
痛苦的浪漫
校验提示文案
一只小肥鲨
校验提示文案
胶己人食茶
校验提示文案
一天下无双一
校验提示文案
一天下无双一
校验提示文案
胶己人食茶
校验提示文案
PA1NCL0WN
校验提示文案
一只小肥鲨
校验提示文案
蝶思枫
校验提示文案
爱的昵称
校验提示文案
痛苦的浪漫
校验提示文案
lihonest
校验提示文案
DreamOnion
校验提示文案
YikLiu
校验提示文案
frag0
校验提示文案
默娜丽_娜丝
校验提示文案
等捡白菜叶子都没有
校验提示文案