Send Regular Notifications with in Home Assistant
This Home Assistant blueprint allows you to send scheduled notifications to your phone or tablet on a flexible schedule, such as every 2 weeks, every month, or any custom interval. What makes this blueprint powerful is the ability to easily add exception dates: you can “skip” certain days (like public holidays) or add one-off reminder dates when needed—all from the Home Assistant UI.
What Does This Blueprint Do?
This automation will:
- Send a notification to a mobile device running the Home Assistant Companion App on a regular schedule (every X days/weeks/months, starting from your chosen date).
- Let you pick a specific time of day for the notification.
- Optionally announce the message via TTS on any of your smart speakers.
- Allow you to specify “Include Dates” for extra notifications (outside the normal schedule) and “Exclude Dates” to skip reminders when needed.
- Customize the notification title and message directly from the UI.
How to Use This Blueprint
Note: You can import this blueprint from any device, but notifications require the Home Assistant Companion App on Android or iOS with notification permissions enabled.
- Import the Blueprint
Click the Import Blueprint button/link at the top of this article.
— If prompted in Home Assistant, review the YAML preview and click Import.
Alternative (manual): In Home Assistant go to Settings > Automations & Scenes > Blueprints, click Import Blueprint, paste the blueprint’s raw YAML URL, and click Preview > Import. - Create an Automation from the Blueprint
After import, find “Send Regular Notifications” under Settings > Automations & Scenes > Blueprints and click Create Automation. - Fill in the Inputs
- Start Date: The first date the reminders should begin.
- Notification Time: The time of day the notification will be sent.
- Frequency: How often the notification repeats (e.g., every 2 weeks or every month).
- Device to Notify: Select your phone or tablet (requires the Companion App).
- Notification Title: (Optional) The heading of the notification.
- Message: The content of your notification (also used for TTS if speakers are selected).
- Media Players: (Optional) One or more speakers for spoken announcements.
- Additional Include Dates: Dates you want to send an extra notification (outside the normal schedule).
- Exclude Dates: Dates to skip reminders (e.g., public holidays).
- Save
Click Save. Your automation will now send notifications on the defined schedule, automatically handling include and exclude dates.
Tip: “Include Dates” always send a notification, even if it’s not a regular reminder day. “Exclude Dates” always skip, even if a notification would normally occur.
Use Cases & Ideas
- Bin/recycling day reminders that skip holidays or change for special collections
- Medication or supplement reminders with skip days for planned breaks
- Monthly bill reminders, with one-off reminders for special payments
- Household chore reminders that can be adjusted around vacations
- Event or appointment reminders with flexible, exception-aware scheduling
Blueprint YAML
blueprint:
name: Regular Notification to One Device
description: >
Send a scheduled notification—every X days/weeks/months—at a specific time to a single mobile device (Home Assistant Companion App) and/or as TTS to speakers.
Supports "Include Dates" (always send) and "Exclude Dates" (skip) for handling holidays or special events.
domain: automation
input:
start_date:
name: Start Date
selector:
date:
notify_time:
name: Notification Time
selector:
time:
frequency_value:
name: Frequency Value
default: 1
selector:
number:
min: 1
max: 365
step: 1
mode: slider
frequency_unit:
name: Frequency Unit
default: days
selector:
select:
options:
- days
- weeks
- months
notify_device:
name: Device to Notify (Mobile App)
description: "Select the mobile device (with Companion App) to receive the notification."
selector:
device:
integration: mobile_app
multiple: false
media_players:
name: (Optional) Media Player Targets for TTS
description: "Select media_player(s) to play message via TTS (optional)"
default: []
selector:
entity:
domain: media_player
multiple: true
notification_title:
name: Notification Title (for text notifications)
default: ""
selector:
text:
notification_message:
name: Message
selector:
text:
include_dates:
name: Additional Include Dates
description: "Pick extra dates to send a notification (overrides schedule, optional)"
default: []
selector:
date:
multiple: true
exclude_dates:
name: Exclude Dates
description: "Pick any dates to skip notification (optional)"
default: []
selector:
date:
multiple: true
mode: single
variables:
start_date: !input start_date
notify_time: !input notify_time
frequency_value: !input frequency_value
frequency_unit: !input frequency_unit
notify_device: !input notify_device
media_players: !input media_players
notification_title: !input notification_title
notification_message: !input notification_message
include_dates: !input include_dates
exclude_dates: !input exclude_dates
trigger:
- platform: time
at: !input notify_time
condition:
- condition: template
value_template: |
{% set today = now().date() %}
{% set include_dates = include_dates | map('as_datetime') | map('date') | list %}
{% set exclude_dates = exclude_dates | map('as_datetime') | map('date') | list %}
{% set freq_days =
frequency_value if frequency_unit == 'days'
else frequency_value * 7 if frequency_unit == 'weeks'
else frequency_value * 30 if frequency_unit == 'months'
else frequency_value %}
{% set start = strptime(start_date, "%Y-%m-%d").date() %}
{% if today in include_dates %}
true
{% elif today in exclude_dates %}
false
{% else %}
((today - start).days >= 0) and (((today - start).days) % freq_days == 0)
{% endif %}
action:
# Send to mobile app device
- device_id: !input notify_device
domain: mobile_app
type: notify
title: "{{ notification_title if notification_title else none }}"
message: "{{ notification_message }}"
# TTS to speakers
- choose:
- conditions: "{{ media_players | count > 0 }}"
sequence:
- repeat:
count: "{{ media_players | count }}"
sequence:
- service: tts.speak
data:
entity_id: "{{ media_players[repeat.index-1] }}"
message: "{{ notification_message }}"