Python package that fuses 2D millimetre-wave observations into room-frame tracks, zone events, and trajectory scores. Those events are the highest-weight tag used to review security video. It does not import Home Assistant or tracecue-engine.
mmwave-fusion is the Home Assistant shell. A future desktop or Docker shell can import this same package.
pip install mmwave-engineFeed a versioned target frame, not a brand protocol and not a presence bit:
{"v":1,"f":42,"ts":1234,"t":[[120.0,340.0,-8]]}x and y are centimetres in the radar's local frame. observations_from_frame applies the shared yaw/pitch/roll convention. 1D radars have nothing to fuse. Do not pass them in. Do not pass NVR intrusion or line-crossing events into FusionEngine.step() either.
Video is a VideoSink: snapshot and record of a live stream. This package does not seek an NVR timeline.
Releases go to PyPI from a GitHub Release via trusted publishing. Tag vX.Y.Z must match mmwave_engine.__version__. Home Assistant installs the pin in mmwave-fusion's manifest.json. Do not point that pin at a version that is not on PyPI yet.
| If you want | Read |
|---|---|
| What must not enter the tracker | AGENTS.md |
| Home Assistant shell, entities, retention | mmwave-fusion |
| Firmware that emits the v1 frame | mmwave-component |
| The only UI | mmwave-card |
| Why this tag outranks an NVR label | ADR-0009 |
| Module | Role |
|---|---|
fusion.py |
Transform, clustering, association, tracking |
frames.py / radar.py |
v1 frame decode and room-frame observations |
events.py |
Zone enter / exit / dwell |
quality.py |
Score a finished track |
recording.py |
Which events keep a still and a clip |
storage.py |
SQLite history |
video.py |
Sink protocol only |
The coordinate convention matches mmwave-component and mmwave-card. Change it in all three together.
1D radars cannot use this package or mmwave-fusion. They report distance without direction. 2D radars can use every feature, including this tracker. R60ABD1 also reports height; it is listed with the 2D models because it can be fused.
Figures and progress match mmwave-component. — means the manual does not state it. A cell marked accuracy is not a range-gate width. LD2410 at 0.20 m resolution reaches 1.6 m. LD2451 reports whole metres. LD2450 and LD2454 publish resolution in each target frame. LD2454's performance table says 8 m; the install section says 6 m tracking.
| Model | Detection distance | Distance resolution | Progress |
|---|---|---|---|
| LD2410 | 6 m | 0.75 m / 0.20 m | Developing |
| LD2410B | 6 m | 0.75 m (protocol can also select 0.20 m) | Testing |
| LD2410C | 6 m | 0.75 m (protocol can also select 0.20 m) | Testing |
| LD2411 | 2 m (gesture 1 m) | — | Developing |
| LD2411S | 6 m (micro-motion 3.5 m) | ±5 cm / ±5% (accuracy) | Developing |
| LD2412 | 9 m | 0.75 m | Developing |
| LD2420 | 8 m (micro-motion 6 m) | 0.70 m | Developing |
| LD2450A | 2 m | 0.2 m (sensing accuracy) | Developing |
| LD6002 | 1.5 m (breath / heart) | — | Developing |
| RD-03E | 6 m (micro-motion 3.5 m) | ±5 cm / ±5% (accuracy) | Developing |
| Model | Detection distance | Angle | Distance resolution | Progress |
|---|---|---|---|---|
| LD2450 | 6 m | azimuth ±60°, elevation ±35° | per frame | Developing |
| LD2451 | 100 m | horizontal ±15°, vertical ±7° | 1 m | Testing |
| LD2452 | 6 m | azimuth ±60°, elevation ±30° | 0.72 m | Testing |
| LD2453 | 6 m | azimuth ±40°, elevation ±30° | 0.72 m | Developing |
| LD2454 | 8 m | azimuth ±60°, elevation ±30° | per frame | Testing |
| R60ABD1 | 2.5 m (breath / heart 1.5 m) | ±20° | — | Completed |