Home Assistant seriál s Jakubem: Díl 12: Room Presence Radar aneb senzor přítomnosti
Úvod
V dnešním díle si vlastnoručně vyrobíme senzor přítomnosti, který se výborně hodí například pro automatické rozsvěcení a zhasínání světel v místnosti.
Co budeme potřebovat
- nainstalovaný HA a ESPHome z předchozích dílů
- ESP32 vývojová deska
- datový microUSB kabel
- LD2410C 24GHz senzor
- 3D tiskárna nebo kamarád s tiskárnou
- jumper propojky
- 5V/1A zdroj
- krimpovací kleště (volitelné)
- krimpovací konektory (volitelné)
- propojovací kablíky (volitelné)

Instalace ESPHome na desku
V minulém dílu jsme si již ukazovali, jak se instaluje základní ESPHome. Jako desku použijeme NodeMCU ESP32 Development Board, pro kterou jsem vytvořil i tisknutelnou krabičku. Odkaz na model najdete na zde.
Pro instalaci použijeme webový tool, který je za mě nejrychlejší a nejjednodušší. Otevřeme si tedy tuto stránku, připojíme desku přes microUSB do počítače a na webu klikneme na Connect.

Otevře se nám dialogové okno, kde bychom měli vidět naši desku. Pokud ji tam nevidíte, zkuste si pročíst předchozí článek, kde je popsáno, v čem by mohl být problém (ovladače, kabel, který není datový apod.). V dialogovém okně vybereme naši desku.

Pokud vše proběhlo v pořádku, objeví se nám další nabídka s modrým textem PREPARE FOR FIRST USE, na který klepneme.
Pokud se vám v další nabídce dlouho točí kolečko s nápisem Connecting, zkuste následující postup:
- Desku odpojte od USB kabelu (web se vám automaticky vrátí do předchozí nabídky s Connect)
- Držte pravé tlačítko vedle microUSB portu (to kde není napsáno EN)
- Připojte USB kabel, znovu klepněte na Connect a PREPARE FOR FIRST USE, a tlačítko pusťte až v momentě, kdy začne instalace.
Tento postup je někdy potřeba zkusit vícekrát, ale většinou je potřeba jen u desek, na kterých už je ESPHome nainstalován a chcete dát desku do „továrního“ nastavení s čerstvým ESPHome. Postupem popsaným výše přepnete desku do bootovacího módu.

Po úspěšné instalaci odklepneme dialogové okno a klepneme na CHANGE WI-FI.


V nabídce vyberte svou Wi-Fi síť a vyplňte heslo k Wi-Fi.

Pokud nás uvítá dialogové okno Provisioned, tak máme napůl vyhráno a deska se základním ESPHome je připravena.
Přidání a nastavení desky v HA
Nyní se přesuneme do našeho HA a to konkrétně do ESPHome Builderu.
V horní části by se nám měla objevit nabídka Discovered 1 device, kde klepneme na SHOW vpravo.

Deska se nám přidá do menu k ostatním zařízením (pokud již nějaká máme) a my klepneme na TAKE CONTROL.

Desku si libovolně pojmenujeme a klepneme znovu na TAKE CONTROL.
Pokud nám vyskočí chyba, ve většině případů stačí doplnit údaje k Wi-Fi, tj. u desky klepneme na EDIT, doplníme následující kód:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
a v pravém rohu klepneme na INSTALL. Poté by se měla konfigurace zkompilovat a nainstalovat.
My tuto opravu můžeme přeskočit a rovnou si tam doplníme celý kód, který budeme potřebovat k našemu radaru:
esphome:
name: hallway-radar-esp32
friendly_name: Hallway Radar ESP32
esp32:
board: esp32dev
framework:
type: esp-idf
# Enable logging
logger:
baud_rate: 0
# Enable Home Assistant API
api:
encryption:
key: ""
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Fallback Hotspot"
password: ""
ota:
- platform: esphome
password: ""
captive_portal:
uart:
id: uart_ld2410
tx_pin: GPIO16
rx_pin: GPIO17
baud_rate: 256000
parity: NONE
stop_bits: 1
ld2410:
sensor:
- platform: uptime
name: Uptime
entity_category: "diagnostic"
update_interval: 300s
- platform: wifi_signal
name: "WiFi Signal"
accuracy_decimals: 1
entity_category: "diagnostic"
update_interval: 5s
filters:
- exponential_moving_average:
alpha: 0.05
send_every: 2
send_first_at: 2
- or:
- throttle: 600s
- delta: 2
- platform: ld2410
light:
name: light
moving_distance:
name : Moving Distance
still_distance:
name: Still Distance
moving_energy:
name: Move Energy
still_energy:
name: Still Energy
detection_distance:
name: Detection Distance
switch:
- platform: ld2410
bluetooth:
name: "control bluetooth"
number:
- platform: ld2410
timeout:
name: timeout
light_threshold:
name: light threshold
max_move_distance_gate:
name: max move distance gate
max_still_distance_gate:
name: max still distance gate
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
binary_sensor:
- platform: ld2410
has_target:
name: Presence
has_moving_target:
name: Moving Target
has_still_target:
name: Still Target
Ve svém konfiguračním kódu upravte následující čtyři části podle vlastních údajů:
esphome:
name: hallway-radar-esp32
friendly_name: Hallway Radar ESP32
Friendly name si můžete nastavit libovolně, ale hodnota name musí přesně odpovídat názvu, který jste zadali ve webovém klientovi při první instalaci. Jinak se deska nenačte správně. Alternativně můžete do kódu přidat statickou IP adresu a bránu – a v routeru tuto IP přiřadit trvale k MAC adrese desky.
api:
encryption:
key: "MujVygenerovanyKod"
Zde nahraďte key: "" vlastním klíčem, který si můžete vygenerovat například zde.
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Fallback Hotspot"
password: "MojeHesloNaHotspot"
Tato sekce definuje záchranný hotspot, který deska začne vysílat, pokud se nepřipojí ke známé Wi-Fi síti. Díky tomu se k ní budete moci připojit a opravit konfiguraci.
ota:
- platform: esphome
password: "MojeHesloProOTAUpdate"
Sem zadejte heslo, které budete potřebovat při OTA (Over-the-Air) aktualizacích firmware.
Až budete mít vše připraveno, klikněte v pravém horním rohu na INSTALL a v nabídce zvolte možnost Wirelessly.
Kompilace může chvíli trvat – v některých případech i deset minut, tak se neděste 🙂

3D tisk krabičky
Celý projekt s krabičkou a držákem naleznete zde. Na podložkách je několik variant – jak pro NodeMCU desku, tak i pro klasický ESP32 DevKit. Včetně verze bez držáku pro obě desky.
Tisk krabičky a držáku zabere přibližně dvě hodiny a spotřeba materiálu je minimální. Veškeré důležité informace najdete přímo v projektu na MakerWorldu.
Vůle pro osazení ESP32 desky, radaru i víčka jsou minimální, takže je potřeba při sestavení použít trochu síly. Pokud nemáte perfektně kalibrovanou tiskárnu, doporučuji tisknout pomalu – model je navržen s přesností na setiny milimetru. 🙂
Soubor ve formátu .3mf je optimalizovaný pro tiskárny BambuLab. Pokud by vám nesedělo víčko nebo deska, můžete zkusit zmenšit boční stěny o 0,1 mm z každé strany – nicméně já osobně jsem tiskl několik kusů a všechny seděly bez úprav.

Kompletace
Osazení ESP32 desky a radaru
Nyní můžeme desku odpojit od microUSB kabelu a vložit ji do vytištěné krabičky. Stejně tak následně vložíme i LD2410C radar. Důležité: nejdříve vždy vložte ESP32 desku, a až potom radar. Desku je ideální vkládat mírně šikmo – tedy nejprve zasunout stranu s USB portem a pak druhou stranu mírným zatlačením dorovnat. Pokud deska nesedí rovně, jemně zatlačte na protilehlou stranu, tím se usadí.
Vyjmutí je trochu složitější. U NodeMCU se mi osvědčil malý imbusový klíč – dá se zasunout pod desku a lehce zatáhnout. U klasického ESP32 DevKitu pomáhá malý plochý šroubovák – opatrně jej vsuňte pod USB port a lehce nadzvedněte. Nicméně krabička není konstruovaná na časté výměny desek a ani by to nemělo být potřeba :).

Zapojení konektorů
Pomocí krimpovacích kleští si vyrobíme čtyři Dupont propojky (female to female). Každá bude dlouhá přibližně 4 cm, s konektory cca 6 cm.
Pokud si propojky vyrábět nechcete, můžete použít hotové. Počítejte ale s tím, že uvnitř krabičky nebude tolik místa – bude nutné kablíky smotat, aby bylo vůbec možné krabičku zavřít.
| LD2410C pin | ESP32 pin | Poznámka |
| VCC | 5V | napájení |
| GND | GND | uzemnění |
| TX | GPIO17 (RX) | přijímá data z radaru |
| RX | GPIO16 (TX) | posílá data do radaru |
Poznámka: TX na radaru připojujeme na RX na ESP32 a naopak. Pokud radar nekomunikuje, zkontrolujte zapojení těchto pinů.
Radar nepotřebuje žádné další komponenty ani rezistory – zapojení funguje přímo. Jakmile připojíte všechny 4 duponty a napájíte desku, radar by měl začít komunikovat automaticky přes ESPHome podle konfigurace v YAML kódu.

Složení držáku
Sestavení držáku je jednoduché:
- Matici se závitem provlečte skrz tyčku s kulovou hlavou.
- Přišroubujte k čtvercové základně.
- Zacvakněte tyčku do čtvercového podstavce pro krabičku (opět použijte mírnou sílu).
- Nakonec nacvakněte samotnou krabičku do držáku – a je hotovo.

Nyní pouze zacvakneme víčko a máme hotovo. Desku připojíme přes microUSB do 5V/1A zdroje a měla by ožít jak deska, tak radar. Poslední krok je doladit detekční vzdálenosti podle toho, co potřebujeme sledovat.
Přidání radaru do HA a nastavení
Přejdeme do Settings → Devices & Services → ESPHome. Nahoře by se mělo zobrazit nově objevené zařízení. Klikneme vpravo na ADD. Zařízení se přidá do Devices, kde můžeme kliknout na modré 1 device.

Radar má maximální dosah přibližně 6 metrů a v jeho nastavení najdeme 16 posuvníků (slidery), rozdělených podle zón g1–g8. Každá zóna má dvě hodnoty – still (pro detekci nehybné osoby) a move (pro detekci pohybu).
S nastavením je potřeba chvíli experimentovat. Například já používám pouze g1–g3 s nižšími hodnotami, zatímco g4–g8 mám nastavené na hodnotu 100 – což v praxi znamená, že tyto zóny jsou „vypnuté“. U jiného radaru mám ale zcela jiné nastavení. Vždy záleží na konkrétním prostoru a umístění zařízení.
Přehled vzdáleností jednotlivých zón:
| Označení | Vzdálenost |
|---|---|
| g0 | 0 m |
| g1 | 0 – 0.75 m |
| g2 | 0.75 – 1.5 m |
| g3 | 1.5 – 2.25 m |
| g4 | 2.25 – 3 m |
| g5 | 3 – 3.75 m |
| g6 | 3.75 – 4.5 m |
| g7 | 4.5 – 5.25 m |
| g8 | 5.25 – 6 m |
Automatizace
Pro vytvoření automatizace se přesuneme do Settings -> Automations & scenes -> Create automation.
V sekci When klikneme na Add Trigger a vyhledáme State.

V políčku Entity vyhledáme Presence a položku vybereme. Tím jsme triggeru řekli, že chceme automatizaci spustit kdykoliv se změní přítomnost (Presence) na senzoru.

Nyní se přesuneme do sekce Then do, klikneme na Add Action a vyhledáme Choose.

Já radar používám například pro rozsvěcení světel v koupelně a v chodbě. V koupelně jsou dvě světla, jedno denní (bílé) a jedno noční (oranžové). Dle času se v automatizaci spouští jednotlivé akce. Na chodbě jsou LED pásky, které umožňují měnit teplotu barvy a opět dle denní doby se mění na celkem tři režimy (den, večer, noc). O chytrých LED páscích budeme určitě mluvit v nějakém z příštích dílů.
Nepřepokládám, že budete senzor využívat stejně jako já, takže si případné akce upravte dle svého využití. Podmínky (Conditions) a automatizaci budete mít ale pravděpodobně stejné.
V bloku Choose klikneme nejprve na Add Option, poté na Add Condition a vybereme Device. V políčku Device vyhledáme podle názvu náš radar a jako podmínka (Condition) by se nám automaticky mělo vybrat Presence is occupied (pokud ne, tuto položku najdeme a vybereme v rolovacím menu). Případně si v duration můžeme nastavit čas po jak dlouhé době chceme, aby se podmínka spustila. Já mám toto políčko prázdné, protože chci, aby se světlo rozsvítilo hned :).

Dále si v políčku Action nastavíme, jaká akce se má provést po splnění podmínky (po detekci osoby). Já mám těch podmínek několik, takže je sem nebudu všechny vypisovat a naleznete je v celém kódu níže.
Nyní klepneme na Add Option a stejným způsobem si nastavíme co se má stát, pokud již nebude detekována žádná osoba. Postup bude úplně stejný, jen v podmínce vybereme Presence is not occupied a nastavíme si příslušnou akci (například vypnutí světla).
Celý kód automatizace pro světla v chodbě
alias: Hallway presence
description: ""
triggers:
- entity_id:
- binary_sensor.esphome_web_e55440_presence
trigger: state
conditions: []
actions:
- choose:
- conditions:
- type: is_occupied
condition: device
device_id: 3ef92fa8a29f811585e602618857612e
entity_id: dbdb28bcb31540501c86cc04e215d6e2
domain: binary_sensor
sequence:
- if:
- condition: time
after: "08:00:00"
before: "18:30:00"
then:
- type: turn_on
device_id: 9a0086027549cbc920467b22642a5af0
entity_id: bfc1f4dde5939664631f81941d886b86
domain: light
- device_id: 9a0086027549cbc920467b22642a5af0
domain: select
entity_id: 952e490210c6b123ec73655ac79bd11a
type: select_option
option: Solid Day
- if:
- condition: time
after: "18:30:00"
before: "22:00:00"
then:
- type: turn_on
device_id: 9a0086027549cbc920467b22642a5af0
entity_id: bfc1f4dde5939664631f81941d886b86
domain: light
- device_id: 9a0086027549cbc920467b22642a5af0
domain: select
entity_id: 952e490210c6b123ec73655ac79bd11a
type: select_option
option: Solid Evening
- if:
- condition: time
after: "22:00:00"
before: "08:30:00"
then:
- type: turn_on
device_id: 9a0086027549cbc920467b22642a5af0
entity_id: bfc1f4dde5939664631f81941d886b86
domain: light
- device_id: 9a0086027549cbc920467b22642a5af0
domain: select
entity_id: 952e490210c6b123ec73655ac79bd11a
type: select_option
option: Solid Night
enabled: true
- conditions:
- condition: or
conditions:
- type: is_not_occupied
condition: device
device_id: 3ef92fa8a29f811585e602618857612e
entity_id: dbdb28bcb31540501c86cc04e215d6e2
domain: binary_sensor
- condition: state
entity_id: binary_sensor.esphome_web_e55440_presence
state: unavailable
sequence:
- type: turn_off
device_id: 9a0086027549cbc920467b22642a5af0
entity_id: bfc1f4dde5939664631f81941d886b86
domain: light
mode: single
Celý kód automatizace pro světla v koupelně
alias: Bathroom presence
description: ""
mode: single
triggers:
- entity_id:
- binary_sensor.bathroom_radar_presence
trigger: state
conditions: []
actions:
- choose:
- conditions:
- type: is_occupied
condition: device
device_id: b0846e028c20a87ef65b09050c69a0dd
entity_id: a1d888be7dc71f935e11c8478c4fca18
domain: binary_sensor
sequence:
- if:
- condition: time
after: "08:00:00"
before: "22:00:00"
then:
- type: turn_on
device_id: 89be7f66287b2d6a38e816f7c73049f2
entity_id: 843e846a0364751c7610e2032ae03170
domain: switch
- if:
- condition: time
after: "22:00:00"
before: "08:00:00"
then:
- type: turn_on
device_id: 89be7f66287b2d6a38e816f7c73049f2
entity_id: c2a362591f1b1d622284a7ec1ef4fd96
domain: switch
- conditions:
- condition: and
conditions:
- type: is_not_occupied
condition: device
device_id: b0846e028c20a87ef65b09050c69a0dd
entity_id: a1d888be7dc71f935e11c8478c4fca18
domain: binary_sensor
sequence:
- type: turn_off
device_id: 89be7f66287b2d6a38e816f7c73049f2
entity_id: 843e846a0364751c7610e2032ae03170
domain: switch
- type: turn_off
device_id: 89be7f66287b2d6a38e816f7c73049f2
entity_id: c2a362591f1b1d622284a7ec1ef4fd96
domain: switch
Závěr
V dnešním díle jsme odvedli pořádný kus práce. Nahráli jsme na naši ESP32 desku ESPHome a připravili kompletní konfiguraci pro radar. Dále jsme vytiskli a sestavili krabičku (případně i držák), osadili desku i radar, připravili dupont propojky a nastavili detekční vzdálenosti.
V příštím díle se pustíme do něčeho složitějšího – zaměříme se na kvalitu vzduchu a začneme měřit hladinu CO₂. A samozřejmě opět s pomocí levné ESP32 desky a tentokrát o něco dražšího senzoru 🙂
Tak pohybu zdar!

Dobrý den, je možné použít místo LD2410C 24GHz senzoru jiný – Seed studio 24GHz mmWave Sensor? A je postup pak stejný? Nějak jsem při jeho koupi přecenil své síly a rád bych ho využil podle tohoto návodu. Mám ho propojený s XIAO ESP32-S3. Mnohokrát děkuji za případnou radu.
Dobrý den, jak deska, tak senzor mají jiné rozměry, takže krabička nebude pasovat. Konfigurace v ESPHome bude taky jiná. Nemám osobně s deskou ani senzorem žádné zkušenosti, ale teoreticky by mělo stačit nahradit kód pro senzor tímto kódem:
sensor:
- platform: seeed_mr24hpc1
custom_presence_of_detection:
name: "Static Distance"
movement_signs:
name: "Body Movement Parameter"
custom_motion_distance:
name: "Motion Distance"
custom_spatial_static_value:
name: "Existence Energy"
custom_spatial_motion_value:
name: "Motion Energy"
custom_motion_speed:
name: "Motion Speed"
custom_mode_num:
name: "Current Custom Mode"
A typ desky změnit na tu Vaši:
esphome:
# Name of the ESP32-S3 device
name: esp32s3
# PlatformIO build options
platformio_options:
build_flags: -DBOARD_HAS_PSRAM
board_build.arduino.memory_type: qio_opi
board_build.f_flash: 80000000L
board_build.flash_mode: qio
# Configuration for ESP32
esp32:
board: esp32-s3-devkitc-1
framework:
type: arduino