LD2420 con ESPHome: sensor de presencia mmWave sin nube, YAML incluido
El LD2420 es un radar de 24 GHz de Hi-Link que detecta presencia aunque estés quieto, se conecta por UART a un ESP32 y se integra en Home Assistant vía ESPHome. Sin nube, sin OEM, con el YAML en tu mano.
Por qué usar un radar de 24 GHz para presencia
Un PIR clásico detecta el cambio de calor: si te sientas en el sofá y dejas de moverte, a los pocos minutos deja de verte. Un sensor mmWave como el LD2420 emite una onda de 24 GHz y mide el retorno; distingue micro-movimientos, la respiración o el tecleo, y puede mantener la luz encendida mientras sigues en la habitación aunque estés quieto. Para un estudio o un baño es la diferencia entre una luz que se apaga y una que se queda.
El LD2420 es de la misma familia que el conocido LD2410. Lo uso en guías locales porque es barato, se consigue como módulo suelto o con placa, y el componente oficial de ESPHome lo soporta de serie. La página oficial del componente es la referencia que uso para todo lo que digo aquí.
Materiales
- Un LD2420 (con placa o módulo suelto)
- Un ESP32 con UART libre; en los ejemplos uso GPIO16 (RX) y GPIO17 (TX)
- Cables dupont y una fuente capaz de dar 5 V con algo de margen; el radar no consume mucho, pero el ESP32 con WiFi y el radar juntos se notan
Cableado
La conexión UART se cruza: el TX del LD2420 va al RX del ESP32 y el RX del LD2420 al TX del ESP32. Los pines que uses no son obligatorios, pero tienen que ser pines UART válidos del ESP32.
YAML base para ESPHome
Este YAML crea el nodo con el UART, el componente LD2420 y las entidades de sensor y binario que después usarás en Home Assistant. Cámbiale el nombre, los pines y el friendly name antes de flashear.
esphome:
name: presencia-estudio
friendly_name: Presencia Estudio
esp32:
board: esp32dev
framework:
type: arduino
logger:
level: DEBUG
uart:
id: uart_ld2420
tx_pin: GPIO17
rx_pin: GPIO16
baud_rate: 115200
ld2420:
uart_id: uart_ld2420
sensor:
- platform: ld2420
moving_distance:
name: 'Distancia en movimiento'
moving_energy:
name: 'Energía en movimiento'
still_distance:
name: 'Distancia quieto'
still_energy:
name: 'Energía quieto'
detection_distance:
name: 'Distancia detectada'
binary_sensor:
- platform: ld2420
has_target:
name: 'Presencia en el estudio'
has_moving_target:
name: 'Alguien moviéndose'
has_still_target:
name: 'Alguien quieto'
number:
- platform: ld2420
moving_threshold:
name: 'Umbral movimiento'
still_threshold:
name: 'Umbral quieto'
gate_move_threshold:
number: 0
name: 'Umbral movimiento gate 0'
gate_still_threshold:
number: 0
name: 'Umbral quieto gate 0'
La entidad que vas a usar para la mayoría de automatizaciones es binary_sensor.presencia_en_el_estudio (has_target): se pone en ON cuando detecta algo, sea movimiento o quietud.
Calibración: sin esto no sirve
El LD2420 necesita saber cuál es el ruido de fondo de tu habitación antes de distinguir un cuerpo de una pared. La página oficial del componente lo explica: se graba el noise floor durante al menos 30 segundos y luego se aplica la configuración. Si hay aparatos que generan interferencias cerca —un microondas, una fuente conmutada, un router pegado— conviene grabar más tiempo para que no den falsos positivos.
- Abre la interfaz de ESPHome del nodo y entra en la sección del LD2420.
- Deja la habitación vacía. Pulsa el botón de iniciar la grabación de calibración y espera como mínimo 30 segundos, más si hay fuentes de ruido cerca.
- Pulsa Apply config para guardar el noise floor en el módulo.
Después de calibrar, ajusta la sensibilidad por zonas. El radar divide el espacio en gates, y cada gate tiene su umbral de movimiento y su umbral de quietud. Un número más bajo significa más sensible. No hay una cifra mágica: dos habitaciones con misma forma dan ruido distinto, y el valor se prueba en vivo mientras miras cómo responde la entidad.
| Gates | Qué suelen cubrir | Qué hago |
|---|---|---|
| 0-9 | Zona cercana: escritorio, sofá | Mantener activos y ajustar en vivo el umbral de quietud |
| 10-15 | Zonas lejanas o pasillos detrás de la antena | Bajar sensibilidad o desactivar si dan falsos positivos |
Integrarlo en una automatización
Con ESPHome y Home Assistant, las entidades llegan solas por el API local, sin pasar por ningún servicio externo. Un ejemplo de automatización para encender la luz del estudio al detectar presencia:
alias: Luz estudio con presencia
triggers:
- trigger: state
entity_id: binary_sensor.presencia_en_el_estudio
to: 'on'
actions:
- action: light.turn_on
target:
entity_id: light.estudio
Problemas que me encontré (y cómo se arreglan)
- La entidad no aparece. Primera sospecha: TX y RX cruzados. El misterio más común es tener el TX del sensor al TX del ESP32; tiene que ir al RX. Segunda sospecha: los pines no son válidos para UART en esa placa.
- Detecta presencia cuando no hay nadie. Casi siempre es el noise floor sin guardar, o una fuente de interferencia cerca. Recalibra con más tiempo y, si persiste, aleja el sensor de la fuente o baja la sensibilidad de los gates afectados.
- Detecta movimiento pero no a alguien quieto. El umbral de quietud (still) de la zona está demasiado alto. Baja el still_threshold del gate donde te sientas, no el global: así no vuelves el resto de la casa hiperactivo.
- Tras actualizar ESPHome a 2026.8 el nodo deja de arrancar con este componente. La 2026.8.0b5 quitó el override de prioridad de setup del LD2420 para que el setup espere al bus UART. Si en tu YAML tenías un setup_priority forzado a mano, quítalo y deja que el componente use el orden por defecto.
- El módulo suelto no responde tras conectarlo a 5V. Si no tiene regulador, VCC va a 3.3V. A 5V puedes freír el chip y el ESP32.
Con el sensor funcionando, el siguiente paso natural es montar el coordinador Zigbee o Matter sin nube. La guía de migración a SLZB-06 que ya publiqué cubre la parte de Zigbee; esto del radar local es la parte de presencia que no depende de ninguna app de fabricante.
¿Vas a montar domótica local? Apúntate
Un correo a la semana con la guía práctica, el YAML y el fallo que me encontré por el camino. Sin nube, sin humo.