How to set up presence detection with mmWave and PIR
Learn how to set up presence detection with mmwave and pir sensors in a local-first smart home using Home Assistant, with tips for HomeKit and Hubitat.
On this page
Presence detection is one of the most impactful upgrades you can make to a smart home. It lets you automate lighting, climate, and security based on whether a room is actually occupied. Combining mmWave and PIR sensors gives you reliable, low-latency detection that runs entirely on your local network. This guide walks through setting both up in Home Assistant, with notes for HomeKit and Hubitat users.
Why combine mmWave and PIR
The two sensor types are complementary, which is exactly why good presence sensors include both.
PIR (passive infrared) sensors detect the heat signature of a moving body. They are fast, cheap, and very low power, which makes them ideal for triggering lights on the instant someone enters. Their weakness is that they only see motion, so a still person eventually reads as “no one here,” and they can occasionally be fooled by warm air or sunlight.
mmWave (millimeter-wave radar) sensors emit radio waves and measure reflections, so they detect even tiny movements, including breathing. That means they keep a room marked “occupied” while you sit still on the couch or work at a desk. The trade-off is that they respond a touch slower and need careful tuning to avoid false triggers from fans or moving curtains.
The classic pattern: use PIR to turn lights on fast, and mmWave to keep them on (and turn them off only when the room is truly empty).
Choosing the right sensors
For a local-first setup, you want sensors that run locally and integrate cleanly with Home Assistant. If you’d rather compare a full field of options before deciding, see our best mmWave presence sensors for Home Assistant roundup and the broader best local presence sensors guide; the two picks below are simply the sensors this walkthrough uses.
- All-in-one (mmWave + PIR), Wi-Fi/ESPHome: The Everything Presence One combines an mmWave radar, an industrial PIR, plus light, temperature, and humidity sensors. It runs ESPHome over Wi-Fi, so it connects directly to Home Assistant with no hub or proprietary cloud. (Its newer sibling, the Everything Presence Lite, adds multi-target, multi-zone tracking if you need per-zone occupancy.)
- PIR over Zigbee: The Aqara Motion Sensor P1 is a low-power Zigbee PIR sensor. It pairs with any Zigbee coordinator and works well for fast on-triggers. (Note: the newer Aqara Motion Sensor P2 is Matter-over-Thread, not Zigbee.)
A note on protocols, because product marketing often muddies this: the Everything Presence One is a Wi-Fi/ESPHome device, not a Zigbee or Z-Wave device. The Aqara Motion Sensor P1 is Zigbee (its P2 sibling is Matter-over-Thread). And the Aqara Hub M3, if you use one, is a Zigbee + Thread + Matter hub. It does not support Z-Wave. If you want Z-Wave sensors, you need a Z-Wave controller (such as a Z-Wave USB stick), which is a separate radio entirely.
Setting up in Home Assistant
Step 1: Add the sensors
For the ESPHome-based Everything Presence One, flash/adopt it in the ESPHome dashboard, connect it to your Wi-Fi, and it appears in Home Assistant as a set of entities (mmWave occupancy, PIR motion, illuminance, temperature, humidity). No hub required.
For the Zigbee Aqara Motion Sensor P1, you need a Zigbee coordinator. A USB stick like the ConBee III works with ZHA, deCONZ, or Zigbee2MQTT. You don’t edit configuration.yaml for this; you set up the coordinator through the ZHA integration (or your chosen Zigbee stack) in the Home Assistant UI, then put it into pairing mode and press the sensor’s pairing button.
Step 2: Build a combined occupancy helper
The most reliable approach is to derive a single “occupied” state from both sensors. A simple template binary sensor reads occupied if either the PIR or the mmWave sensor is active:
template:
- binary_sensor:
- name: "Office Occupancy"
device_class: occupancy
state: >
{{ is_state('binary_sensor.office_pir', 'on')
or is_state('binary_sensor.office_mmwave', 'on') }}
delay_off:
minutes: 2
The delay_off adds a short grace period so the room doesn’t flip to “empty” the instant the radar drops out.
Step 3: Automate on the combined state
Now drive your lights from the combined occupancy sensor, not the raw PIR. Turn on the moment occupancy goes on, and off only after it has been off (for example, the helper above stays on for 2 minutes after last detection):
automation:
- alias: Office lights follow occupancy
triggers:
- trigger: state
entity_id: binary_sensor.office_occupancy
to: "on"
actions:
- action: light.turn_on
target:
entity_id: light.office
- alias: Office lights off when empty
triggers:
- trigger: state
entity_id: binary_sensor.office_occupancy
to: "off"
actions:
- action: light.turn_off
target:
entity_id: light.office
This gives you the fast on-response of PIR and the “stay on while I’m still” reliability of mmWave.
Step 4: Tune the radar
mmWave sensors usually expose distance and sensitivity settings. Reduce the maximum detection distance so the radar doesn’t see through a wall into the hallway, and dial back sensitivity if fans or curtains cause false occupancy. The Everything Presence One exposes these as adjustable entities in Home Assistant.
Cross-platform notes: HomeKit and Hubitat
For HomeKit, the cleanest path is to keep Home Assistant as your sensor hub and expose your combined occupancy sensor to Apple Home via Home Assistant’s built-in HomeKit Bridge integration. (Note: Home Assistant Green has no built-in radio and is not a HomeKit hub, so it can’t pair sensors or serve as an Apple Home hub on its own.)
For Hubitat, the Hubitat Elevation C-8 pairs Zigbee and Z-Wave sensors natively and is a flexible automation platform. ESPHome/Wi-Fi sensors like the Everything Presence One aren’t native to Hubitat, so most people keep those on Home Assistant and bridge states between the two if needed.
Quick verdict
For the best results with the least fuss, use a combined mmWave + PIR sensor like the Everything Presence One, which runs locally over ESPHome and exposes both sensor types plus environmental data. Merge PIR and mmWave into one occupancy helper, automate off that helper, and tune the radar’s range and sensitivity. The payoff is lighting that turns on instantly and never leaves you sitting in the dark, all running locally with no cloud.