Skip to content

Scheduled Announcements

Larry K. Aycock edited this page Aug 9, 2026 · 3 revisions

Scheduled Announcements

Clock-triggered, independent of node activity.

Features

  • Plays a specific file on a cron-style schedule (MIN HOUR DOM MON DOW) — fire once at a specific time, every N minutes, on selected days, and more
  • Local or global playback — each scheduled announcement can play locally on this node only (rpt localplay, the default) or globally to all connected/linked nodes (rpt playback)
  • Waits for unkey — if the node is currently keyed when a scheduled announcement is due, it holds off rather than playing over live traffic, and keeps checking until the node unkeys
  • Takes precedence over tail messages — if a scheduled announcement and a tail message would both fire at the same moment, the scheduled announcement always plays; the tail message simply retries on its next unkey once the announcement has finished, with no penalty against MinInterval
  • Per-announcement enable/disable — disable an entry without removing it (herald toggle-schedule <name> or the web UI Status toggle); re-enable it the same way
  • Adjustable TTS speech speed — a 0.5x2.0x slider per entry, see Voices & TTS Engines

Entries can be edited in place (name, text, voice, schedule, play mode, speed) via herald edit-schedule or the web UI, instead of removing and re-adding.

Node targeting for multinodes= setups: any scheduled entry can optionally carry a Node override, targeting a specific node number for playback instead of the daemon's own configured Node.

How It Works

Scheduled announcements run on a separate time-based path, unaffected by the tail message interval or node activity. Every poll, scheduled announcements are checked first, before the unkey/tail-message logic.

They're driven by a standard 5-field cron expression (MIN HOUR DOM MON DOW) and can fire once at a specific time, at a repeating interval (e.g. */20 * * * * = every 20 minutes), or on any cron-expressible schedule. Each entry fires at most once per matching minute; a */20 entry fires three times an hour, not once per day.

If the node is currently keyed when a scheduled announcement is due, it holds off and keeps re-checking every poll — even after the matching minute has passed — until the node unkeys, rather than missing the announcement or talking over live traffic. Once a scheduled announcement plays, its estimated audio duration (via soxi, or an 8-second fallback estimate) holds off any tail message for that long, so the two never overlap — this is also how a scheduled announcement takes precedence when both would fire at the same moment.

Cron Field Reference

MIN (0–59)   HOUR (0–23)   DOM = Day of Month (1–31)   MON = Month (1–12)   DOW = Day of Week (0=Sun, 1=Mon … 6=Sat)

Use * for every, */n for every-n, n,m for specific values, n-m for a range.

sudo herald add-schedule "ARRL Audio News follows" --name arrl-news --cron "30 7 * * 6"   # Saturdays at 7:30 AM
sudo herald add-schedule "Net check-in time" --name net-checkin --cron "*/20 * * * *"      # every 20 minutes
sudo herald add-schedule "Hourly ID" --name hourly-id --cron "30 * * * *"                  # every hour at :30

herald Commands

Command Description
sudo herald add-schedule "<text>" --name <name> --cron "MIN HOUR DOM MON DOW" [--voice <voice>] [--play-mode local|global] [--node <n>] Generate TTS WAV and schedule it
sudo herald add-schedule-file <path> --name <name> --cron "MIN HOUR DOM MON DOW" [--play-mode local|global] [--node <n>] Schedule an existing WAV file
sudo herald edit-schedule <name> [--new-name <n>] [--cron "MIN HOUR DOM MON DOW"] [--play-mode local|global] [--text "<text>"] [--voice <v>] [--file <path>] [--node <n>] Edit an existing scheduled announcement in place
sudo herald toggle-schedule <name> Enable or disable a scheduled announcement without removing it
sudo herald remove <name> Remove a scheduled announcement
sudo herald play <name> Test-play an announcement on the node immediately (always local, ignores PlayMode)

Example Config

Scheduled:
  - Name: "ARRL Audio News"
    Cron: "30 7 * * 6"           # Saturdays at 7:30 AM
    File: /etc/asterisk/scripts/herald/announcements/scheduled/arrl-news.wav
    Enabled: true

  - Name: "Second Saturday Breakfast Net"
    Cron: "0 8 8-14 * 6"         # 2nd Saturday (DOM 8-14, DOW 6) at 8:00 AM
    File: /etc/asterisk/scripts/herald/announcements/scheduled/breakfast-net.wav
    Enabled: true

See Configuration Reference for every field.

Clone this wiki locally