Live 2D presence tracking and zone configuration for Inovelli mmWave Smart Switches in Home Assistant.
| Live Radar Tracking | Zone Editor |
|---|---|
![]() |
![]() |
Decodes Zigbee2MQTT payloads to visualize real-time MQTT data and configure detection, interference, and stay zones via MQTT commands. The radar overlay reflects the sensors actual field of view (120°–150°) with range arcs at 1m intervals up to 6m.
ZHA support has just been added experimentally. Requires a custom Quark that I have built to be installed in ZHA. ZHA DOC HERE
- Live 2D Radar Tracking — See up to 3 simultaneous targets moving in real-time with historical comet tails and an accurate FOV overlay.
- Dynamic Zone Configuration — Visually draw and edit detection room limits (Width, Depth, and Height) directly on the radar map.
- Interference Management — View, Auto-Config, and Clear interference zones to filter out fans, vents, and curtains.
- Multi-Zone Support — Configure up to 4 areas per zone type (Detection, Interference, Stay).
- Live Sensor Data — Streams Occupancy and Illuminance states in real-time via MQTT.
- Connection Status — Live indicators for WebSocket and MQTT broker connectivity with automatic reconnection.
Two install paths are supported from the same codebase:
- Home Assistant Addon — Recommended if you run Home Assistant. Integrates with the Supervisor, uses ingress, and picks up the
SUPERVISOR_TOKENautomatically for ZHA mode. - Standalone Docker — For users running Zigbee2MQTT in Docker or on a separate machine from Home Assistant.
Click the button below to add this repository to your Home Assistant instance:
- Navigate to Settings → Add-ons in your Home Assistant dashboard.
- Click the Add-on Store button (bottom right).
- Click the three dots (⋮) in the top right and select Repositories.
- Paste this URL and click Add:
https://github.com/nickduvall921/mmwave_vis - Close the dialog. Inovelli mmWave Visualizer will appear at the bottom of the Add-on Store.
A pre-built multi-arch image (linux/amd64, linux/arm64) is published to GitHub Container Registry on every release:
ghcr.io/nickduvall921/mmwave_vis:latest
services:
mmwave-visualizer:
image: ghcr.io/nickduvall921/mmwave_vis:latest
container_name: mmwave_vis
ports:
- "5000:5000"
volumes:
- ./mmwave_data:/data
environment:
- ZIGBEE_STACK=z2m
- MQTT_BROKER=192.168.1.XX # Change to your broker IP
- MQTT_PORT=1883
- MQTT_USERNAME= # Optional
- MQTT_PASSWORD= # Optional
- MQTT_BASE_TOPIC=zigbee2mqtt
restart: unless-stoppeddocker compose up -dNavigate to http://<your-ip>:5000.
| Variable | Description | Default |
|---|---|---|
ZIGBEE_STACK |
z2m or zha |
z2m |
MQTT_BROKER |
MQTT broker host | core-mosquitto |
MQTT_PORT |
MQTT broker port | 1883 |
MQTT_USERNAME |
MQTT username | "" |
MQTT_PASSWORD |
MQTT password | "" |
MQTT_BASE_TOPIC |
Zigbee2MQTT base topic (also accepts Z2M_BASE_TOPIC) |
zigbee2mqtt |
MQTT_USE_TLS |
Enable TLS/SSL | false |
MQTT_TLS_INSECURE |
Skip cert verification (not recommended) | false |
MQTT_TLS_CA_CERT |
Path to custom CA certificate file | "" |
HA_URL |
Home Assistant URL (ZHA mode only) | http://supervisor |
HA_TOKEN |
Long-lived access token (ZHA mode only) | "" |
DEBUG |
Verbose logging | false |
To connect to a TLS-enabled broker (e.g. on port 8883):
environment:
- MQTT_BROKER=your-broker
- MQTT_PORT=8883
- MQTT_USE_TLS=trueFor self-signed certificates, mount your CA cert and reference it:
volumes:
- ./mmwave_data:/data
- ./ca.crt:/data/ca.crt
environment:
- MQTT_USE_TLS=true
- MQTT_TLS_CA_CERT=/data/ca.crt
⚠️ MQTT_TLS_INSECURE=truedisables all certificate verification. Only use this on trusted local networks — it defeats the purpose of TLS.
Migrating from
mmWave_vis_docker? The image path has changed fromghcr.io/nickduvall921/mmwave_vis_docker:maintoghcr.io/nickduvall921/mmwave_vis:latest. The legacyZ2M_BASE_TOPICenv var is still accepted as a fallback, butMQTT_BASE_TOPICis preferred.
Before starting the add-on, go to the Configuration tab and connect it to your MQTT broker.
| Option | Description | Default |
|---|---|---|
mqtt_broker |
Hostname of your MQTT Broker | core-mosquitto |
mqtt_port |
Broker port | 1883 |
mqtt_username |
MQTT username (if applicable) | "" |
mqtt_password |
MQTT password (if applicable) | "" |
mqtt_base_topic |
Base topic for Zigbee2MQTT | zigbee2mqtt |
Note: If you use the standard Home Assistant Mosquitto broker add-on, the defaults should work out of the box.
- Go to your switch's device page in Zigbee2MQTT → Bind tab.
- In the Clusters dropdown, add
manuSpecificInovelliMMWave. - Click Bind. You should see a green "Bind Success" message.
- Go to the Exposes tab and enable MmWaveTargetInfoReport.
Note: Disable Target Info Reporting when not actively using the visualizer, as it generates significant Zigbee network traffic when targets are detected. The visualizer will show a banner reminder if reporting is disabled.
-
Select a Switch — Use the dropdown at the top to select your device. It may take a moment to populate as it waits for an MQTT message.
-
View Live Tracking — The radar map shows real-time target positions within the sensor's field of view. The solid cone represents the rated 120° FOV, and the dashed cone shows the extended ~150° range observed in practice.
-
Edit Zones:
- Open the Zone Editor in the sidebar.
- Select a Target Zone (e.g., "Detection Area 1").
- Click Draw / Edit.
- Drag the zone on the map or type exact coordinates (including Height/Z-axis) in the sidebar.
- Click Apply Changes to save to the switch.
- Click Force Sync to reload the state from the switch and verify.
-
Auto-Config Interference: Clear the room, turn on the moving object (fan, vent, etc.), and click Auto-Config Interference. A red exclusion zone should appear.
Detection Area (Blue/Green) — The active boundary of the sensor. Only motion inside this box is tracked. Anything outside is ignored.
Interference Area (Red) — An exclusion zone. Motion detected inside is discarded. Used to mask constant motion sources like ceiling fans or curtains.
Stay Area (Orange) — A high-sensitivity zone for stationary presence. Intended for areas where people sit or lie down (sofa, bed, desk) to keep lights on during minimal movement.
-
Radar persistence: The switch does not send an "all clear" when there is no motion. The last tracked target stays on the radar indefinitely after it leaves. Refer to the Occupancy status or packet age to determine if the area is clear.
-
Network glitches: On slow Zigbee networks, a drawn zone may briefly disappear after saving if the MQTT command fails to reach the switch. Re-apply the zone if this happens.
- Stay areas may invert width when applied. Re-apply to fix. This appears to be a Z2M or switch-level issue.
Please open an issue on GitHub if you encounter any bugs.
- Home Assistant OS or Supervised
- Zigbee2MQTT v2.8.0 or higher (ZHA is not supported)
- At least one Inovelli mmWave Smart Switch
GNU General Public License v3.0

