Files
haos-blueprints/Common/Periodic Notification/blueprint.yaml
alexei.dolgolyov 06177cb9f0 Make Start Date and Control Flag inputs optional in Periodic Notification
- Start Date: when empty, day interval is ignored and notifications fire daily
- Control Flag: when empty, notifications always fire (no toggle control)
- Update documentation to reflect optional inputs
- Fix markdown linting issues

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-09 12:42:59 +03:00

184 lines
6.2 KiB
YAML

# Periodic Notification
# Sends notifications at specified times on a repeating day schedule.
# See README.md for detailed documentation.
#
# Author: Alexei Dolgolyov (dolgolyov.alexei@gmail.com)
blueprint:
name: "Custom: Periodic Notification"
description: >
Sends notifications at specified times every N days when a control
flag is enabled. Supports multiple notification targets and flexible
scheduling.
domain: automation
input:
# -------------------------------------------------------------------------
# Notification Configuration
# -------------------------------------------------------------------------
notification:
name: "Notification"
collapsed: false
input:
notify_targets:
name: Notification Targets
description: >
Notify entities to send notifications to
(e.g., notify.mobile_app_phone).
selector:
entity:
domain: notify
multiple: true
message:
name: Message
description: The notification message to send.
selector:
text:
multiline: true
# -------------------------------------------------------------------------
# Schedule Configuration
# -------------------------------------------------------------------------
schedule:
name: "Schedule"
collapsed: false
input:
notification_times:
name: Notification Times
description: >
Comma-separated list of times in 24-hour format with leading
zeros (e.g., "08:00, 14:30, 20:00").
selector:
text:
day_interval:
name: Day Interval
description: >
How often to send notifications (in days).
Set to 1 for daily notifications.
default: 1
selector:
number:
min: 1
max: 365
mode: box
unit_of_measurement: days
start_date:
name: Start Date (optional)
description: >
Reference start date for the day interval calculation.
Notifications are sent every N days counting from this date.
Leave empty to ignore the day interval and send every day.
default: ""
selector:
date:
# -------------------------------------------------------------------------
# Control
# -------------------------------------------------------------------------
control:
name: "Control"
collapsed: false
input:
control_flag:
name: Control Flag (optional)
description: >
Toggle entity to enable or disable notifications.
Notifications are only sent when this entity is ON.
Leave empty to always send notifications.
default: ""
selector:
entity:
domain:
- input_boolean
- switch
# Single mode prevents overlapping notification sends
mode: single
# =============================================================================
# Trigger Variables (available in trigger templates)
# =============================================================================
trigger_variables:
input_times: !input notification_times
# =============================================================================
# Triggers
# =============================================================================
trigger:
# Fire when the current time matches any configured notification time
- platform: template
value_template: >
{{ now().strftime('%H:%M') in (input_times.split(',') | map('trim') | list) }}
# =============================================================================
# Variables
# =============================================================================
variables:
# Input references
notify_targets: !input notify_targets
message_text: !input message
interval: !input day_interval
start_date: !input start_date
control_flag: !input control_flag
# Debug flag - set to true to enable persistent notifications for troubleshooting
is_debug: false
# =============================================================================
# Conditions
# =============================================================================
condition:
# Control flag must be ON (skipped if no control flag)
- condition: template
value_template: >
{%- if control_flag | length == 0 -%}
true
{%- else -%}
{{ is_state(control_flag, 'on') }}
{%- endif -%}
# Today must fall on the correct day in the interval cycle (skipped if no start date)
- condition: template
value_template: >
{%- if start_date | length == 0 -%}
true
{%- else -%}
{%- set today_ts = as_timestamp(now().strftime('%Y-%m-%d') ~ 'T00:00:00') -%}
{%- set start_ts = as_timestamp(start_date ~ 'T00:00:00') -%}
{%- set days_since = ((today_ts - start_ts) / 86400) | round(0) | int -%}
{{ days_since >= 0 and days_since % (interval | int) == 0 }}
{%- endif -%}
# =============================================================================
# Actions
# =============================================================================
action:
# ---------------------------------------------------------------------------
# Debug Logging (optional)
# ---------------------------------------------------------------------------
- choose:
- conditions:
- condition: template
value_template: "{{ is_debug }}"
sequence:
- service: persistent_notification.create
data:
title: "Periodic Notification Debug"
message: >
Targets: {{ notify_targets }}
Message: {{ message_text }}
Interval: every {{ interval }} day(s)
Start Date: {{ start_date }}
# ---------------------------------------------------------------------------
# Send Notification
# ---------------------------------------------------------------------------
- service: notify.send_message
target:
entity_id: "{{ notify_targets }}"
data:
message: "{{ message_text }}"