Sonoff SNZB‑01M Remote (ZHA) — 16‑Action Event-Based Control

This blueprint provides full support for the Sonoff SNZB‑01M remote in ZHA, using zha_event for fast and reliable event‑based control. Each of the four physical buttons exposes four different actions:

  • Single press
  • Double press
  • Triple press
  • Long press

This gives you 16 fully customizable actions that can be mapped to anything in Home Assistant.

:inbox_tray: Import Blueprint


Requirements

To use this blueprint, your SNZB‑01M must be supported by the correct ZHA quirk.

Devices based on the FC12 cluster (including the SNZB‑01M) require a custom quirk/script for proper event mapping. Installation instructions are available here:

:point_right: Orb 4-In-1-SONOFF Help Center (The document refers to the Orb 4‑in‑1, but the quirk installation process is identical for the SNZB‑01M.)

This blueprint listens for the actual ZHA commands emitted by the device:

  • remote_button_short_press
  • remote_button_double_press
  • remote_button_triple_press
  • remote_button_long_press

If the correct quirk is not applied, these events may not appear or may be mapped incorrectly. If you don’t know how, read this guide on using ZHA quirks.

Physical Button Markings

The SNZB‑01M has embossed symbols on each button:

  • Top Left → one dot
  • Top Right → two dots
  • Bottom Left → three dots
  • Bottom Right → four dots

These correspond to endpoints 1–4 in ZHA.

Automation Mode

The blueprint allows selecting the automation mode:

  • queued (default)
  • single
  • restart
  • parallel

To avoid log spam during rapid button presses, the automation uses:

Code

max_exceeded: silent

Compatibility

  • Home Assistant 2024.12+, 2025.x, 2026.x
  • Integration: ZHA
  • Device: Sonoff SNZB‑01M (FC12)
  • Requires quirk or native FC12 support

FAQ

Does this blueprint work without installing a quirk?

No. The SNZB‑01M requires a quirk for proper FC12 event mapping. Installation guide: Orb 4-In-1-SONOFF Help Center

How do I check if my device is using the correct quirk?

Go to: Settings → Devices & Services → ZHA → Your SNZB‑01M → Zigbee Information

You should see a quirk name containing FC12 or SNZB‑01M. If it shows ZHAStandardDevice, the quirk is not applied.

Why does the blueprint use zha_event instead of device triggers?

Because the SNZB‑01M does not expose device triggers in ZHA. All actions are emitted as FC12 events.

Can I assign different actions to each button?

Yes — each of the four buttons supports: single, double, triple, and long press → 16 actions total.

Why do I see a simple dropdown instead of a fancy UI selector?

Blueprints based on events (zha_event) do not use the extended UI widgets. This is a frontend limitation, not a YAML issue.

Does the device support long‑press‑hold or repeated events?

No. The SNZB‑01M sends only a single remote_button_long_press event. It does not emit repeated “hold” events.

Is this blueprint compatible with HA 2024.12 / 2025.x?

Yes — fully compatible.

Why do I see logs like “派发 zha_event 成功” when I press a button?

Because your custom ZHA quirk is working correctly. That message literally means “zha_event dispatched successfully”. It is printed by the quirk at the moment it converts a raw Zigbee FC12 report into a Home Assistant zha_event. This is a success message, not an error.

Why is the message in Chinese?

Because the log string comes directly from the quirk source code:

_LOGGER.warning("派发zha_event成功: …")

It’s purely a developer log message, not something generated by ZHA or Home Assistant itself. You can safely translate it as “Successfully dispatched zha_event”.

1 Like

Hello 3jam3,

Thanks for contributing to the community with a new Blueprint.

I have a suggestion for you. Many people who are not familiar with directory structures will have problems installing this without the Home Assistant MY tools.

Adding a MY link for this Blueprint to your top post would help them a lot.

Here is the link to make that.

Create a link – My Home Assistant

Thanks for the suggestion! You’re absolutely right — adding a MY link makes the installation much easier for people who aren’t familiar with directory structures or manual imports.

I tried several other approaches earlier to get the automatic import button to appear, but none of them worked reliably, so the MY link turned out to be the most practical solution. I’ve added it to the top post now.

1 Like

No luck with this blueprint

Can you be more specific?

Thank you, it works well :+1:

Thanks for this, once I figured out the step to install the quirk it works flawlessly for me!

RESTART Home Assistant

Restart not just Core, but the entire system so that ZHA loads the Quirk.

Re-pair the device (VERY IMPORTANT)

The Quirk only works during pairing.

:one: Delete the old device

:arrow_right: Remove device

1 Like

I’ve had this Blueprint working for a while, but it seems to have stopped working in the last week or so.

I can see the events firing correctly in the Device Activity

There seems to be 3 events each time I press a button and this triggers 3 runs in the automation. However, for each run the Command never matches what the automation is expecting.

The Endpoint ID is matching the button. This is from the trace of the first of three:

event:
event_type: zha_event
data:
device_ieee: a4:c1:38:10:4b:c2:ff:ff
device_id: 0a3fa0325743994dac5f501d8b1d9a49
unique_id: a4:c1:38:10:4b:c2:ff:ff:1:0xfc12
endpoint_id: 1
cluster_id: 64530
command: single
args: {}
params: {}

The next one:

event:
event_type: zha_event
data:
device_ieee: a4:c1:38:10:4b:c2:ff:ff
device_id: 0a3fa0325743994dac5f501d8b1d9a49
unique_id: a4:c1:38:10:4b:c2:ff:ff:1:0x0006
endpoint_id: 1
cluster_id: 6
command: attribute_updated
args:
attribute_id: 0
attribute_name: on_off
attribute_value: 1
value: 1
params: {}

The final one:

event:
event_type: zha_event
data:
device_ieee: a4:c1:38:10:4b:c2:ff:ff
device_id: 0a3fa0325743994dac5f501d8b1d9a49
unique_id: a4:c1:38:10:4b:c2:ff:ff:1:0x0006
endpoint_id: 1
cluster_id: 6
command: ‘on’
args:
params: {}

This is from the device Zigbee info:

Quirk: zigpy.quirks.v2.CustomDeviceV2

I was given the option to update the firmware of the SNZB-01M today and it was when I pressed a button to wake it up that I realised the automation wasn’t working. The update completed anyway and I’m now running: 0x00001100

1 Like

Hej! Same issue here as nickjossy, this was working flawlessly for months and recently broke.
Last night we reject the firmware update (skipped, Because no need to patch if it’s working already, who has time to troubleshoot these things :sweat_smile:)

Regardless this morning the controller doesn’t work like it used to.
Still fires the zha events and creating a new automation to test a single button works fine. It’s just the blueprint that appears broken.
If we can’t work it out we will go ahead and recreate the automations manually which is messy but seems likely it will work.

Thanks for any tips

change the code

Save it as sonoff_snzb01m_zha.yaml in /config/blueprints/automation/3jam3/, rename the old file to sonoff_snzb01m_zha_old.yaml, then open the automation and click Save to reload

blueprint:
  name: Sonoff SNZB-01M (ZHA)
  description: "ZHA blueprint for the Sonoff SNZB‑01M using zha_event. Supports 4
    buttons (endpoints 1–4), each providing single, double, triple and long press
    actions — 16 actions in total.\nUses the actual ZHA commands emitted by the SNZB‑01M
    (FC12 cluster). Requires either native ZHA support for this model or an appropriate
    quirk enabling correct FC12 event mapping.\nPhysical button embossing:\n  • Top
    Left  → one dot\n  • Top Right → two dots\n  • Bottom Left → three dots\n  • Bottom
    Right → four dots\n"
  domain: automation
  author: jam3
  input:
    remote:
      name: Sonoff SNZB-01M Remote
      description: Select the remote from the device list
      selector:
        device:
          integration: zha
          manufacturer: SONOFF
          multiple: false
    automation_mode:
      name: Automation mode
      description: 'Only one automation mode can be used for all buttons. Automation
        modes documentation: https://www.home-assistant.io/docs/automation/modes/

        '
      default: queued
      selector:
        select:
          options:
          - queued
          - single
          - restart
          - parallel
          sort: false
          multiple: false
          custom_value: false
    button1_single:
      name: Button 1 – Single press
      default: []
      selector:
        action: {}
    button1_double:
      name: Button 1 – Double press
      default: []
      selector:
        action: {}
    button1_triple:
      name: Button 1 – Triple press
      default: []
      selector:
        action: {}
    button1_long:
      name: Button 1 – Long press
      default: []
      selector:
        action: {}
    button2_single:
      name: Button 2 – Single press
      default: []
      selector:
        action: {}
    button2_double:
      name: Button 2 – Double press
      default: []
      selector:
        action: {}
    button2_triple:
      name: Button 2 – Triple press
      default: []
      selector:
        action: {}
    button2_long:
      name: Button 2 – Long press
      default: []
      selector:
        action: {}
    button3_single:
      name: Button 3 – Single press
      default: []
      selector:
        action: {}
    button3_double:
      name: Button 3 – Double press
      default: []
      selector:
        action: {}
    button3_triple:
      name: Button 3 – Triple press
      default: []
      selector:
        action: {}
    button3_long:
      name: Button 3 – Long press
      default: []
      selector:
        action: {}
    button4_single:
      name: Button 4 – Single press
      default: []
      selector:
        action: {}
    button4_double:
      name: Button 4 – Double press
      default: []
      selector:
        action: {}
    button4_triple:
      name: Button 4 – Triple press
      default: []
      selector:
        action: {}
    button4_long:
      name: Button 4 – Long press
      default: []
      selector:
        action: {}
  source_url: https://raw.githubusercontent.com/3jam3/sonoff_projects/refs/heads/main/sonoff_snzb01m_zha.yaml
mode: !input automation_mode
max_exceeded: silent
variables:
  remote_device_id: !input remote
trigger:
  - platform: event
    event_type: zha_event
condition:
  - condition: template
    value_template: >
      {{ trigger.event.data.device_id == remote_device_id and
         trigger.event.data.cluster_id == 64530 }}
action:
  - variables:
      endpoint: '{{ trigger.event.data.endpoint_id }}'
      command: '{{ trigger.event.data.command }}'
  - choose:
    - conditions: '{{ endpoint == 1 and command == ''single'' }}'
      sequence: !input button1_single
    - conditions: '{{ endpoint == 1 and command == ''double'' }}'
      sequence: !input button1_double
    - conditions: '{{ endpoint == 1 and command == ''triple'' }}'
      sequence: !input button1_triple
    - conditions: '{{ endpoint == 1 and command == ''long'' }}'
      sequence: !input button1_long
    - conditions: '{{ endpoint == 2 and command == ''single'' }}'
      sequence: !input button2_single
    - conditions: '{{ endpoint == 2 and command == ''double'' }}'
      sequence: !input button2_double
    - conditions: '{{ endpoint == 2 and command == ''triple'' }}'
      sequence: !input button2_triple
    - conditions: '{{ endpoint == 2 and command == ''long'' }}'
      sequence: !input button2_long
    - conditions: '{{ endpoint == 3 and command == ''single'' }}'
      sequence: !input button3_single
    - conditions: '{{ endpoint == 3 and command == ''double'' }}'
      sequence: !input button3_double
    - conditions: '{{ endpoint == 3 and command == ''triple'' }}'
      sequence: !input button3_triple
    - conditions: '{{ endpoint == 3 and command == ''long'' }}'
      sequence: !input button3_long
    - conditions: '{{ endpoint == 4 and command == ''single'' }}'
      sequence: !input button4_single
    - conditions: '{{ endpoint == 4 and command == ''double'' }}'
      sequence: !input button4_double
    - conditions: '{{ endpoint == 4 and command == ''triple'' }}'
      sequence: !input button4_triple
    - conditions: '{{ endpoint == 4 and command == ''long'' }}'
      sequence: !input button4_long
2 Likes

Hi, the command renaming has done the trick, thank you! Also, it looks like the quirk has been officially merged to zigpy so I think it is not needed anymore?

Same issue here with almost the same end result. I will say that this issue appeared to have started when HA upgraded the firmware on the SNZB-01M from 0x00001005 to 0x00001100, that’s when it seems to have broke. Unless there was something wierd on an update to HA.

Thank you! It worked.