mmWave Presence Sensors for Home Assistant: Setup Guide, PIR Comparison, and Why Developers Are Switching
An mmWave presence sensor for Home Assistant gives you room-level occupancy detection that stays accurate whether you're sleeping, reading, or sitting completely still, something PIR sensors simply cannot do reliably. By the end of this guide, you'll have a working mmWave sensor reporting presence to Home Assistant, understand exactly where it outperforms PIR, and know which sensor hardware is worth your time in 2026.
What You'll Build
A presence detection system that knows a room is occupied even when nobody is moving. Automations that don't turn the lights off while you're reading. A home that responds to where people actually are, not just where they last walked through a beam.
What Do You Need for mmWave Presence Detection in Home Assistant?
Hardware
- An mmWave presence sensor (see comparison table below). Popular choices include the Seeed Studio XIAO ESP32C3 + LD2410B combo, the Aqara FP2 (Wi-Fi, native HomeKit and HA integration), or the Tuya-based ZY-M100 (Zigbee).
- A USB-C cable and 5V power supply if your sensor isn't battery-powered.
- Optional: an ESP32-based development board if you're building your own sensor around a bare mmWave module like the HLK-LD2410 or HLK-LD2450.
Software
- Home Assistant OS, Supervised, or Container (2024.1 or later recommended).
- ESPHome add-on (if using an ESP32-based sensor).
- The Zigbee2MQTT or ZHA integration (if using a Zigbee sensor).
- A basic understanding of YAML. You don't need to be a firmware engineer, but you should be comfortable editing config files.
mmWave vs PIR Sensor for Home Assistant: What's the Real Difference?
PIR (passive infrared) sensors detect changes in infrared radiation, meaning they only trigger when something warm moves across their field of view. They're cheap, reliable for motion detection, and draw almost no power. The problem is the word "changes." Sit still for 30 seconds and most PIR sensors stop seeing you. Every developer who has automated their office lights eventually runs into this wall.
mmWave (millimeter wave) radar operates in the 24 GHz or 60 GHz frequency range and detects micro-motion, things like the rise and fall of a chest during breathing. A person sitting at a desk reading a book reflects radar energy differently than an empty room, and the sensor measures that difference continuously. Detection doesn't depend on temperature differential or movement magnitude.
| Feature | PIR Sensor | mmWave Presence Sensor |
|---|---|---|
| Detects still occupancy | No | Yes (breathing, micro-movement) |
| Typical range | 5-12 meters | 2-9 meters depending on module |
| False positives from pets | High | Lower (configurable sensitivity zones) |
| Power consumption | Very low (microamps) | Low to moderate (50-500 mW typical) |
| Works through glass/thin walls | No | Partially (a limitation, not a feature) |
| Price range | $2-$15 | $15-$80 |
| Home Assistant integration | Simple binary sensor | Binary + distance, zone, energy data |
| Setup complexity | Low | Low to medium |
For a hallway or front door, a PIR sensor is often the better choice. For a bedroom, office, or living room where you need the lights and HVAC to respond to whether someone is actually present, mmWave is worth the extra cost and setup time.
Which mmWave Sensor Works Best with Home Assistant in 2026?
The right sensor depends on your integration path. Here are the three most practical options:
1. Aqara FP2 (Wi-Fi, Multi-Zone)
The FP2 connects over Wi-Fi and supports up to 30 detection zones with x/y coordinate output. It integrates with Home Assistant via the official Aqara integration (since HA 2023.8). No soldering, no ESPHome. If you want a polished out-of-box experience and don't mind $65-$80, this is the one. Range is rated to 8 meters with a 120-degree field of view. The zone configuration happens in the Aqara app, which is a minor friction point.
2. Zigbee mmWave Sensors (ZY-M100, ZM-35H-20)
Several manufacturers produce Zigbee-based mmWave sensors that pair with Zigbee2MQTT or ZHA. The Tuya ZY-M100 is widely supported and costs around $20-$30. It reports occupancy, illuminance, and distance as separate entities in HA. Range is typically 5-6 meters. These are good if you already have a Zigbee coordinator and want to stay in that ecosystem.
3. ESP32 + HLK-LD2410 (DIY, Maximum Control)
The HLK-LD2410 is a 24 GHz module from Hi-Link that costs about $5-$8. Pair it with an ESP32-C3 or ESP32-S3, flash ESPHome, and you get full control over sensitivity, detection gates, and update intervals. This is the path most software developers take because the ESPHome YAML config is readable, the entity data is rich, and you can tune the sensor behavior to your specific room geometry. [LINK: hlk-ld2410-esp32-kit]
Step-by-Step: Setting Up an ESP32 + LD2410 mmWave Sensor with ESPHome
Step 1: Wire the LD2410 to Your ESP32
The LD2410 communicates over UART. Connect it to your ESP32 as follows:
- LD2410 VCC to ESP32 3.3V
- LD2410 GND to ESP32 GND
- LD2410 TX to ESP32 RX pin (e.g., GPIO16 on most boards)
- LD2410 RX to ESP32 TX pin (e.g., GPIO17)
- LD2410 OUT pin to any GPIO if you want the hardware presence output (optional when using UART)
The LD2410 runs on 3.3V and draws about 80-130 mA during operation. Keep your USB power supply rated for at least 500 mA to be safe.
Step 2: Create an ESPHome Config
In Home Assistant, open the ESPHome add-on and create a new device. Paste this configuration, adjusting GPIO pins and your Wi-Fi credentials:
esphome:
name: office-presence
friendly_name: Office Presence Sensor
esp32:
board: esp32dev
framework:
type: arduino
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
api:
encryption:
key: !secret api_key
ota:
password: !secret ota_password
uart:
id: ld2410_uart
tx_pin: GPIO17
rx_pin: GPIO16
baud_rate: 256000
parity: NONE
stop_bits: 1
ld2410:
id: ld2410_radar
uart_id: ld2410_uart
binary_sensor:
- platform: ld2410
has_target:
name: Presence Detected
has_moving_target:
name: Moving Target
has_still_target:
name: Still Target
sensor:
- platform: ld2410
moving_distance:
name: Moving Target Distance
still_distance:
name: Still Target Distance
moving_energy:
name: Moving Target Energy
still_energy:
name: Still Target Energy
detection_distance:
name: Detection Distance
This gives you five sensor entities and three binary sensors in Home Assistant. The has_target binary sensor is your primary presence indicator.
Step 3: Flash and Adopt
Click Install in ESPHome, choose your connection method (USB first time, OTA after that), and wait for the flash to complete. Home Assistant will automatically discover the device via the ESPHome integration. Accept the adoption prompt and your entities will appear.
Step 4: Tune Sensitivity Gates
The LD2410 divides its detection range into gates, each covering approximately 0.75 meters. Gate 0 is closest to the sensor, gate 8 is furthest. You can configure sensitivity per gate to reduce false positives from, for example, a fan or curtains moving in the background.
Add this to your ESPHome config to expose gate sensitivity as numbers you can adjust from the HA UI:
number:
- platform: ld2410
timeout:
name: Radar Timeout
max_move_distance_gate:
name: Max Move Distance Gate
max_still_distance_gate:
name: Max Still Distance Gate
g0_move_sensitivity:
name: Gate 0 Move Sensitivity
g0_still_sensitivity:
name: Gate 0 Still Sensitivity
# Continue g1 through g8 as needed
Start with default sensitivity (50 out of 100) and adjust up or down based on real-world testing in your room.
Step 5: Build a Presence Automation in Home Assistant
Here's a basic automation that keeps lights on while presence is detected and turns them off 2 minutes after the last detection:
alias: Office Lights Presence Control
description: mmWave-based presence automation
trigger:
- platform: state
entity_id: binary_sensor.office_presence_sensor_presence_detected
condition: []
action:
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.office_presence_sensor_presence_detected
state: "on"
sequence:
- service: light.turn_on
target:
area_id: office
- conditions:
- condition: state
entity_id: binary_sensor.office_presence_sensor_presence_detected
state: "off"
for:
minutes: 2
sequence:
- service: light.turn_off
target:
area_id: office
mode: restart
The 2-minute delay buffer prevents the lights from cutting out during brief sensor gaps. Adjust to taste.
Step-by-Step: Setting Up a Zigbee mmWave Sensor (ZY-M100)
If you'd rather skip the soldering, the Zigbee path is straightforward. Pair the ZY-M100 with your Zigbee coordinator using the standard pairing process (hold the reset button until the LED blinks rapidly). In Zigbee2MQTT, it will appear automatically and expose these entities to Home Assistant: occupancy (binary), illuminance_lux (sensor), and target_distance (sensor).
The ZY-M100 uses a 24 GHz radar module and has a configurable sensitivity and distance via Zigbee2MQTT's exposes interface. No custom firmware required. [LINK: zy-m100-zigbee-sensor]
Troubleshooting mmWave Presence Sensors in Home Assistant
Sensor reports presence when nobody is there
Lower the sensitivity on gates closest to objects that move, like HVAC vents, fans, or windows with curtains. On the LD2410, try reducing still_sensitivity on gate 0 and gate 1 to around 20-30. On Zigbee sensors, reduce the sensitivity setting via Zigbee2MQTT.
Sensor misses still occupancy
Make sure the sensor has line-of-sight to where you sit. The LD2410 has a roughly 60-degree cone. Mounting angle matters significantly. Tilting it slightly downward toward where people sit improves still detection. Also check that your detection distance gate covers the distance from sensor to chair.
ESPHome device goes offline frequently
This is almost always a power issue or a weak Wi-Fi signal at the sensor location. Try a different USB power supply with a higher current rating. If the device is far from your router, consider a Zigbee sensor instead or add a Wi-Fi access point closer to the room.
Distance values look wrong
The LD2410 reports distance in centimeters via UART. If values seem inconsistent, check your baud rate setting. The LD2410 default is 256000 baud, and mismatches here cause garbage data that ESPHome will partially parse incorrectly.
Why Software Developers Are Choosing mmWave Presence Detection
The appeal for developers is straightforward: mmWave sensors expose structured, continuous data rather than a simple motion boolean. The LD2410 reports moving energy, still energy, and distance at roughly 10 Hz. You can log this data, visualize it, and write automations that respond to where in a room someone is sitting, not just whether the room is occupied.
ESPHome makes this approachable because the configuration is declarative YAML. If you can read a REST API spec, you can read an ESPHome config. The HA entity model maps directly to the kind of state management developers already think about. It's a short conceptual bridge from writing software to writing firmware, especially with the LD2410 component handling all the serial protocol parsing for you.
Several developers have built multi-sensor room models that track occupancy zones independently, using two or three LD2450 sensors (the multi-target successor to the LD2410) to triangulate position in larger rooms. The LD2450 reports up to three simultaneous targets with x/y coordinates. That's the kind of data you can feed into a room presence model with real spatial awareness. [LINK: hlk-ld2450-multi-target-sensor]
FAQ
Does an mmWave presence sensor work through walls in Home Assistant?
mmWave sensors can partially penetrate thin drywall, which is usually a drawback, not a feature. A sensor mounted in a hallway may detect someone in an adjacent bedroom through a thin wall, causing false positives. Mount sensors with direct line-of-sight to the intended detection area and use sensitivity gate tuning to limit the effective range to the room you want to monitor.
Can I use an mmWave sensor without ESPHome in Home Assistant?
Yes. The Aqara FP2 integrates via the native Aqara integration with no ESPHome required. Zigbee-based mmWave sensors like the ZY-M100 work through Zigbee2MQTT or ZHA. ESPHome is only necessary if you're building your own sensor around a bare module like the HLK-LD2410 or if you want maximum control over sensor configuration and data output.
What is the best mmWave sensor for Home Assistant in 2026?
For most users, the Aqara FP2 offers the best balance of features and ease of setup, with multi-zone detection, native HA integration, and no custom firmware. For developers who want fine-grained control and lower cost, an ESP32 paired with the HLK-LD2410 running ESPHome is the most flexible option at around $10-$15 in parts. For Zigbee-first setups, the ZY-M100 is reliable and well-supported in Zigbee2MQTT.
How do I stop my mmWave sensor from triggering on pets?
Mount the sensor higher, typically 2 meters or above, and angle it to cover human-height presence. On the LD2410, reduce sensitivity on gate 0 (the closest detection zone) to limit detection near the floor. The Aqara FP2 has a pet immunity mode in its app. No mmWave sensor is completely pet-proof, but mounting height is the most effective physical mitigation.
Is mmWave radar safe for continuous home use?
Yes. The HLK-LD2410 transmits at 20 dBm (100 mW) at 24 GHz, which is in the same power class as a Wi-Fi router. The Aqara FP2 and similar consumer sensors operate at even lower power levels. Continuous operation at these power levels is within established safety limits and has no known health risks under normal use conditions.