用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动

2024-07-07 21:18:12 23点赞 147收藏 27评论

书接上回,拆了领普的ES1人在传感器,发现核心部件就是LD2410B。

https://post.smzdm.com/p/a8pokr56/

海凌科LD2410B

LD2410B 人体存在传感器介绍

LD2410B 是一款高精度人体存在传感器,广泛应用于智能家居、办公自动化和安全监控等领域。它通过检测微波信号的变化来感知人体的存在,即使在静止状态下也能精确检测。

用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动

那么只要将LD2410B接入自己的可联网控制板,并写入驱动代码,就能制作自己的人体存在传感器。这里选用ESP32模块,能接入wifi,能接入homeassistant,有大量的例程参考,正所谓前人栽树后人乘凉,能CV就CV。理论上更为便宜的ESP8266也可以。

ESP32

ESP32 模块介绍

ESP32 是由乐鑫科技(Espressif Systems)开发的一款高性能、低功耗 Wi-Fi 和双模蓝牙芯片。该模块广泛应用于物联网 (IoT)、可穿戴设备、智能家居、工业自动化等领域。

用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动

一般来说,开发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/ESPHOME WEB界面,这个是免安装的直接打开 https://web.esphome.io/

安装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控制面板ESPHOME的dashboard控制面板

这里要说明ESPHOME与ESPHOME WEB的区别,ESPHOME WEB 是一个在线网站无需安装,网址为https://web.esphome.io/,在这里可以直接给esp32安装底层固件以便在ESPHOME里面操作。而ESPHOME 要通过homeassistant OS里面的插件或者docker安装。

开始合成

准备工具:ESP32模块,LD2410B模块,模块转杜邦线,USB线,电脑一台。

准备环境:装好homeassistant,装好ESPHOME,浏览器一个。

模块连接

模块连接模块连接

ESP32的IO17和IO16分别当做RX和TX,和LD2410B的TX和RX连接。不同的模块的IO口有出入,这里随便选两个就好,只要自己记住后面代码用到。由此可见只需要两个IO口便可,所以esp8266也是足够的。

用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动

安装底层固件

首先,将ESP32模块连接到电脑并装好串口驱动,记录串口号如COM4口。打开esphome web网页,点击connect并选择COM4

esphome webesphome web

然后点击蓝色的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”了。

esphomeesphome重要的秘钥重要的秘钥

点击模块下面的edit,进入编程。

默认生成的信息默认生成的信息

这些默认的信息橙色的都不要改动,是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按钮

模块后台信息模块后台信息

在homeassistant中,点击配置-设备与集成,一般如果模块正常工作就会出现在“已发现”列表里面,如果没有就右下角“添加集成-ESPHOME-输入模块的IP”,这时候HS会问你要API秘钥,可以在上述备份的记事本中找到,或者在ESPHOME控制面板的show api key中看到,即可。

api keyapi keyhomeassistant添加模块后的样子homeassistant添加模块后的样子

至此已经可以在HS中自定义各种联动场景了。

总结:

合成成功后的人体存在传感器可以说在功能上和领普的es1十分接近了,diy的话成本15+15=30吧,如果用裸esp32核心,或者esp8266会更便宜,适合手头上已经有esp芯片的垃圾佬。而领普es1各种券后也能做到44元的超好价格,还能直接在米家超控,也很超值!

但是垃圾佬的乐趣就是在于折腾,是吧!用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动

下面欣赏下人体存在传感器-探索者版本的美照用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动用esp32和LD2410B通过ESPHOME搭建人体存在传感器并在homeassistant中与米家联动

人体存在传感器-探索者版本人体存在传感器-探索者版本领普es1领普es1手机客户端hs界面手机客户端hs界面

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
27评论

  • 精彩
  • 最新
  • 这玩意还是不行,太不稳定动不动就不再可用,不知道楼主长时间试过没。好像是esp32蓝牙和wifi公用天线导致抢信号,间歇性不再可用

    校验提示文案

    提交
    我改到8266上去了,很稳定

    校验提示文案

    提交
    代码是不是差不多,我也准备改了,还买了仨esp32 [大囧]

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 真的建议直接买成品,做了两个人在,成本不低,而且,无法接入米家,要稳定,建议买成品,也就40上下

    校验提示文案

    提交
    有hass的情况下也不贵,两个ld2410b活动27元,排线5个3元,esp32做蓝牙网关10元,220转5v带线模块4.5元。算下来45两个,接入ha再自动化与米家设备联动。而且esp多余引脚还能再自己搞点传感器什么的比如温湿度,气压传感器,还能借esp搞蓝牙围栏。就是麻烦点,折腾还是有意思的,基本上全程不用写代码

    校验提示文案

    提交
    加了红外代码有了,但是想加温湿度的代码不会写 [尴尬]

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 用蓝牙的更方便,不过水气影响很大,不适合卫生间,特定环境下可用

    校验提示文案

    提交
  • 有没有整好的?懒得折腾呢

    校验提示文案

    提交
    整好的就是领普es1

    校验提示文案

    提交
    收起所有回复
  • 大佬,那个供电的是啥,能提供5V电压?

    校验提示文案

    提交
    还要220压5v很麻烦

    校验提示文案

    提交
    手机充电器呀

    校验提示文案

    提交
    收起所有回复
  • [邪恶] [邪恶] 我的2410b在这

    校验提示文案

    提交
  • 大佬费心了,这代码我等学渣搞不定,我还是买一个吧 [喜极而泣]

    校验提示文案

    提交
  • 可以。比较高级玩法

    校验提示文案

    提交
  • 仰望高端玩家

    校验提示文案

    提交
  • 折腾的时候最快乐,最终还是选择成品。

    校验提示文案

    提交
  • 老老實實的買一個吧

    校验提示文案

    提交
  • [喜极而泣] 点赞 可是……我还是得买成品 因为我看不懂

    校验提示文案

    提交
  • 硬核牛逼

    校验提示文案

    提交
  • 大佬牛13

    校验提示文案

    提交
  • 不知道哪一步出错,就esp temperature显示其它传感器都是未知 [喜极而泣]

    校验提示文案

    提交
    尴尬了,rx和tx接反了 [期待]

    校验提示文案

    提交
    收起所有回复
  • 联动上视频监控识别是不是可以做个防交警贴条的东西

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
147
扫一下,分享更方便,购买更轻松