Does HOBEIAN ZG-102ZM door/vibration sensor work for anyone?

According to z2m it should work.

Mine looks different but recognised as HOBEIAN ZG-102ZM

It detects open/close but no entity for acceleration or vibration.


My Hobeian ZG-102ZM has entities for vibration, door, battery and sensitivity. But “door” is never on. There was nor magnet in the package, just the sensor itself.

Same here, with ZHA it only shows the binary sensor (open/close) and not the vibration one. I’ll try it later with z2m

You could try it with any magnet. :wink:
Does it look the same as on the picture I posted?

Hello. Did you get it working? I found that when I “vibrate” the sensor, I have the following line in the logs, which suggests the vibration message is received by ZHA doesn’t know what to do with it.

WARNING (MainThread) [zigpy.listeners] Matcher checkin() and command ZCLHeader(frame_control=FrameControl<0x09>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Server_to_Client: 1>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=46, command_id=2, *direction=<Direction.Server_to_Client: 1>) b'\x00.\x01\x04\x00\x01\x01' are incompatible

and exactly 6 seconds later, this line which I guess is the “end of vibration” message

WARNING (MainThread) [zigpy.listeners] Matcher checkin() and command ZCLHeader(frame_control=FrameControl<0x09>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Server_to_Client: 1>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=47, command_id=2, *direction=<Direction.Server_to_Client: 1>) b'\x00/\x01\x04\x00\x01\x00' are incompatible

I also noticed this device does not use any zhaquirks.

Nope, it still works like contact sensor only.
Not explicit quirk means that it uses default ZHA collection.

While waiting for a developer to take an interest in this sensor, I create a piece of YAML (to add to configuration.yaml) to create the missing vibration sensor:

# required to create triggers on system_log_event
system_log:
  fire_event: true

template:
  - binary_sensor:
      name: Vibrate (broken)
      unique_id: broken_vibrate_sensor
      device_class: vibration
      state: |
        {{ "\\x01\\x04\\x00\\x01\\x01' are incompatible" in trigger.event.data.message[0] }}
    conditions:
      - condition: template
        value_template: |
          {{ "Matcher checkin() and command ZCLHeader" in trigger.event.data.message[0] }}
      - condition: template
        value_template: |
          {{ "\\x01\\x04\\x00\\x01\\x0" in trigger.event.data.message[0] }}
    triggers:
      - trigger: event
        event_type: system_log_event
        event_data:
          name: zigpy.listeners
          level: WARNING

So far, it works all the time

That’s pretty cool approach, great idea.
I have set in configuration.yaml

logger:
  default: warning
  logs:
    zigpy: debug
    zigpy.listeners: debug

to obtain warning messages from ZHA. But nothing arrives from ZG-102ZM. How to enable detailed messaging from ZHA?

It should not need to set the log level to debug, it’s a warning so it’s already caught by the default log level. Do you see it in the logs tab (Settings → System → Logs) ?
Logs

If not, maybe our devices are actually different (even though I have exactly the same name “ZG-102ZM by HOBEIAN” and it’s completely identical to the image you posted), or maybe this “Matcher checkin() and command ZCLHeader” bug was patched in the last version (I’m running 2025.8.2 instead of 2025.9.X)

Hi,
Any solution for this device using ZHA? In my case I am not able to see any working in Logs.

Still no. :frowning:

Hi.

I built a custom-quirk for this.
Well Claude code and I did…

It’s working just fine for me, but please try it out.
Once fully verified I will make a PR to have it included in zigpy and thereby ZHA.

Works perfectly on my setup, so I created the PR.

Hopefully at some point this will be merged and thereby fixed for all.
But until then, if you wish to try it, here is how:

Prerequisites: Set up custom quirks folder

If you haven’t used custom quirks before, you need to configure ZHA to load them:

  1. Create a folder called custom_zha_quirks in your HA config directory:
  • For HAOS: /config/custom_zha_quirks/
  • For Docker: <your-config-path>/custom_zha_quirks/
  1. Add the following to your configuration.yaml:
zha:
  custom_quirks_path: /config/custom_zha_quirks/
  1. Restart Home Assistant.

Install the quirk

  1. Download zg_102zm.py and place it in your custom_zha_quirks folder.
  2. Restart Home Assistant.
  3. If the device is already paired, you may need to remove it from ZHA and re-pair it to get the correct entities.

Expected entities

After pairing with the quirk, the device should expose:

Entity Type Description
Vibration Binary sensor Vibration detection
Contact Binary sensor Door/window open/close
Battery Sensor Battery percentage (1× CR2032)
Sensitivity level Number Vibration sensitivity (1–50)

The default IAS Zone entity is disabled by default since it is redundant.

Minor issue found and corrected in the quirk.
If you already downloaded it, please update.

Visible difference is that the old quirk would wait for the device to time-out on pairing-mode while the updated quirk stops pairng mode on the device when successfully paired with HA.