VZM32-SN mmWave occupancy gets stuck on (won't clear) despite that zone occupancy continues updating

I’m seeing an issue with one of my VZM32-SN Blue Series mmWave switches where the main occupancy state can remain detected for an extremely long time even though the room is empty.

Setup:

  • VZM32-SN

  • Firmware 1.02

  • Zigbee2MQTT

  • Home Assistant

  • Installed in a bathroom

In one occurrence, the main occupancy entity stayed detected for approximately 18 hours, beginning around 1:49 PM the previous day.

What makes this unusual is that the individual mmWave zone entities were still updating normally during this time. In other words, the radar did not appear to be completely frozen. Zone occupancy could change, but the overall occupancy state remained asserted.

I also looked at the live target-position data. During testing with the room empty, I could see what appeared to be one or more targets reported extremely close to the switch/sensor origin. These looked like possible ghost targets rather than actual people.

I don’t know whether the apparent near-origin ghost targets are directly responsible for the stuck overall occupancy state, so I don’t want to assume they are the same bug. However, they occurred on the same unit and may be related.

A power cycle/air-gap restored normal operation.

Has anyone else seen the overall occupancy state remain active while the individual zones continue to function normally?

Chris

I’ve seen this on at least four of my devices. I didn’t check mmWave visualizer for ghosts but the occupancy stayed active for over a week in each case. I also had to use the air gap switch to power cycle the device. Rebooting, reinterviewing, and reconfiguring did not work. I wrote an automation in Home Assistant to notify me if any occupancy stays active for more than 12hrs so I can power cycle them.

Zigbee2MQTT version 2.14.2

Device firmware:

Firmware ID
1.02

20260330

Firmware version
16974082

App: 0.1 build 3 | Stack: 0.1 build 2

Just chiming in to say I have seen this too. Only seems to happen to a couple of my switches though.

Any solution you’ve found?

Chalk up another one here (but on v1.03 for me). Air-gap reset seems to work for about a week or so.

Here’s a template for a binary_sensor I use to trigger an alert sensor if a motion sensor hasn’t cleared after 12 hrs.

binary_sensor:

  - name: "Dead mmWave Devices"
    default_entity_id: binary_sensor.dead_mmwave_devices
    unique_id: 2026-09-23 05:37:12.943617-07:00
    device_class: problem
    state:  |
      {{ states.binary_sensor
        | selectattr('attributes.device_class', 'eq', 'occupancy')
        | selectattr('state', 'eq', 'on')
        | map(attribute='entity_id')
        | select('is_device_attr', 'manufacturer', 'Inovelli')
        | expand
        | selectattr('last_changed', 'lt', now() - timedelta(hours=12))
        | list
        | count >0
      }} 
    attributes:
      entities: |
        {{ states.binary_sensor
            | selectattr('attributes.device_class', 'eq', 'occupancy')
            | selectattr('state', 'eq', 'on')
            | map(attribute='entity_id')
            | select('is_device_attr', 'manufacturer', 'Inovelli')
            | expand
            | selectattr('last_changed', 'lt', now() - timedelta(hours=12))
            | map(attribute='entity_id')
            | list
        }}
      devices: |
        {{ states.binary_sensor
            | selectattr('attributes.device_class', 'eq', 'occupancy')
            | selectattr('state', 'eq', 'on')
            | map(attribute='entity_id')
            | select('is_device_attr', 'manufacturer', 'Inovelli')
            | expand
            | selectattr('last_changed', 'lt', now() - timedelta(hours=12))
            | map(attribute='name')
            | unique
            | list
        }}


alert:

dead_mmwave_devices:
  name: "Alert: Dead mmWave Sensors!"
  entity_id: binary_sensor.dead_mmwave_devices
  state: 'on'
  repeat: 240
  skip_first: false
  can_acknowledge: true
  title: >-
    mmWave Device Stuck!  {{ state_attr('binary_sensor.dead_mmwave_devices','devices') }}
  message: "message: Reset with air-gap plug in lower-left corner."
  notifiers: mobile_app_kevin_phone

Thanks for this. First time I’ve seen the Alert Integration; looks pretty handy.

It might help to add the full YAML for the binary_sensor:

template:
  - binary_sensor:
      - name: "Dead mmWave Devices"
...