Home Assistant Guide

Simple tutorials for powerful automations

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.

  1. 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.
  2. Create an Automation from the Blueprint
    After import, find “Send Regular Notifications” under Settings > Automations & Scenes > Blueprints and click Create Automation.
  3. 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).
  4. 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 }}"