RD-03D ESP32 Multi-Target mmWave Home Assistant

The Ai-Thinker RD-03D is a 24 GHz FMCW mmWave radar designed for multi-target trajectory tracking. Connected to an ESP32, ESPHome can report up to three targets simultaneously, including each target’s X/Y position, distance, speed and angle, then expose everything directly to Home Assistant. The current RD-03D V2 is specified for up to 8 m detection range, approximately ±60° horizontal coverage, and communicates over UART at 256000 baud. Unlike presence-focused sensors such as the LD2410, the RD-03D is primarily intended to track moving targets, so it should not be chosen when reliable detection of a completely motionless person is the main requirement.

What is the RD-03D?

The RD-03D is a multi-target mmWave radar module from Ai-Thinker.

The current RD-03D V2 combines:

  • 24 GHz FMCW radar
  • ICL1122 radar SoC
  • 1 transmitter and 2 receiver antennas
  • onboard signal-processing firmware
  • UART communication
  • multi-target trajectory tracking

Ai-Thinker describes it as a positioning and tracking radar for indoor applications such as smart homes, offices, hotels, lighting, security and proximity-triggered equipment.

The important difference from a conventional mmWave presence sensor is that RD-03D does not simply answer:

“Is someone in the room?”

It can instead provide information more like:

Target 1
X = -850 mm
Y = 3250 mm
Speed = -210 mm/s

Target 2
X = 1400 mm
Y = 4700 mm
Speed = 120 mm/s

That gives an ESP32 enough information to determine where people are moving inside a room, rather than simply reporting occupancy. ESPHome currently supports up to three simultaneous targets.

Why use RD-03D with Home Assistant?

Basic Home Assistant presence sensors normally provide one binary state:

Occupied
Not occupied

RD-03D can provide considerably more information:

  • Any target detected
  • Number of detected targets
  • Target 1 presence
  • Target 2 presence
  • Target 3 presence
  • X position
  • Y position
  • Distance
  • Angle
  • Speed
  • Detection resolution

ESPHome added native RD-03D support in its January 2026 release, so a custom ESPHome component is no longer required.

This opens up automations such as:

Someone enters desk zone
→ Turn on desk lighting

Someone approaches TV area
→ Activate living-room scene

Two or more people detected
→ Increase ventilation

Person walks toward doorway
→ Prepare hallway lighting

The X/Y coordinates are particularly useful because Home Assistant logic can convert parts of a room into virtual zones.

RD-03D V2 specifications

Ai-Thinker’s current V2 documentation specifies the following hardware characteristics:

FeatureRD-03D V2
Radar technology24 GHz FMCW
Radar chipICL1122
Antenna1T2R
Maximum tracking distanceUp to 8 m
Horizontal coverageApproximately ±60°
Vertical coverageApproximately ±30°
InterfaceUART
UART speed256000 baud
Supply5 V
Recommended supply capability≥200 mA
Typical operating current~92 mA
Module size15 × 44 × 5 mm
Targets reported by ESPHomeUp to 3

Ai-Thinker notes that the 8 m figure comes from open-field measurements and that walls, ceilings, large objects and installation position can affect practical range.

Important: RD-03D is not the same as RD-03

The names are easy to confuse.

RD-03 / RD-03 V2

is primarily a human presence sensor.

RD-03D / RD-03D V2

is designed for multi-target trajectory tracking.

Ai-Thinker’s current product family explicitly separates the RD-03 V2, which targets moving, micro-moving and stationary human presence detection, from the RD-03D V2, which focuses on detecting and tracking multiple targets.

Make sure the module being purchased actually says:

RD-03D

and not simply:

RD-03

if multi-target X/Y tracking is required.

RD-03D and stationary people

This is probably the most important limitation to understand before buying one.

ESPHome describes the RD-03D as an FMCW radar that depends on Doppler shift for its target-tracking data and warns that it cannot reliably detect or range objects that are not moving.

That means RD-03D is excellent for:

  • walking people
  • tracking movement around a room
  • identifying which area someone enters
  • detecting direction of travel
  • multi-person movement

But it is not the ideal choice for:

  • detecting someone sleeping
  • maintaining occupancy while someone sits completely still
  • bathroom presence where movement may be minimal
  • desk occupancy based entirely on micro-motion

For those applications, sensors such as the LD2410 or LD2420 are usually a better fit.

Think of the difference like this:

LD2410 / LD2420
"Is somebody still here?"

RD-03D
"Where are the moving targets?"

Wiring RD-03D V2 to ESP32

The current RD-03D V2 uses four connections:

RD-03DFunction
5VPower
GNDGround
TXUART output
RXUART input

Ai-Thinker specifies a 5 V supply and recommends a source capable of at least 200 mA. The UART I/O itself is specified as 3.3 V logic, which makes it suitable for direct communication with ESP32 GPIOs.

For a classic ESP32 DevKit, a convenient connection is:

RD-03DESP32
5V5V / VIN
GNDGND
TXGPIO16
RXGPIO17

Remember that UART connections cross:

RD-03D TX → ESP32 RX

RD-03D RX ← ESP32 TX

GPIO16 and GPIO17 are simply convenient choices on a classic ESP32. Other suitable hardware-UART-capable pins can be used on C3, C6, S2 or S3 boards.

Do you need both TX and RX?

Not always.

If the ESP32 only needs to receive target data, the radar’s TX connection to the ESP32’s RX pin is the important one.

ESPHome states that an ESP32 TX pin is required when using the tracking_mode option because ESPHome must send configuration commands back to the radar.

For the most flexible installation, connect both:

RD-03D TX → ESP32 RX
RD-03D RX ← ESP32 TX

Basic ESPHome UART configuration

RD-03D uses:

256000 baud
8 data bits
No parity
1 stop bit

ESPHome strongly recommends using a hardware UART because 256000 baud is relatively fast.

A classic ESP32 example is:

uart:
  id: uart_rd03d
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 256000
  parity: NONE
  stop_bits: 1

Then create the radar component:

rd03d:
  id: rd03d_radar
  uart_id: uart_rd03d
  tracking_mode: multi
  throttle: 500ms

tracking_mode: multi tells the radar to operate in multi-target mode.

ESPHome also supports:

tracking_mode: single

for single-target operation.

Why use throttle?

The RD-03D sends tracking data very frequently.

Publishing every radar frame to Home Assistant can create a large number of entity updates without providing much practical benefit.

ESPHome therefore provides:

throttle: 500ms

or:

throttle: 1s

to limit how often new values are published.

For most Home Assistant dashboards:

500 ms to 1 second

is plenty fast.

For debugging trajectory movement, a shorter interval can be useful.

Add overall presence to Home Assistant

The simplest RD-03D entity is:

binary_sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target:
      name: "Radar Presence"

This becomes ON whenever the radar reports at least one target.

Home Assistant can then use it like a conventional occupancy sensor.

Add individual target presence

ESPHome can also expose each tracked target separately:

binary_sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target:
      name: "Radar Presence"

    target_1:
      name: "Target 1 Presence"

    target_2:
      name: "Target 2 Presence"

    target_3:
      name: "Target 3 Presence"

Up to three targets can be reported simultaneously.

Add target count

A useful Home Assistant entity is simply:

0
1
2
3

representing the number of detected targets.

ESPHome configuration:

sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target_count:
      name: "Radar Target Count"

This can drive automations such as:

Target count = 0
→ Room empty

Target count = 1
→ Normal ventilation

Target count >= 2
→ Increase ventilation

ESPHome exposes target count as a value from 0 to 3.

X and Y coordinates explained

RD-03D reports every target using X/Y coordinates.

ESPHome defines:

X

Horizontal position relative to the radar.

Negative X = left of radar
Positive X = right of radar

Y

Distance forward from the radar.

Larger Y = farther into the room

Both are reported in millimetres.

Imagine a room like this:

           Y+
            ↑

     Target     Target
       ●           ●

            ROOM

X-  ←     RD-03D      → X+

This coordinate system is what makes software-defined room zones possible.

Add Target 1 position

sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target_1:
      x:
        name: "Target 1 X"

      y:
        name: "Target 1 Y"

      distance:
        name: "Target 1 Distance"

      angle:
        name: "Target 1 Angle"

      speed:
        name: "Target 1 Speed"

      resolution:
        name: "Target 1 Resolution"

ESPHome can provide all six values for each target.

Track all three targets

A full three-target configuration looks like:

sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target_count:
      name: "Target Count"

    target_1:
      x:
        name: "Target 1 X"
      y:
        name: "Target 1 Y"
      speed:
        name: "Target 1 Speed"
      angle:
        name: "Target 1 Angle"
      distance:
        name: "Target 1 Distance"

    target_2:
      x:
        name: "Target 2 X"
      y:
        name: "Target 2 Y"
      speed:
        name: "Target 2 Speed"
      angle:
        name: "Target 2 Angle"
      distance:
        name: "Target 2 Distance"

    target_3:
      x:
        name: "Target 3 X"
      y:
        name: "Target 3 Y"
      speed:
        name: "Target 3 Speed"
      angle:
        name: "Target 3 Angle"
      distance:
        name: "Target 3 Distance"

ESPHome calculates the distance and angle from the reported trajectory information and publishes them as normal sensor entities.

Speed direction explained

ESPHome reports target speed in millimetres per second.

The sign tells the direction of movement:

Positive speed
→ target moving away from radar

Negative speed
→ target approaching radar

This makes some interesting automations possible.

For example:

Target close to doorway
AND speed is negative
→ person entering room

versus:

Target close to doorway
AND speed is positive
→ person leaving room

This requires some experimentation because target IDs may change as people enter, leave or cross paths.

Angle explained

ESPHome defines the radar’s forward direction as .

Targets on one side return negative angles and targets on the other side positive angles.

The current RD-03D V2 hardware specification gives an approximate physical azimuth detection range of:

±60°

with approximately:

±30° vertical/elevation coverage.

Actual useful coverage depends heavily on installation and the target environment.

Complete ESPHome example

A useful starting configuration is:

esphome:
  name: rd03d-radar
  friendly_name: RD-03D Radar

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:

ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

uart:
  id: uart_rd03d
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 256000
  parity: NONE
  stop_bits: 1

rd03d:
  id: rd03d_radar
  uart_id: uart_rd03d
  tracking_mode: multi
  throttle: 500ms

binary_sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target:
      name: "Radar Presence"

    target_1:
      name: "Target 1 Presence"

    target_2:
      name: "Target 2 Presence"

    target_3:
      name: "Target 3 Presence"

sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target_count:
      name: "Target Count"

    target_1:
      x:
        name: "Target 1 X"
      y:
        name: "Target 1 Y"
      speed:
        name: "Target 1 Speed"
      angle:
        name: "Target 1 Angle"
      distance:
        name: "Target 1 Distance"

    target_2:
      x:
        name: "Target 2 X"
      y:
        name: "Target 2 Y"
      speed:
        name: "Target 2 Speed"
      angle:
        name: "Target 2 Angle"
      distance:
        name: "Target 2 Distance"

    target_3:
      x:
        name: "Target 3 X"
      y:
        name: "Target 3 Y"
      speed:
        name: "Target 3 Speed"
      angle:
        name: "Target 3 Angle"
      distance:
        name: "Target 3 Distance"

This uses the currently documented ESPHome rd03d component and exposes the most useful radar data to Home Assistant.

Creating room zones

The real advantage of RD-03D appears when the X/Y coordinates are converted into virtual zones.

Imagine this room:

┌──────────────────────────────────┐
│                                  │
│      DESK            SOFA        │
│                                  │
│                                  │
│            WALKWAY               │
│                                  │
│             RD-03D               │
└──────────────────────────────────┘

Example coordinates might be:

Desk Zone

X = -2500 to -500 mm
Y = 1500 to 4000 mm

and:

Sofa Zone

X = 500 to 2800 mm
Y = 1800 to 4500 mm

The ESP32 can then determine whether one of the reported targets lies within those boundaries.

This allows one physical radar sensor to act like several virtual occupancy sensors.

A simple ESPHome zone example

First give the target coordinates IDs:

sensor:
  - platform: rd03d
    rd03d_id: rd03d_radar

    target_1:
      x:
        name: "Target 1 X"
        id: target1_x

      y:
        name: "Target 1 Y"
        id: target1_y

Then create a template binary sensor:

binary_sensor:
  - platform: template
    name: "Desk Zone"
    lambda: |-
      if (id(target1_x).state > -2500 &&
          id(target1_x).state < -500 &&
          id(target1_y).state > 1500 &&
          id(target1_y).state < 4000) {
        return true;
      }
      return false;

This particular example only watches Target 1.

A real multi-target zone should test all three targets so that any tracked person can activate the zone.

Multi-target zones need a little care

Target numbers should not be treated like permanent identities.

“Target 1” does not necessarily mean the same person forever.

When:

  • people cross paths
  • someone leaves the detection field
  • a new target appears

the radar can reorganise which trajectory is represented as Target 1, 2 or 3.

So Home Assistant logic should normally ask:

“Is any target inside this zone?”

rather than:

“Is Target 1 Bob?”

RD-03D is a tracker, not a biometric identity system.

Best mounting position

Ai-Thinker recommends installing the radar so that:

  • the antenna faces the area being monitored
  • there are no obstructions directly in front of the antenna
  • the module is mounted firmly
  • the sensor itself does not vibrate
  • large moving objects are not directly behind it
  • nearby metal does not obstruct the antenna

The documentation also warns that radar can detect movement behind the module due to the rear antenna lobe; a metal backplate can help suppress unwanted rear detection.

A wall-mounted installation facing into the room is usually the easiest starting point.

Avoid fans and moving curtains

Typical sources of false tracking include:

  • ceiling fans
  • desk fans
  • curtains moving in airflow
  • large plants moving near vents
  • pets
  • vibrating objects
  • machinery

Ai-Thinker specifically lists moving curtains, plants in airflow, fans and strong reflectors as environmental factors that can affect detection.

This matters more for a trajectory tracker than for a simple PIR because the radar may attempt to interpret moving reflections as targets.

Avoid pointing multiple 24 GHz radars at each other

Ai-Thinker recommends avoiding direct alignment between several nearby 24 GHz radar modules and keeping them separated where possible to reduce potential mutual interference.

If several radars are required in the same room:

  • avoid aiming them directly at one another
  • separate them physically
  • use only as much coverage as actually required

Power supply matters

RD-03D V2 is designed for a 5 V supply.

Ai-Thinker specifies approximately 92 mA typical operating current and recommends a supply capable of more than 200 mA peak current. It also recommends keeping supply ripple below approximately 100 mV.

The ESP32’s 5 V/VIN rail can often supply the radar when the entire board is USB powered, provided the development board and USB supply have enough capacity.

For unreliable installations, use a proper regulated 5 V supply and connect:

Power supply GND
ESP32 GND
RD-03D GND

together.

UART data is 3.3 V logic

Although the radar is powered from 5 V, Ai-Thinker documents the RD-03D V2 I/O as 3.3 V logic.

That distinction is important:

Power = 5 V

UART logic = 3.3 V

So do not interpret the 5 V supply requirement as meaning the ESP32 RX pin should receive a 5 V UART signal.

RD-03D not detected by ESPHome

Check the basics first:

Radar TX → ESP32 RX
Radar RX → ESP32 TX
GND      → GND

Then confirm:

baud_rate: 256000
parity: NONE
stop_bits: 1

ESPHome strongly recommends a hardware UART for this data rate.

Also check that the ESP32 GPIOs selected are not being used by another peripheral.

No target data but radar has power

Possible causes include:

  • TX/RX reversed
  • wrong UART pins
  • wrong baud rate
  • no common ground
  • poor 5 V power supply
  • wrong module variant
  • radar facing away from the target area

If the physical module is an RD-03 rather than RD-03D, the protocol and intended functionality are different.

Target jumps around

Some movement in reported coordinates is normal.

Radar measurements are affected by:

  • body shape
  • orientation
  • reflections
  • walls
  • furniture
  • multipath propagation

Ai-Thinker notes that ranging accuracy varies with target characteristics and installation environment.

Avoid designing zones with boundaries only a few millimetres wide.

Give each zone a reasonable margin.

For example, instead of:

X = 1000 to 1100 mm

use a substantially larger region appropriate to the physical space.

Person disappears when sitting still

This is the expected limitation to remember.

ESPHome describes RD-03D as a Doppler-dependent tracker and warns that a completely non-moving target cannot reliably be detected or ranged.

If this behaviour is unacceptable, consider:

  • LD2410 for strong stationary presence
  • LD2420 for configurable gate-based presence
  • combining RD-03D with another occupancy sensor

A particularly powerful setup is:

LD2410
→ Is someone still in the room?

RD-03D
→ Where are the moving people?

The two sensors solve different problems.

Best Home Assistant use cases

Living room zones

Probably the strongest application.

Use one radar to distinguish movement around:

  • sofa
  • dining table
  • doorway
  • TV area

Large office

Track movement between:

  • desk
  • door
  • meeting space
  • storage area

Hallway direction detection

Speed and position can help distinguish movement toward or away from a doorway.

Smart lighting

Turn on only the lights corresponding to the area currently being approached or occupied by a moving target.

People counting

The radar’s target count can provide a rough instantaneous count of up to three active targets. It should not be treated as a guaranteed entrance/exit people-counter without additional logic because trajectories and target IDs can change.

RD-03D vs LD2450

These are the closest competitors conceptually.

Both are:

  • 24 GHz FMCW radar
  • multi-target trackers
  • capable of X/Y position reporting
  • designed for indoor trajectory tracking
  • supported by ESPHome

RD-03D V2 is specified by Ai-Thinker for up to 8 m open-field detection range, while the RD-03D ESPHome integration exposes up to three targets with position, speed, distance and angle.

The LD2450 has a larger existing Home Assistant community and is still an excellent choice.

RD-03D is particularly interesting for anyone wanting to experiment with a newer multi-target alternative and longer stated tracking range.

RD-03D vs LD2410

The choice is much easier.

Choose LD2410 when the objective is:

Reliable room presence
including people sitting still

Choose RD-03D when the objective is:

Position and trajectory
of moving people

Trying to use the RD-03D purely as an LD2410 replacement misses its main strength.

Final recommendation

The RD-03D + ESP32 + ESPHome combination is one of the more interesting Home Assistant radar projects because it provides much more than a basic motion sensor.

ESPHome can expose:

  • overall presence
  • individual target presence
  • target count
  • X position
  • Y position
  • distance
  • angle
  • speed
  • detection resolution

for up to three moving targets.

For a first installation:

  • power the radar from a stable 5 V supply
  • share ground with the ESP32
  • use hardware UART at 256000 baud
  • connect both TX and RX
  • start with tracking_mode: multi
  • throttle Home Assistant updates to 500 ms or 1 second
  • mount the radar firmly facing the room
  • keep fans and moving curtains out of its field of view
  • create broad X/Y zones before trying very precise boundaries

Most importantly:

Buy RD-03D for tracking, not simply for stationary presence.

For zones, trajectory and multi-person movement, it is an extremely capable module.

For detecting a person who may remain completely motionless for long periods, combine it with a presence-oriented radar or choose an LD2410/LD2420 instead.

Share your love