From 5da986867df05b262c00a984cf8ee30dcdd61107 Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Mon, 9 Feb 2026 03:41:35 +0300 Subject: [PATCH] Add `Periodic Notification` blueprint Sends notifications at specified times every N days when a control flag is enabled. Supports multiple notification targets, flexible time scheduling, and optional day interval with configurable start date. Co-Authored-By: Claude Opus 4.6 --- Common/Periodic Notification/README.md | 53 ++++++ Common/Periodic Notification/blueprint.yaml | 176 ++++++++++++++++++++ manifest.json | 2 +- 3 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 Common/Periodic Notification/README.md create mode 100644 Common/Periodic Notification/blueprint.yaml diff --git a/Common/Periodic Notification/README.md b/Common/Periodic Notification/README.md new file mode 100644 index 0000000..b95d0cf --- /dev/null +++ b/Common/Periodic Notification/README.md @@ -0,0 +1,53 @@ +# Periodic Notification + +Sends notifications at specified times on a repeating day schedule, controlled by a toggle entity. + +## Features + +- Multiple notification targets (notify entities) +- Customizable multiline message +- Flexible time schedule (multiple times per day) +- Configurable day interval (every N days) +- On/off control via input_boolean or switch entity + +## How It Works + +1. The automation triggers at each configured notification time (checked every minute) +2. It verifies the control flag entity is ON +3. It calculates whether today falls on the correct day in the interval cycle, counting from the configured start date +4. If all conditions pass, the message is sent to all notification targets + +### Day Interval Calculation + +The day interval uses a **start date** as a reference point. Notifications fire every N days from that date. For example, with a start date of January 1 and a 3-day interval, notifications fire on January 1, 4, 7, 10, and so on. + +If no start date is set, the day interval is ignored and notifications are sent every day at the configured times. + +Setting the day interval to **1** sends notifications every day. + +## Configuration + +| Input | Description | +|---|---| +| **Notification Targets** | One or more `notify` entities (e.g., `notify.mobile_app_phone`) | +| **Message** | The notification text to send (supports multiline) | +| **Notification Times** | Comma-separated times in 24-hour `HH:MM` format (e.g., `08:00, 14:30, 20:00`) | +| **Day Interval** | Number of days between notification cycles (1 = daily) | +| **Start Date** | Reference date for the interval calculation (optional — leave empty to send every day) | +| **Control Flag** | `input_boolean` or `switch` entity to enable/disable notifications | + +### Time Format + +Times must use 24-hour format with leading zeros: + +- `08:00` (not `8:00`) +- `14:30` +- `20:00` + +### Debug Mode + +Set the `is_debug` variable to `true` in the automation YAML to enable persistent notification logging for troubleshooting. + +## Author + +Alexei Dolgolyov (dolgolyov.alexei@gmail.com) diff --git a/Common/Periodic Notification/blueprint.yaml b/Common/Periodic Notification/blueprint.yaml new file mode 100644 index 0000000..f75f07c --- /dev/null +++ b/Common/Periodic Notification/blueprint.yaml @@ -0,0 +1,176 @@ +# 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 + description: > + Toggle entity to enable or disable notifications. + Notifications are only sent when this entity is ON. + 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 + + # Debug flag - set to true to enable persistent notifications for troubleshooting + is_debug: false + +# ============================================================================= +# Conditions +# ============================================================================= +condition: + # Control flag must be ON + - condition: state + entity_id: !input control_flag + state: "on" + + # 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 }}" diff --git a/manifest.json b/manifest.json index 94b9652..f477809 100644 --- a/manifest.json +++ b/manifest.json @@ -1,3 +1,3 @@ { - "version": "1.33.1" + "version": "1.34.0" }