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)