Home Assistant

Bin-day reminder

The evening before pickup, a Companion notification with Done and Snooze repeats every few minutes until you confirm or a cut-off time hits. Optional recycling-week line. A chore confirm, not a sensor nag.

Difficulty · BeginnerSetup · 20–40 minutesHA · current stable (blueprint)
Get the pack · from $9Have us set it up

Trash night fails in a specific way: the reminder arrives at 18:00, you swipe it, and the bins are still in the garage at 21:30. This workflow sends an actionable Companion notification the evening before pickup, with Done and Snooze. It repeats every N minutes until Done is tapped, and it stops at a cut-off even if nobody taps anything. An optional recycling flag adds a second line only on the weeks the recycling bin goes out too.

Helpers and the notify service are blueprint inputs. Do not publish a street, a pickup route, or who takes the bins out.

This is a chore with confirm / snooze. Nagging repeatable alert nags while a sensor stays in an alert state (a door, a leak, a warm freezer) and sends a resolved message when that sensor clears. Nothing here watches a sensor. The bins are “done” only because someone tapped Done.

What problem it solves

You want one evening reminder that keeps coming back until the bins are actually out, lets you snooze it, and goes quiet at a cut-off so it does not buzz after everyone is asleep.

How it works

  1. Pickup eve — either a calendar whose next event starts tomorrow, or a schedule / input_datetime you maintain for the next pickup morning. The blueprint treats “pickup is tomorrow” as the condition. It does not scrape a city’s waste site.
  2. Evening start — at a clock time you set (pack default 18:00), if tomorrow is a pickup and Done is off, send the Companion message and clear any snooze-until value. Turning Done off at the start of a new evening means last week’s tap does not suppress this week.
  3. Buttons — Done turns the input_boolean on, clears the notification by tag, and ends the cycle. Snooze does not mark Done; it writes now + repeat into an input_datetime and clears the current notification so a later push is a fresh one.
  4. Repeat — a minute time pattern, not a delay. While Done is off, tomorrow is still the pickup, now is after the evening start, now is before the cut-off, and now is past snooze-until (or the last push is older than N minutes), send again with the same tag. No answer and Snooze both wait N minutes; Snooze restarts that wait from the tap.
  5. Cut-off — at the cut-off (pack default 22:00) the minute check stops even if Done is still off. The last notification can stay on the phone; the automation does not send another. A morning reset is optional and only clears the boolean so a dashboard toggle is honest. The next pickup eve starts clean at step 2 anyway.
  6. Recycling week — optional input_boolean. On: the message lists trash and recycling. Off: trash only. Flip it on a schedule (every other week) or by hand. Two calendars also work: one automation instance per stream, each with its own Done boolean, if trash and recycling are different nights.

mode: restart on the button handler so a second tap replaces the first. The minute checker is mode: single. A Core restart does not cancel the cycle: the boolean and the snooze datetime are restored helpers, and the next minute tick resumes. A long repeat / delay would have been forgotten.

Hardware notes

  • No bin sensor. This pack does not know whether the cart moved. Done is a person tapping the notification. If you later add a contact, that belongs in a different automation; do not pretend this one saw the curb.
  • Companion. Actionable notifications need the Companion app (notify.mobile_app_*) or a notify group whose members support actions. notify.notify only works when its target actually shows buttons.
  • Helpers. One input_boolean (Done) and one input_datetime (snooze until) per automation. Two pickup nights need two pairs so a Done on trash does not clear recycling.
  • Calendar. Any HA calendar entity. The condition is “an event starts tomorrow,” not a parsed title full of personal details. Keep event titles generic (Trash, Recycling).

Snippet

The pack ships a blueprint. Inputs replace real entity ids:

trigger:
  - platform: time
    at: !input evening_time
    id: start
  - platform: time_pattern
    minutes: "/1"
    id: tick
  - platform: event
    event_type: mobile_app_notification_action
    event_data:
      tag: bin-night
    id: button

action:
  - variables:
      pickup_tomorrow: "{{ is_state(pickup_due, 'on') }}"
      before_cutoff: "{{ now().strftime('%H:%M') < cutoff }}"
      snooze_ok: >
        {{ snooze_until == 'unknown' or now() >= as_datetime(snooze_until) }}
  - choose:
      - conditions:
          - condition: trigger
            id: button
          - condition: template
            value_template: "{{ trigger.event.data.action == 'DONE' }}"
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: !input done_boolean
          - service: notify.mobile_app
            data:
              message: "clear_notification"
              data:
                tag: bin-night
      - conditions:
          - condition: trigger
            id: start
          - condition: template
            value_template: "{{ pickup_tomorrow }}"
        sequence:
          - service: input_boolean.turn_off
            target:
              entity_id: !input done_boolean
          - service: !input notify_service
            data:
              title: "Bins"
              message: >
                {{ 'Trash and recycling' if is_state(recycling_week, 'on')
                   else 'Trash' }} — out before morning.
              data:
                tag: bin-night
                actions:
                  - action: DONE
                    title: Done
                  - action: SNOOZE
                    title: Snooze
      # tick: pickup tomorrow, Done off, before cut-off, snooze elapsed → same notify
      # SNOOZE: input_datetime = now + repeat, then clear_notification

The notify service in the button branch is an input too. The tag must match on send and on clear.

Setup outline

  1. Create the Done boolean and the snooze datetime. Decide the pickup source: a calendar with tomorrow’s event, or a schedule helper / template binary that is on when tomorrow is pickup day.
  2. Import the blueprint. Fill evening time, cut-off, repeat (pack default 30 minutes), notify service, helpers, and the optional recycling boolean.
  3. Write a test tag in Companion (or run the automation with the evening time a minute ahead). Confirm Done stops further pushes, Snooze stays quiet for N minutes and then returns, and nothing sends after the cut-off.
  4. Restart Home Assistant during a snooze. The next minute tick should still honor snooze-until, not immediately re-send.
  5. If recycling is every other week, add a Sunday automation that toggles that boolean, or split into two blueprint instances with two calendars.

Troubleshooting

  • Buttons do nothing. The notify target is not Companion, or the event trigger listens for a different tag than the one you sent. Action ids are DONE and SNOOZE; the titles are only labels.
  • It nags after Done. The minute check does not read the boolean, or a second automation still has the old one-shot reminder enabled. Disable the old one.
  • It nags after bedtime. Cut-off is compared as text without a wrap, or the cut-off is earlier than the evening start so the condition is always true. Keep both times on the same evening (18:00 then 22:00).
  • Missed the whole night after a reboot. The repeat was a delay inside one run. Use the minute pattern plus the helpers; they survive a restart.
  • Recycling shows every week. The boolean is stuck on, or both calendars feed one message. One boolean (or one instance) per stream.
  • Swipe feels like Done. A swipe only dismisses the banner. The cycle stops on the Done action, not on dismiss. That is the point of the repeat.

Credits

Based on Trash Notify. This write-up is an original evening-before reminder with Done and Snooze, a repeat until confirm, a cut-off, and an optional recycling week — not a paste of that blueprint.

Changelog

v1.0 · Oct 19, 2026: First publish.