BREAKING: Replace hour/interval inputs with flexible time lists in Immich Album Watcher

Replace interval-based scheduling with explicit time lists for more flexibility:
- Periodic Summary: Replace interval_hours + start_hour with notification_times
- Scheduled Assets: Replace interval_hours + start_hour with notification_times
- Memory Mode: Replace start_hour with notification_times

Changes:
- Remove `periodic_interval_hours` and `periodic_start_hour` inputs
- Remove `scheduled_assets_interval_hours` and `scheduled_assets_start_hour` inputs
- Replace `memory_mode_start_hour` with `memory_mode_notification_times`
- Add three new time text inputs accepting comma-separated HH:MM format
- Replace hourly time_pattern trigger with three template triggers
- Update trigger logic to match current time against configured times
- Update documentation to reflect new time-based scheduling

Users can now specify any times (e.g., "09:00, 14:30, 21:00") instead of
calculating intervals. Times must use 24-hour format with leading zeros.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-09 12:50:23 +03:00
parent 06177cb9f0
commit 6848c3f903
3 changed files with 84 additions and 107 deletions

View File

@@ -156,7 +156,7 @@ Select input_text entities containing Telegram chat IDs. Can be user IDs (positi
## Periodic Summary
Sends a summary notification of tracked albums at regular intervals. Album names and share URLs are automatically read from the Album ID Entity's `album_name` and `share_url` attributes (if available).
Sends a summary notification of tracked albums at configured times. Album names and share URLs are automatically read from the Album ID Entity's `album_name` and `share_url` attributes (if available). You can configure multiple notification times (e.g., "12:00, 18:00") using comma-separated 24-hour format with leading zeros.
When Telegram media is enabled, an optional image can be attached to the summary message. By default, the official Immich logo is used. Set the **Summary Image URL** to empty to send text-only notifications.
@@ -189,7 +189,7 @@ To target a specific automation, set its Automation ID in config and include it
## Scheduled Assets
Sends scheduled notifications with existing assets from tracked albums. Uses the `immich_album_watcher.get_assets` service to fetch assets.
Sends scheduled notifications with existing assets from tracked albums at configured times. Uses the `immich_album_watcher.get_assets` service to fetch assets. You can configure multiple notification times (e.g., "09:00, 21:00") using comma-separated 24-hour format with leading zeros.
### Album Modes
@@ -244,14 +244,14 @@ Send scheduled notifications with photos taken on today's date in previous years
| Option | Description |
|--------|-------------|
| `enable_memory_mode` | Enable/disable memory notifications |
| `start_hour` | Hour of day for the daily notification (0-23) |
| `notification_times` | Comma-separated times in 24-hour format (e.g., "09:00, 18:00") |
| `album_mode` | per_album, combined, or random |
| `limit` | Maximum number of assets to fetch (1-100) |
| `favorite_only` | Only fetch favorite assets |
| `asset_type` | Filter by type (all, photo, video) |
| `min_rating` | Minimum rating filter (1-5, 0 = no filter) |
Memory notifications are sent once per day at the configured start hour.
Memory notifications are sent at the configured times. Times must use 24-hour format with leading zeros (e.g., "09:00" not "9:00").
### Memory Mode Message Template Variables

View File

@@ -489,30 +489,14 @@ blueprint:
selector:
boolean:
periodic_interval_hours:
name: Summary Interval (Hours)
description: "How often to send the summary notification (in hours)"
default: 24
selector:
number:
min: 1
max: 168
unit_of_measurement: hours
mode: slider
periodic_start_hour:
name: Summary Start Hour
periodic_notification_times:
name: Summary Notification Times
description: >
Hour of day (0-23) when the first summary should be sent.
Subsequent summaries are sent at this hour plus the interval.
Example: Start hour 12 with 24h interval = daily at 12:00.
default: 12
Comma-separated list of times to send periodic summaries in
24-hour format with leading zeros (e.g., "12:00, 18:00").
default: "12:00"
selector:
number:
min: 0
max: 23
unit_of_measurement: hour
mode: slider
text:
periodic_summary_message:
name: Summary Message Template
@@ -560,29 +544,14 @@ blueprint:
selector:
boolean:
scheduled_assets_interval_hours:
name: Interval (Hours)
description: "How often to send scheduled asset notifications (in hours)"
default: 24
selector:
number:
min: 1
max: 168
unit_of_measurement: hours
mode: slider
scheduled_assets_start_hour:
name: Start Hour
scheduled_assets_notification_times:
name: Notification Times
description: >
Hour of day (0-23) when the first notification should be sent.
Example: Start hour 9 with 24h interval = daily at 09:00.
default: 9
Comma-separated list of times to send scheduled asset notifications
in 24-hour format with leading zeros (e.g., "09:00, 21:00").
default: "09:00"
selector:
number:
min: 0
max: 23
unit_of_measurement: hour
mode: slider
text:
scheduled_assets_album_mode:
name: Album Mode
@@ -723,18 +692,14 @@ blueprint:
selector:
boolean:
memory_mode_start_hour:
name: Start Hour
memory_mode_notification_times:
name: Notification Times
description: >
Hour of day (0-23) when the daily memory notification should be sent.
Memory notifications are sent once per day at this hour.
default: 9
Comma-separated list of times to send memory notifications in
24-hour format with leading zeros (e.g., "09:00, 18:00").
default: "09:00"
selector:
number:
min: 0
max: 23
unit_of_measurement: hour
mode: slider
text:
memory_mode_album_mode:
name: Album Mode
@@ -844,6 +809,14 @@ blueprint:
mode: queued
max: 10
# =============================================================================
# TRIGGER VARIABLES (available in trigger templates)
# =============================================================================
trigger_variables:
input_periodic_times: !input periodic_notification_times
input_scheduled_times: !input scheduled_assets_notification_times
input_memory_times: !input memory_mode_notification_times
# =============================================================================
# TRIGGERS
# =============================================================================
@@ -869,12 +842,21 @@ trigger:
event_type: immich_album_watcher_album_deleted
id: "album_deleted"
# Hourly timer trigger for periodic summary and scheduled assets
# Note: Uses template to dynamically set interval, but HA requires static value
# so we trigger every hour and check interval in conditions
- platform: time_pattern
hours: "/1"
id: "hourly_timer"
# Time-based triggers for periodic summary, scheduled assets, and memory mode
- platform: template
value_template: >
{{ now().strftime('%H:%M') in (input_periodic_times.split(',') | map('trim') | list) }}
id: "periodic_summary_timer"
- platform: template
value_template: >
{{ now().strftime('%H:%M') in (input_scheduled_times.split(',') | map('trim') | list) }}
id: "scheduled_assets_timer"
- platform: template
value_template: >
{{ now().strftime('%H:%M') in (input_memory_times.split(',') | map('trim') | list) }}
id: "memory_mode_timer"
# Manual trigger for testing periodic summary
# Fire this event from Developer Tools > Events to test periodic summary immediately
@@ -947,16 +929,12 @@ variables:
# Periodic Summary Settings
enable_periodic_summary: !input enable_periodic_summary
periodic_interval_hours: !input periodic_interval_hours
periodic_start_hour: !input periodic_start_hour
periodic_summary_message_template: !input periodic_summary_message
periodic_album_template: !input periodic_album_template
periodic_summary_image_url: !input periodic_summary_image_url
# Scheduled Assets Settings
enable_scheduled_assets: !input enable_scheduled_assets
scheduled_assets_interval_hours: !input scheduled_assets_interval_hours
scheduled_assets_start_hour: !input scheduled_assets_start_hour
scheduled_assets_album_mode: !input scheduled_assets_album_mode
scheduled_assets_limit: !input scheduled_assets_limit
scheduled_assets_favorite_only: !input scheduled_assets_favorite_only
@@ -970,7 +948,6 @@ variables:
# Memory Mode Settings
enable_memory_mode: !input enable_memory_mode
memory_mode_start_hour: !input memory_mode_start_hour
memory_mode_album_mode: !input memory_mode_album_mode
memory_mode_limit: !input memory_mode_limit
memory_mode_favorite_only: !input memory_mode_favorite_only
@@ -1270,15 +1247,14 @@ variables:
# ---------------------------------------------------------------------------
# Periodic Summary Variables
# ---------------------------------------------------------------------------
# Check if periodic summary should run (every N hours starting from start_hour)
# Formula: (current_hour - start_hour) % interval == 0
# Example: start_hour=12, interval=24 → sends at 12:00 daily
# Example: start_hour=9, interval=12 → sends at 09:00 and 21:00
# Check if periodic summary should run (at configured times)
# Manual test event (immich_album_watcher_test_periodic_summary) bypasses time check
# If event data contains automation_id, only matching automations respond
should_send_periodic_summary: >
{% if trigger.id in ['hourly_timer', 'periodic_summary'] and enable_periodic_summary %}
{% if trigger.platform == 'event' and trigger.event.event_type == 'immich_album_watcher_test_periodic_summary' %}
{% if enable_periodic_summary %}
{% if trigger.id == 'periodic_summary_timer' %}
{{ true }}
{% elif trigger.platform == 'event' and trigger.event.event_type == 'immich_album_watcher_test_periodic_summary' %}
{% set event_automation_id = trigger.event.data.automation_id | default('') %}
{% if event_automation_id | length > 0 %}
{{ automation_id == event_automation_id }}
@@ -1286,10 +1262,7 @@ variables:
{{ true }}
{% endif %}
{% else %}
{% set current_hour = now().hour %}
{% set start = periodic_start_hour | int %}
{% set interval = periodic_interval_hours | int %}
{{ (current_hour - start) % interval == 0 }}
{{ false }}
{% endif %}
{% else %}
{{ false }}
@@ -1329,22 +1302,23 @@ variables:
# ---------------------------------------------------------------------------
# Scheduled Assets Variables
# ---------------------------------------------------------------------------
# Check if scheduled assets should run (every N hours starting from start_hour)
# Check if scheduled assets should run (at configured times)
# Manual test event (immich_album_watcher_test_scheduled_assets) bypasses time check
# If event data contains automation_id, only matching automations respond
should_send_scheduled_assets: >
{% if trigger.id == 'scheduled_assets' and enable_scheduled_assets %}
{% if enable_scheduled_assets %}
{% if trigger.id == 'scheduled_assets_timer' %}
{{ true }}
{% elif trigger.platform == 'event' and trigger.event.event_type == 'immich_album_watcher_test_scheduled_assets' %}
{% set event_automation_id = trigger.event.data.automation_id | default('') %}
{% if event_automation_id | length > 0 %}
{{ automation_id == event_automation_id }}
{% else %}
{{ true }}
{% endif %}
{% elif trigger.id == 'hourly_timer' and enable_scheduled_assets %}
{% set current_hour = now().hour %}
{% set start = scheduled_assets_start_hour | int %}
{% set interval = scheduled_assets_interval_hours | int %}
{{ (current_hour - start) % interval == 0 }}
{% else %}
{{ false }}
{% endif %}
{% else %}
{{ false }}
{% endif %}
@@ -1360,21 +1334,23 @@ variables:
# ---------------------------------------------------------------------------
# Memory Mode Variables
# ---------------------------------------------------------------------------
# Check if memory mode should run (every N hours starting from start_hour)
# Check if memory mode should run (at configured times)
# Manual test event (immich_album_watcher_test_memory_mode) bypasses time check
# If event data contains automation_id, only matching automations respond
should_send_memory_mode: >
{% if trigger.id == 'memory_mode' and enable_memory_mode %}
{% if enable_memory_mode %}
{% if trigger.id == 'memory_mode_timer' %}
{{ true }}
{% elif trigger.platform == 'event' and trigger.event.event_type == 'immich_album_watcher_test_memory_mode' %}
{% set event_automation_id = trigger.event.data.automation_id | default('') %}
{% if event_automation_id | length > 0 %}
{{ automation_id == event_automation_id }}
{% else %}
{{ true }}
{% endif %}
{% elif trigger.id == 'hourly_timer' and enable_memory_mode %}
{% set current_hour = now().hour %}
{% set start = memory_mode_start_hour | int %}
{{ current_hour == start }}
{% else %}
{{ false }}
{% endif %}
{% else %}
{{ false }}
{% endif %}
@@ -1392,17 +1368,18 @@ variables:
# =============================================================================
condition:
# Allow through if:
# 1. Hourly timer or periodic summary trigger and should send periodic summary, scheduled assets, or memory mode
# 2. Scheduled assets trigger (manual test)
# 3. Memory mode trigger (manual test)
# 4. Event trigger and passes all event-based checks
# 1. Time-based triggers (periodic_summary_timer, scheduled_assets_timer, memory_mode_timer)
# 2. Manual test event triggers (periodic_summary, scheduled_assets, memory_mode)
# 3. Event trigger and passes all event-based checks
- condition: template
value_template: >
{% if trigger.id == 'scheduled_assets' %}
{% if trigger.id == 'periodic_summary_timer' %}
{{ should_send_periodic_summary }}
{% elif trigger.id == 'scheduled_assets_timer' %}
{{ should_send_scheduled_assets }}
{% elif trigger.id == 'memory_mode' %}
{% elif trigger.id == 'memory_mode_timer' %}
{{ should_send_memory_mode }}
{% elif trigger.id in ['hourly_timer', 'periodic_summary'] %}
{% elif trigger.platform == 'event' and trigger.event.event_type in ['immich_album_watcher_test_periodic_summary', 'immich_album_watcher_test_scheduled_assets', 'immich_album_watcher_test_memory_mode'] %}
{{ should_send_periodic_summary or should_send_scheduled_assets or should_send_memory_mode }}
{% else %}
{{ is_hub_tracked and is_album_tracked and should_notify }}

View File

@@ -1,3 +1,3 @@
{
"version": "1.35.0"
"version": "2.0.0"
}