Zigbee Chore Button
2026-06-21
Two things I am passionate about in my apartment are fun technology projects and forgetting to do the dishes. To address both of these I decided to build a project with an area of home automation I had yet to touch, Zigbee. The idea is that at certain times I will get a notification that won't stop unless a physical button in a certain area of my apartment is pressed in a certain way.
The Hardware
The Sonoff SNZB-01P. A small Zigbee 3.0 button that has a magnetic mount and runs off a CR2477 battery.
I didn't have any requirements when looking into the hardware side. I basically just searched the web and found a pack of 10 for about 11 dollars each.
This button has the benefit of also emitting single, double and long press events.
The Setup
Zigbee
A zigbee coordinator/router is needed as this is a Zigbee button. Fortunately I own a home assistant yellow which has an antenna built in that can be enabled for Zigbee, this does mean it cannot be used for thread but I will deal with that when I incorporate some thread devices into my home lab.
The setup of zigbee in home assistant is as simple as turning on the Zigbee Home Automation integration.
Adding Zigbee devices is just as straightforward and can be done by putting the device into pairing mode, the SNZB-01P goes into pairing mode when it's first turned on. You can then choose what name you want for the device, your device is then ready to trigger automations and should be sending events to the Zigbee integration.
Recurring Events
Because I want to be reminded to do the dishes at recurring times each week I needed a way to schedule these events.
Home Assistant has a Local Calendar Integration which is perfect for this. Installing the integration lets users create individual calendars that function exactly how you'd expect any hosted calendar to function (Google Calendar etc.) You can see a grid of dates and can setup events on each of the days.
I simply setup a "Clean Dishes" event and made it recurring at certain times throughout the week.
The Automation
Now that I had the physical button itself and the scheduled event, it's time to create an automation to bring the two together.
What It Does
When a "Clean Dishes" event starts in my local calendar, it sends a push notification to my mobile device saying "Dishes Reminder: Tap to start". It sends this every minute until it's pressed to ensure I physically get up and go to the button at the dishes.
Then a new alert says "Dishes pending: long-press when done" is sent every 5 minutes to ensure I don't just tap the button to silence it and walk away.
When the dishes are complete a long-press can be made which results in an alert celebrating the newly cleaned dishes and alerts will not continue until a new event begins in the calendar.
Calendar Event
Using calendar.event_started I can check the calendar for a specific event and use notify to alert my mobile phone with a specific message
alias: Dishes Chore Reminder
description: Nags with push notifications until kitchen sink button is pressed
triggers:
- trigger: calendar.event_started
target:
entity_id: calendar.id
options:
offset:
days: 0
hours: 0
minutes: 0
seconds: 0
offset_type: before
conditions:
- condition: template
value_template: "{{ trigger.calendar_event.summary == 'Clean Dishes' }}"
actions:
- action: notify.mobile_app_your_device
data:
title: Dishes Reminder
message: Dishes time! Tap the button once you start.First Acknowledge
Using the wait_for_trigger action I can monitor the Zigbee device for a single press and continually alert until one is found.
- repeat:
sequence:
- wait_for_trigger:
- device_id: your_device_id
domain: zha
type: remote_button_short_press
subtype: button
trigger: device
timeout:
minutes: 1
continue_on_timeout: true
- if:
- condition: template
value_template: "{{ wait.trigger is none }}"
then:
- action: notify.mobile_app_your_device
data:
title: Dishes Reminder
message: Still waiting: tap the button to acknowledge.
until:
- condition: template
value_template: "{{ wait.trigger is not none }}"Dishes Complete
Similarly to the first acknowledgement, the completion check simply checks for the trigger type of remote_button_long_press instead of remote_button_short_press to complete the automation and send the final dishes complete alert.
This is also where I discovered automation modes marking this one as single to ensure I don't just build up a series of alerts spamming me about starting dishes.
- repeat:
sequence:
- wait_for_trigger:
- device_id: your_device_id
domain: zha
type: remote_button_long_press
subtype: button
trigger: device
timeout:
minutes: 5
continue_on_timeout: true
- if:
- condition: template
value_template: "{{ wait.trigger is none }}"
then:
- action: notify.mobile_app_your_device
data:
title: Dishes Reminder
message: Dishes still pending: long-press the button when done.
until:
- condition: template
value_template: "{{ wait.trigger is not none }}"
- action: notify.mobile_app_your_device
data:
title: Dishes Reminder
message: Nice work: dishes marked done!
mode: singleThings To Note
Some interesting findings from the project
Device ID
The automation trigger requires a device ID, but I wasn't sure where to grab this. The SNZB-01P device pages didn't show the ID and I was only able to find it by grabbing them out of the URL when visiting each button's device page.