Private Home Lab

Self-hosted · No cloud 

Aqara FP300 + Home Assistant: Local Setup via Zigbee2MQTT

Switch the Aqara FP300 from Thread to Zigbee, pair it in Zigbee2MQTT, and run it locally in Home Assistant with the full configuration entity set.

Aqara FP300 + Home Assistant: Local Setup via Zigbee2MQTT

The FP300 ships with Thread/Matter firmware out of the box. That’s Aqara’s bet on the future, but for a Home Assistant user running a local Zigbee network it means the sensor arrives in a mode that either needs an Apple Home hub or works only with Matter — and Thread support in HA is still maturing. The good news is the FP300 also supports Zigbee, the switch is a one-time operation via the Aqara app, and after that the sensor runs entirely locally through Zigbee2MQTT with no cloud dependency.

I ran our FP300 down the Zigbee path because I wanted the full configuration surface that only Z2M exposes. This guide covers why I picked Zigbee over Thread, how to do the protocol switch, pairing, the entity list you end up with, and the one calibration step (Spatial Learning) that most setup walkthroughs describe backwards.


What the FP300 is (and why the protocol choice matters)

The FP300 is Aqara’s second-generation millimetre-wave presence sensor. Where the FP2 is Wi-Fi only and uses HomeKit Controller as its local HA path, the FP300 is battery-powered and speaks either Thread or Zigbee depending on which firmware image is loaded. It combines a 60 GHz mmWave radar with a PIR sensor — the PIR fires fast on initial motion, the mmWave confirms stationary presence so lights don’t cut out while someone is reading.

A note on model numbers that confuses people: the same physical device shows up as PS-S04E when running Thread/Matter firmware and PS-S04D when running Zigbee firmware. The hardware is the same; the model identifier reflects which firmware mode is active. After the protocol switch, Z2M will identify the device as PS-S04D.

Detection range is 6 m with a 120° horizontal field of view. Aqara advertises up to three years battery life in Zigbee mode and two years in Thread mode.

The protocol choice isn’t cosmetic. In Thread/Matter mode, HA sees basic occupancy and environmental readings (temperature, humidity, illuminance). The roughly 35 additional configuration entities — sensitivity levels, detection range in quarter-metre increments, absence delay, interference identification, AI adaptive mode, Spatial Learning — are only accessible over Zigbee through Zigbee2MQTT. If you want to tune the sensor for your room rather than accept defaults, Zigbee is the path.

ZHA’s FP300 support is incomplete as of early 2026. Stock ZHA exposes temperature, humidity, and illuminance, but no occupancy or motion entity. A community-maintained custom quirk fills the gap for users committed to ZHA, with upstream work in progress. Zigbee2MQTT remains the path of least friction and the only one that exposes the full feature set today.


What you need

  • A Zigbee USB coordinator (not an Aqara hub — the FP300 pairs directly to the coordinator in Zigbee mode)
  • Zigbee2MQTT running and connected to that coordinator
  • The Aqara Home app on your phone (Android or iOS), used only for the one-time protocol switch
  • The FP300, with batteries installed

You do not need an Aqara hub M2, M3, or E1. You do not need an Aqara account for the pairing step itself — the Aqara app connects to the sensor over Bluetooth to perform the firmware switch, and that’s the extent of its involvement.


Step 1 — Switch from Thread to Zigbee via the Aqara app

Out of the box the FP300 runs Thread firmware. Zigbee2MQTT will not see it in this state — Thread devices don’t participate in a Zigbee mesh. You need to switch the firmware via the Aqara app before pairing.

  1. If the FP300 was previously added to the Aqara app, remove it first.
  2. Long-press the reset button on the sensor for 5 seconds. The LED should indicate it has entered pairing mode.
  3. Open the Aqara Home app, tap the plus icon to add a device, and let it scan via Bluetooth. The FP300 should appear.
  4. During the pairing flow, look for a “Switch Protocol” option and select Zigbee. The app connects over Bluetooth and pushes the Zigbee firmware to the sensor.
  5. The process takes a couple of minutes. Once done, the sensor reboots into Zigbee mode.

That’s the only time the Aqara app touches the sensor. From this point forward you manage everything through Zigbee2MQTT and Home Assistant.

What to do if a standard reset isn’t enough

If the sensor was previously enrolled in a Thread/Matter network (an Apple TV or HomePod as the Thread border router, for example), a 5-second hold of the reset button may not clear the previous pairing state. In that case, perform a full factory reset: press the reset button 10 times in quick succession. After that, the Aqara app should be able to see the sensor over Bluetooth again and offer the protocol switch.


Step 2 — Pair the FP300 in Zigbee2MQTT

With the sensor now running Zigbee firmware, pairing follows the standard Zigbee2MQTT flow.

  1. In the Zigbee2MQTT web interface, click Permit join (or Permit join (All) if you want to open the whole network).
  2. Hold the reset button on the FP300 for about 5 seconds until the LED blinks, indicating pairing mode.
  3. Zigbee2MQTT should pick it up within 30 to 60 seconds and identify it as PS-S04D.
  4. Rename it to something sensible in the Zigbee2MQTT dashboard. The friendly name becomes the entity base name in HA.

If the sensor doesn’t pair on the first attempt, check whether pairing mode timed out (the LED stops blinking). Repeat the 5-second hold to re-enter pairing mode. If pairing fails consistently, confirm you actually switched to Zigbee firmware. A Thread-firmware sensor will be invisible to Z2M.


Step 3 — What entities appear in Home Assistant

After a successful pair, Zigbee2MQTT exposes an unusually large entity list for a single sensor. Based on the current Z2M device documentation for PS-S04D, you’ll see around 37 features. The headline ones:

Presence and motion
binary_sensor.presence — the primary occupancy entity
binary_sensor.pir_detection — PIR-specific detection (useful for distinguishing fast motion from stationary presence)
presence_detection_options — exposes related configuration knobs

Environmental
sensor.temperature
sensor.humidity
sensor.illuminance (lux)

Configuration (select / number)
select.motion_sensitivity — low / medium / high
number.absence_delay_timer — how long the sensor waits after no detection before reporting absence
select.ai_sensitivity_adaptive — lets the sensor auto-tune based on observed conditions
select.ai_interference_source_selfidentification — flags radio interference from other sources
spatial_learning — manual calibration trigger (covered below)
pir_detection_interval — how often the PIR sensor wakes

Diagnostics and housekeeping
sensor.battery and sensor.voltage
sensor.power_outage_count
restart_device, identify

There are a handful more sampling and reporting parameters in the full list, mostly tuning knobs you’ll never touch. The core presence and configuration set is stable across recent Z2M releases.

One practical note on writes: the FP300 is a sleepy end device when idle. Configuration changes (adjusting sensitivity or absence delay from HA) propagate when the device wakes, which happens automatically when it detects motion. In an active room, changes go through within seconds. In an empty room you may need to wave at the sensor once.


Step 4 — Run Spatial Learning before trusting the sensor

This is the step most setup guides describe backwards, and it’s the main reason people report false-presence readings (“sensor says someone’s there, the room is empty for hours”).

Spatial Learning is the FP300’s AI room-mapping routine. It maps the static background of your room — furniture, walls, glass surfaces, reflective metal — so the radar can distinguish a genuine human return from clutter that’s always there. The whole point of the routine is that the room is empty while it runs.

To trigger it from Z2M:

  1. Open the FP300 in the Zigbee2MQTT dashboard.
  2. In the Exposes tab, find the spatial_learning entity (it’s a write-only action that takes the value Start Learning). Alternatively, publish {"spatial_learning": "Start Learning"} to the device’s set topic.
  3. Leave the room before triggering. The detection area must be free of moving people and pets while the routine runs.

The routine takes around 30 seconds. After it completes, absence detection accuracy improves noticeably, particularly for rooms with glass, mirrors, or large metal surfaces that confuse the radar.

Aqara’s docs say the device continues to adapt to environmental changes in real time once Spatial Learning has run, so you don’t need to repeat the routine routinely. Trigger it again if you rearrange furniture significantly, move the sensor, or notice the sensor stuck in “occupied” when the room is empty.


Configuring sensitivity and absence delay

These two settings do most of the practical tuning work after Spatial Learning is done.

Motion sensitivity — three levels: low, medium, high. Medium works for most rooms. Low is useful near a window with foliage outside (cuts false triggers from swaying plants visible through glass). High is useful in rooms where the occupant is very still (reading, sleeping).

Absence delay timer — how long the sensor waits before reporting absence after detecting no signal. A short delay (30 to 60 seconds) suits rooms where you want lights off quickly after you leave. A longer delay (5 to 10 minutes) suits bedrooms or offices where you don’t want lights switching off during a quiet moment. The default is conservative; I run 2 minutes for living spaces and 5 minutes for bedrooms.

AI sensitivity adaptive — when enabled, the sensor adjusts its own sensitivity over time based on observed patterns. Useful if you’re not sure what sensitivity setting fits your environment. Once you’ve settled on a manual calibration, turn it off so changes don’t drift on you.


OTA firmware updates (the manual workaround)

Zigbee2MQTT does not currently support OTA firmware updates for the FP300. The update mechanism Aqara uses for this sensor isn’t exposed through the Z2M OTA pathway.

The workaround is to use the Aqara app periodically to check for and apply updates. As of January 2026, firmware version 5841 was the current Zigbee build. The update process is one sensor at a time over Bluetooth, which is tedious if you have several, but it works.

To update:
1. Open the Aqara app and connect to the sensor over Bluetooth (no hub needed).
2. Navigate to the device settings and check for firmware updates.
3. Apply if available.

The sensor returns to its Zigbee network automatically after the update. You don’t need to re-pair it in Zigbee2MQTT.


Does the FP300 send data to the cloud?

Once the protocol switch is complete and the sensor is paired to your Zigbee2MQTT instance, the FP300 sends all data locally — to your coordinator, to Z2M, to Home Assistant. There is no cloud dependency at runtime.

The one exception is the initial firmware switch step. The Aqara app connects to the sensor over Bluetooth for that operation; it doesn’t require cloud sign-in and doesn’t enrol the device in Aqara’s cloud services, but the app itself may phone home in the background depending on your version. If that concerns you, run the app on a phone without a SIM and on a guest Wi-Fi network you’re comfortable with. After the switch, the Aqara app has no further role with the sensor.

Firmware updates via the Aqara app similarly require the app to contact Aqara’s update servers to check for and pull the firmware binary. Block the app from the internet at all other times if you prefer — the app has no runtime access to the sensor data once it’s on your Zigbee network.

For a broader look at what Aqara’s cloud dependencies look like across different integration paths, the FP2 local setup writeup covers the Wi-Fi-based HomeKit Controller route and its cloud posture in detail.


Automations to try first

A few patterns that use what the FP300 exposes well:

Presence-based lighting with stationary person protection

alias: "Living room lights — presence with stationary hold"
trigger:
  - platform: state
    entity_id: binary_sensor.fp300_presence
    to: "on"
action:
  - service: light.turn_on
    target:
      entity_id: light.living_room
mode: single

Add a companion automation that turns lights off when presence is off. The sensor already waits for the configured absence_delay_timer before reporting off, so a straight state-on-to-off pair is clean — no need for a separate for: duration on the HA side.

Lux-gated lighting

alias: "Living room lights — presence and dim"
trigger:
  - platform: state
    entity_id: binary_sensor.fp300_presence
    to: "on"
condition:
  - condition: numeric_state
    entity_id: sensor.fp300_illuminance
    below: 50
action:
  - service: light.turn_on
    target:
      entity_id: light.living_room
mode: single

This only triggers when the room is dark, so lights don’t fire in daytime when someone walks through. The FP300’s onboard lux reading is convenient because it’s the same sensor that’s tracking presence — no second device needed.

Sensitivity toggle for nighttime

If you use the FP300 in a bedroom, a low-sensitivity sleep profile avoids the sensor going absent during genuinely still sleep. An automation that sets select.motion_sensitivity to low at bedtime and back to medium in the morning works cleanly over Z2M.


FAQ

Does the Aqara FP300 work with Home Assistant without an Aqara hub?

Yes. The FP300 pairs directly to a Zigbee USB coordinator (Sonoff ZBDongle-E, SkyConnect, or similar). You never need an Aqara hub M2, M3, or E1. The only Aqara software involved is the Aqara Home app for the one-time protocol switch from Thread to Zigbee.

How do I switch the Aqara FP300 from Thread to Zigbee?

Remove the device from the Aqara app if it was previously added, long-press the reset button for 5 seconds, then add the device again in the Aqara Home app over Bluetooth. During the pairing flow, choose Switch Protocol and select Zigbee. The app pushes the Zigbee firmware to the sensor. No Aqara account or hub is required.

Does the Aqara FP300 require the cloud after initial setup?

No. Once paired to Zigbee2MQTT, all sensor data and configuration changes go through your local network. The Aqara cloud is involved only for the initial protocol switch and for optional OTA firmware updates.

Why is my Aqara FP300 not detected in Home Assistant?

The most likely cause is that the sensor is still running Thread firmware rather than Zigbee. Z2M cannot see Thread devices. Perform the protocol switch via the Aqara app first, then attempt to pair. If you’ve already switched but pairing still fails, try a full factory reset (10 presses of the reset button) and re-switch.

What is the difference between ZHA and Zigbee2MQTT support for the FP300?

ZHA’s FP300 support is incomplete as of early 2026 — stock ZHA exposes temperature, humidity, and illuminance, but no occupancy or motion entity. A community-maintained custom quirk fills the gap for users committed to ZHA. Zigbee2MQTT exposes the full feature set, including Spatial Learning and the AI sensitivity controls, with no extra configuration. For a working local setup today, Z2M is the path I’d pick. If you’d rather build a coordinator-only setup from scratch first, our Aqara without an Aqara hub guide covers the dongle picks and Z2M baseline. If you want a smaller, simpler PIR-only alternative, the high-precision motion sensor RTCGQ13LM is a useful comparison point.


The FP300 is one of the more capable sensors in the Zigbee space once you get past the protocol switch. The Thread-versus-Zigbee decision isn’t permanent — you could switch back — but Zigbee gives you the full configuration surface and a proven local integration with no cloud strings attached after setup. The Spatial Learning step is the one most people get wrong; do it once, with the room empty, and you’ll spend less time troubleshooting ghost presence than the calibration would have taken.

.
On this page
.

Read Next

If you found this useful, try these.