Now that you understand the architecture, let's explore how to actually use the system in real-world scenarios.
Important
DTMF Command Disclaimer: All DTMF sequences shown in this documentation are examples only and vary by installation and user configuration. Your actual function/macro numbers in /etc/asterisk/rpt.conf may be different. Always verify your specific configuration before using DTMF commands.
Here are the most frequently used commands you'll want to memorize or program into macros:
*C900# - Default operations (reset to normal)
*C901# - Standard operations
*C902# - Daytime operations
*C903# - Nighttime operations
*C904# - Net operations (brief, relaxed timers)
*C905# - Tactical operations
*C906# - Weather alert mode
*C907# - Severe weather mode (aggressive)
*C908# - Stealth mode (no telemetry except CW ID)
*C909# - LiTZ alert (page control operators)
*C910# - Grandfather clock
*83XX# - Play message slot XX (00-99)
Common slots:
*8300# - Slot 00: CW ID
*8370# - Slot 70: Current temperature
*8371# - Slot 71: Wind conditions
*8379# - Slot 79: UV index warning (if active)
*8396# - Slot 96: "Net in 1 minute"
*8397# - Slot 97: "Net in 5 minutes"
*8398# - Slot 98: "Net in 10 minutes"
*8399# - Slot 99: "Net in 15 minutes"
*C801# - Enable Special ID
*C802# - Disable Special ID
*C803# - Enable tail messages
*C804# - Disable tail messages
*C805# - Enable ID rotation
*C806# - Disable ID rotation
Goal: Switch from nighttime to daytime operations
# Via DTMF:
*C902# # Switch to daytime mode
# Or via command line (remote management):
ssh user@repeater.example.com "sudo -u asterisk /opt/app_rpt/bin/statekeeper.sh daytime"What happens automatically:
- Tail messages switch to daytime rotation
- Timers adjust for active operations
- Temperature announcements enabled
- System state changes to "daytime"
Goal: Switch to net mode, announce countdown warnings
15 minutes before net:
*8399# # Play "Net in 15 minutes"
10 minutes before net:
*8398# # Play "Net in 10 minutes"
5 minutes before net:
*8397# # Play "Net in 5 minutes"
1 minute before net:
*8396# # Play "Net in 1 minute"
At net start:
*C904# # Switch to net mode
What net mode does:
- Changes courtesy tone to "net tone"
- Suppresses telemetry (time, temperature)
- Relaxes timers (longer hang time, no timeout)
- Keeps tail messages brief
After net ends:
*C900# # Return to default operations
When NOAA alert detected, weatheralert.sh automatically:
- Detects alert via API poll (every minute)
- Switches to weather alert or severe weather mode
- Changes tail message to announce alert
- (Severe only) Sends two-tone page
Manual weather alert invocation:
*C906# # Weather alert mode (routine)
*C907# # Severe weather mode (aggressive)
Check current weather:
*8370# # Temperature
*8371# # Wind
*8372# # Pressure
*8373# # Humidity
Check space weather:
*8362# # Geomagnetic storm (if active)
*8365# # Radio blackout (if active)
*8368# # Solar radiation (if active)
Return to normal after alert clears:
*C900# # weatheralert.sh will auto-clear when alert expires
Goal: Minimal telemetry, distinct courtesy tone, emergency-ready
*C905# # Tactical mode
*C804# # Disable tail messages (optional - already suppressed)
What tactical mode does:
- Tactical courtesy tone
- Suppresses time/temp announcements
- Keeps essential IDs only
- Adjusts timers for rapid communication
If complete radio silence needed (except CW ID):
*C908# # Stealth mode
Return to normal:
*C900# # Default operations
These user-facing utilities aren't in cron but are available for manual invocation or DTMF integration:
Purpose: Announces IP addresses for remote management
Usage:
/opt/app_rpt/bin/sayip.sh [interface]
# Examples:
/opt/app_rpt/bin/sayip.sh eth0 # LAN IP address
/opt/app_rpt/bin/sayip.sh wlan0 # WiFi IP address
/opt/app_rpt/bin/sayip.sh tun0 # VPN IP address
/opt/app_rpt/bin/sayip.sh # All configured interfacesDTMF Integration (add to rpt.conf):
[functions]
9001=cmd,/opt/app_rpt/bin/sayip.sh eth0
9002=cmd,/opt/app_rpt/bin/sayip.sh wlan0What it does:
- Reads IP address from
ip addr show - Converts to TMS5220 speech: "ethernet address 192.168.1.100"
- Plays via
rpt localplay
Use case: You're on the road, need to SSH into your repeater, but don't remember the IP. Key *9001# and listen!
Purpose: Spell out text character-by-character using phonetic alphabet
Usage:
/opt/app_rpt/bin/speaktext.sh "text" [File]
# Examples:
/opt/app_rpt/bin/speaktext.sh "w3xyz"
# Spells: "W 3 X Y Z" and plays immediately
/opt/app_rpt/bin/speaktext.sh "192.168.1.1" File
# Spells: "1 9 2 POINT 1 6 8 POINT 1 POINT 1"
# Generates /tmp/speakfile.ulaw without playingHow it works:
- Converts text to lowercase
- Processes character-by-character:
- Letters (A-Z): Uses
letters/directory - Digits (0-9): Uses
digits/directory - Special chars:
. + - = @ # *(says "point", "plus", "minus", etc.)
- Letters (A-Z): Uses
- Concatenates character audio into
/tmp/speakfile.ulaw - Plays via
rpt localplay(unless "File" argument given)
Use case: Spelling out callsigns, IP addresses, serial numbers, or short identifiers
Note: This script spells character-by-character, it does NOT speak full words. For word-based speech, use the TMS5220 vocabulary files directly (see TABLES.md) or record custom messages with msgwriter.sh.
Purpose: Control GPIO pins for external hardware (relays, indicators, sensors)
Usage:
/opt/app_rpt/bin/gpio.sh <pin> <on|off|read>
# Examples:
/opt/app_rpt/bin/gpio.sh 17 on # Turn on GPIO17 (relay/LED)
/opt/app_rpt/bin/gpio.sh 17 off # Turn off GPIO17
/opt/app_rpt/bin/gpio.sh 27 read # Read GPIO27 status (sensor)DTMF Integration for remote control:
[functions]
9101=cmd,/opt/app_rpt/bin/gpio.sh 17 on # Activate relay 1
9102=cmd,/opt/app_rpt/bin/gpio.sh 17 off # Deactivate relay 1
9111=cmd,/opt/app_rpt/bin/gpio.sh 27 on # Activate relay 2
9112=cmd,/opt/app_rpt/bin/gpio.sh 27 off # Deactivate relay 2Real-world applications:
- Repeater site control: Turn on/off equipment (fans, heaters, transmitters)
- Status indicators: LED panel showing repeater mode
- Security: Door locks, camera triggers
- Sensors: Read door status, temperature sensors, battery voltage
Hardware requirements:
- Raspberry Pi or similar with GPIO pins
- Relay modules for switching AC/DC loads
- LEDs with current-limiting resistors
- Sensors with appropriate interfaces
Example: Remote fan control
# Check temperature
TEMP=$(asterisk -rx "rpt stats 1999" | grep -i temperature | awk '{print $NF}')
# If over 80°F, turn on fan via GPIO
if [[ ${TEMP%%.*} -gt 80 ]]; then
/opt/app_rpt/bin/gpio.sh 17 on
# Play pre-recorded message (create with msgwriter.sh)
asterisk -rx "rpt localplay 1999 /opt/app_rpt/sounds/custom/fan_on"
fiPurpose: Announce WiFi connection status and signal strength
Usage:
/opt/app_rpt/bin/wireless.sh [interface]
# Examples:
/opt/app_rpt/bin/wireless.sh wlan0 # Specific interface
/opt/app_rpt/bin/wireless.sh # Default wireless interfaceDTMF Integration:
[functions]
9003=cmd,/opt/app_rpt/bin/wireless.shWhat it announces:
- Connected/disconnected status
- SSID name
- Signal strength (excellent/good/fair/poor)
- Link quality percentage
Use case: Remote site monitoring - is the wireless backhaul still connected?
Output example: "wireless connected to repeater backhaul signal strength excellent"
Goal: Automatically switch modes based on NOAA alerts
How it works (already configured):
weatheralert.shpolls NOAA every minute- Detects alerts for your NWSZONE
- Classifies severity (routine vs. severe)
- Calls
statekeeper.shautomatically:- Routine:
statekeeper.sh weatheralert - Severe:
statekeeper.sh severeweather(with two-tone page)
- Routine:
What you hear:
- Routine alert: Tail message changes to "weather alert", normal operations
- Severe alert: Two-tone page (330Hz + 569Hz), tail message "severe weather alert", timers relaxed
Manual testing:
# Simulate weather alert
sudo -u asterisk /opt/app_rpt/bin/statekeeper.sh weatheralert
# Simulate severe weather
sudo -u asterisk /opt/app_rpt/bin/statekeeper.sh severeweather
# Return to normal
sudo -u asterisk /opt/app_rpt/bin/statekeeper.sh defaultGoal: Automatically switch between daytime/nighttime modes
Method 1: Asterisk scheduler (rpt.conf)
[schedule]
; At 0700 local time, switch to daytime
0 7 * * * = C902 ; Daytime mode
; At 2200 local time, switch to nighttime
0 22 * * * = C900 ; Default (or use C903 for nighttime)Method 2: Cron job
# Add to asterisk user crontab:
0 7 * * * /opt/app_rpt/bin/statekeeper.sh daytime
0 22 * * * /opt/app_rpt/bin/statekeeper.sh defaultWhy use scheduler vs. cron?
- Scheduler: Integrated with Asterisk, respects local timezone, can be overridden via DTMF
- Cron: Independent of Asterisk, survives Asterisk restarts, more flexible
Goal: Play custom "net starting" message before switching to net mode
Steps:
-
Record custom message:
# From a phone (DTMF) *88025# # Start recording to slot 25 (demonstration_1) # Speak your message # # Hang up to finish
-
Create macro in
rpt.conf:[macro] 9900=*8325#*C904# ; Play slot 25, then switch to net mode
-
Use it:
*9900# # Plays your custom message, then enters net mode
Goal: Hub fetches weather data once, child nodes use cached data
Hub node configuration (config.ini):
FETCHLOCAL=0 # Hub fetches from Weather Underground
WUAPIKEY=your_key # Your Weather Underground API key
WUSTATION=KSTEXAS123 # Local weather stationChild node configuration (config.ini):
FETCHLOCAL=1 # Pull from hub
FETCHPOINT=hub.example.com # Hub hostname/IP
AUTOUPGRADE=1 # Auto-upgrade when hub version changesWhat happens:
- Hub runs
weatherkeeper.shevery 15 minutes, fetches from WU API - Hub stores data in
/opt/app_rpt/lib/wunderground.out - Child nodes run
configkeeper.shevery 5 minutes configkeeper.shsyncs/opt/app_rpt/lib/from hub viarsync- Child nodes use cached weather data (no API calls)
- All nodes announce same weather data
- API rate limits: 1 request serves 10 nodes!
Benefits:
- Single API key for entire network
- Consistent weather data across sites
- Centralized version control
- Auto-upgrade capability
Goal: Check remote repeater site status from any radio
Custom monitoring script (/opt/app_rpt/bin/sitestatus.sh):
#!/bin/bash
source /opt/app_rpt/bin/common.sh
# Announce site name
asterisk -rx "rpt localplay ${MYNODE} ${SOUNDS}/custom/site_name"
# IP address
/opt/app_rpt/bin/sayip.sh eth0
# Wireless status
/opt/app_rpt/bin/wireless.sh wlan0
# Temperature
asterisk -rx "rpt localplay ${MYNODE} ${SOUNDS}/wx/temp"
# System uptime (spell out the number)
UPTIME_DAYS=$(awk '{print int($1/86400)}' /proc/uptime)
/opt/app_rpt/bin/speaktext.sh "${UPTIME_DAYS}" # Spells digits: "3 5" for 35 daysDTMF integration (rpt.conf):
[functions]
9999=cmd,/opt/app_rpt/bin/sitestatus.sh # Site status reportUsage: Key *9999# from any radio to hear complete site status!
Goal: Create a custom courtesy tone using Audacity or other audio editor
Steps:
-
Record/edit audio:
- Keep it short (< 500ms)
- Export as 8kHz, mono, µlaw (.ulaw)
-
Upload to repeater:
scp my_custom_ct.ulaw user@repeater.example.com:/tmp/ ssh user@repeater.example.com "sudo mv /tmp/my_custom_ct.ulaw /opt/app_rpt/sounds/custom/ct99.ulaw" -
Configure in config.ini:
CTCUSTOM=ct99 # Your custom tone
-
Use in statekeeper.sh or apply manually:
/opt/app_rpt/bin/ctkeeper.sh ct99
Goal: Add your own voice announcement as tail message
Method 1: Via DTMF (easiest)
*88011# # Record to slot 11 (tail_message_1)
# Speak: "Welcome to the W1XYZ repeater system"
# # Hang up
Method 2: Via command line
# Record from phone, upload .ulaw file
scp my_tail.ulaw user@repeater.example.com:/tmp/
ssh user@repeater.example.com "sudo mv /tmp/my_tail.ulaw /opt/app_rpt/sounds/tails/tail_message_1.ulaw"Enable rotation:
# config.ini
ROTATETMSG=1 # Enable tail rotation
TAILMSG=1 # Use tail_message_1Goal: Include space weather alerts in tail message rotation
Edit tailkeeper.sh (around line 50):
# Add after temperature/time logic:
if [[ -f "${SOUNDS}/weather/space_geomag_minor.ulaw" ]]; then
asterisk -rx "rpt playback ${MYNODE} ${SOUNDS}/weather/space_geomag_minor"
elif [[ -f "${SOUNDS}/weather/space_radio_moderate.ulaw" ]]; then
asterisk -rx "rpt playback ${MYNODE} ${SOUNDS}/weather/space_radio_moderate"
fiOr use DTMF manually when storm detected:
*8362# # Play geomagnetic storm alert (if active)
Goal: Physical panic button triggers emergency broadcast
Hardware: Button connected to GPIO23 (pull-down resistor)
Monitoring script (/opt/app_rpt/bin/panic_monitor.sh):
#!/bin/bash
while true; do
# Read GPIO23
STATUS=$(/opt/app_rpt/bin/gpio.sh 23 read)
if [[ "$STATUS" == "HIGH" ]]; then
# Panic button pressed!
asterisk -rx "rpt localplay 1999 /opt/app_rpt/sounds/custom/emergency_broadcast"
# Send two-tone page
asterisk -rx "rpt localplay 1999 |it330,569,3000"
# Switch to tactical mode
/opt/app_rpt/bin/statekeeper.sh tactical
# Wait for button release
sleep 5
fi
sleep 1
doneRun as systemd service (survives reboots):
# Create /etc/systemd/system/panic-monitor.service
sudo systemctl enable panic-monitor
sudo systemctl start panic-monitorProblem: Temperature not announcing
# Check if weatherkeeper is running
sudo crontab -u asterisk -l | grep weatherkeeper
# Check if API key configured
grep WUAPIKEY /opt/app_rpt/config.ini
# Manually run to see errors
sudo -u asterisk /opt/app_rpt/bin/weatherkeeper.sh
# Check generated file
ls -lh /opt/app_rpt/sounds/wx/temp.ulawProblem: IDs not rotating
# Check rotation enabled
grep ROTATEIIDS /opt/app_rpt/config.ini # Should be 1
# Check cron job
sudo crontab -u asterisk -l | grep idkeeper
# Manually trigger rotation
sudo -u asterisk /opt/app_rpt/bin/idkeeper.sh
# Check which ID is active
grep idrecording /etc/asterisk/rpt.confProblem: Kerchunk detection not working
# Check service running
sudo systemctl status kerchunkd
# Check logs
tail -f /var/log/app_rpt.log | grep kerchunk
tail -f /var/log/kerchunk_stats.log
# Verify configuration
grep ^KERCHUNK /opt/app_rpt/config.iniProblem: DTMF commands not working
# Check macro defined
grep "^9000=" /etc/asterisk/rpt.conf
# Test from Asterisk CLI
asterisk -rx "rpt fun 1999 *C900"
# Check function vs. macro syntax
# Functions: single action
# Macros: multiple actions (needs macro= section)You now have:
- ✅ 10 system states for different operations
- ✅ 100 message slots for dynamic content
- ✅ Automated weather monitoring and alerts
- ✅ Space weather integration
- ✅ Kerchunk detection (passive logging or active deterrence)
- ✅ Custom courtesy tones and messages
- ✅ GPIO control for site automation
- ✅ Network utilities (IP address, wireless status)
- ✅ Distributed architecture for multi-site deployments
- ✅ DTMF remote control for everything
Next: Dive into the detailed Script Reference to understand each component in depth!