diff --git a/README.md b/README.md index 39cc2f3..0a1c581 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ SkywarnPlus can use the free Pushover API to send WX alert notifications and deb # Control Script -SkywarnPlus comes with a powerful control script (`SkyControl.py`) that can be used to enable or disable certain SkywarnPlus functions. This script is particularly useful when you want to map DTMF control codes to these functions. An added advantage is that the script provides spoken feedback upon execution, making it even more suitable for DTMF control. +SkywarnPlus comes with a powerful control script (`SkyControl.py`) that can be used to enable or disable certain SkywarnPlus functions via shell, without manually editing `config.yaml`. This script is particularly useful when you want to map DTMF control codes to these functions. An added advantage is that the script provides spoken feedback upon execution, making it even more suitable for DTMF control. ## Usage diff --git a/SOUNDS/ALERTS/SWP81.wav b/SOUNDS/ALERTS/SWP81.wav new file mode 100644 index 0000000..660f528 Binary files /dev/null and b/SOUNDS/ALERTS/SWP81.wav differ diff --git a/SOUNDS/ALERTS/SWP82.wav b/SOUNDS/ALERTS/SWP82.wav new file mode 100644 index 0000000..5a2b7e5 Binary files /dev/null and b/SOUNDS/ALERTS/SWP82.wav differ diff --git a/SOUNDS/ALERTS/SWP83.wav b/SOUNDS/ALERTS/SWP83.wav new file mode 100644 index 0000000..77dd413 Binary files /dev/null and b/SOUNDS/ALERTS/SWP83.wav differ diff --git a/SOUNDS/ALERTS/SWP84.wav b/SOUNDS/ALERTS/SWP84.wav new file mode 100644 index 0000000..8c03bda Binary files /dev/null and b/SOUNDS/ALERTS/SWP84.wav differ diff --git a/SkyControl.py b/SkyControl.py new file mode 100644 index 0000000..b807b70 --- /dev/null +++ b/SkyControl.py @@ -0,0 +1,81 @@ +#!/usr/bin/python3 +# SkyControl.py +# A Control Script for SkywarnPlus v0.2.0 +# by Mason Nelson (N5LSN/WRKF394) +# +# This script allows you to change the value of specific keys in the SkywarnPlus config.yaml file. +# It's designed to enable or disable certain features of SkywarnPlus from the command line. +# It is case-insensitive, accepting both upper and lower case parameters. +# +# Usage: python3 SkyControl.py +# Example: python3 SkyControl.py sayalert false +# This will set 'SayAlert' to 'False' in the config.yaml file. + +import sys +import yaml +import subprocess +from pathlib import Path + +# Define valid keys and corresponding audio files +VALID_KEYS = { + "enable": {"key": "Enable", "section": "SKYWARNPLUS", "true_file": "SWP85.wav", "false_file": "SWP86.wav"}, + "sayalert": {"key": "SayAlert", "section": "Alerting", "true_file": "SWP87.wav", "false_file": "SWP88.wav"}, + "sayallclear": {"key": "SayAllClear", "section": "Alerting", "true_file": "SWP89.wav", "false_file": "SWP90.wav"}, + "tailmessage": {"key": "Enable", "section": "Tailmessage", "true_file": "SWP91.wav", "false_file": "SWP92.wav"}, + "courtesytone": {"key": "Enable", "section": "CourtesyTones", "true_file": "SWP93.wav", "false_file": "SWP94.wav"}, + "alertscript": {"key": "Enable", "section": "AlertScript", "true_file": "SWP81.wav", "false_file": "SWP82.wav"}, + "idchange": {"key": "Enable", "section": "IDChange", "true_file": "SWP83.wav", "false_file": "SWP84.wav"}, +} + +# Get the directory of the script +SCRIPT_DIR = Path(__file__).parent.absolute() + +# Get the configuration file +CONFIG_FILE = SCRIPT_DIR / "config.yaml" + +# Check if the correct number of arguments are passed +if len(sys.argv) != 3: + print("Incorrect number of arguments. Please provide the key and the new value.") + print("Usage: python3 {} ".format(sys.argv[0])) + sys.exit(1) + +# The input key and value +key, value = sys.argv[1:3] + +# Make sure the provided key is valid +if key not in VALID_KEYS: + print("The provided key does not match any configurable item.") + sys.exit(1) + +# Make sure the provided value is either 'true', 'false' or 'toggle' +if value not in ['true', 'false', 'toggle']: + print("Invalid value. Please provide either 'true' or 'false' or 'toggle'.") + sys.exit(1) + +# Convert the input value to boolean if not 'toggle' +if value != 'toggle': + value = value.lower() == 'true' + +# Load the config file +with open(str(CONFIG_FILE), 'r') as f: + config = yaml.safe_load(f) + +# Check if toggle is required +if value == 'toggle': + current_value = config[VALID_KEYS[key]['section']][VALID_KEYS[key]['key']] + value = not current_value + +# Update the key in the config +config[VALID_KEYS[key]['section']][VALID_KEYS[key]['key']] = value + +# Save the updated config back to the file +with open(str(CONFIG_FILE), 'w') as f: + yaml.dump(config, f) + +# Get the correct audio file based on the new value +audio_file = VALID_KEYS[key]['true_file'] if value else VALID_KEYS[key]['false_file'] + +# Play the corresponding audio message on all nodes +nodes = config['Asterisk']['Nodes'] +for node in nodes: + subprocess.run(['/usr/sbin/asterisk', '-rx', 'rpt localplay {} {}/SOUNDS/ALERTS/{}'.format(node, SCRIPT_DIR, audio_file.rsplit(".", 1)[0])]) \ No newline at end of file diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..afd1f42 --- /dev/null +++ b/config.yaml @@ -0,0 +1,257 @@ +# SkywarnPlus v0.2.0 Configuration File +# Author: Mason Nelson (N5LSN/WRKF394) +# Please edit this file according to your specific requirements. +# +# This config file is structured YAML. Please be sure to maintain the structure when editing. +# YAML is very picky about indentation. Use spaces, not tabs. + +################################################################################################################################ + +SKYWARNPLUS: + # Toggle the entire SkywarnPlus operation. + # Set to 'True' to activate or 'False' to disable. + # Example: Enable: true + Enable: true + +################################################################################################################################ + +Asterisk: + # List of node numbers for broadcasting alerts. Multiple nodes are specified as a list. + # Example: + # Nodes: + # - 1998 + # - 1999 + Nodes: + - YOUR_NODE_NUMBER_HERE + +################################################################################################################################ + +Alerting: + # Specify the county codes for which you want to pull weather data. + # Find your county codes at https://alerts.weather.gov/. + # Make sure to use county codes ONLY, NOT zone codes, otherwise you might miss out on alerts. + # Example: + # CountyCodes: + # - ARC121 + # - ARC021 + CountyCodes: + - YOUR_COUNTY_CODE_HERE + # Enable instant voice announcement when new weather alerts are issued. + # Set to 'True' for enabling or 'False' for disabling. + # Example: SayAlert: true + SayAlert: true + # Enable instant voice announcement when weather alerts are cleared. + # Set to 'True' for enabling or 'False' for disabling. + # Example: SayAllClear: true + SayAllClear: true + # Limit the maximum number of alerts to process in case of multiple alerts. + # SkywarnPlus fetches all alerts, orders them by severity, and processes only the 'n' most severe alerts, where 'n' is the MaxAlerts value. + # MaxAlerts: + # Specify an alternative path to the directory where sound files are located. + # Default is SkywarnPlus/SOUNDS. + # SoundsPath: + +################################################################################################################################ + +Blocking: + # List of globally blocked events. These alerts are ignored across the entire SkywarnPlus operation. + # Use a case-sensitive list. Wildcards can be used. + # Example: + # GlobalBlockedEvents: + # - Flood Watch + # - *Statement + # - *Advisory + GlobalBlockedEvents: + # List of events blocked from being announced when received. These alerts will still be added to the tail message. + # Use a case-sensitive list. + SayAlertBlockedEvents: + # List of events blocked from being added to the tail message. These alerts will still be announced when received. + # Use a case-sensitive list. + TailmessageBlockedEvents: + +################################################################################################################################ + +Tailmessage: + # Configuration for the tail message functionality. Requires initial setup in RPT.CONF. + # Set 'Enable' to 'True' for enabling or 'False' for disabling. + Enable: false + # Specify an alternative path and filename for saving the tail message. + # Default is SkywarnPlus/SOUNDS/wx-tail.wav. + # TailmessagePath: + +################################################################################################################################ + +CourtesyTones: + # Configuration for the Courtesy Tones. Requires initial setup in RPT.CONF. + # Set 'Enable' to 'True' for enabling or 'False' for disabling. + Enable: false + # Specify an alternative directory where tone files are located. + # Default is SkywarnPlus/SOUNDS/TONES. + # ToneDir: + # Define the sound files for various types of courtesy tones. + Tones: + # Normal local courtesy tone. + LocalCT: BOOP.ulaw + # Normal link courtesy tone. + LinkCT: BEEP.ulaw + # Weather courtesy tone (both local and link). + WXCT: WX-CT.ulaw + # rpt.conf file's local courtesy tone. + RptLocalCT: CT-LOCAL.ulaw + # rpt.conf file's link courtesy tone. + RptLinkCT: CT-LINK.ulaw + # Define the alerts that trigger the weather courtesy tone. + # Use a case-sensitive list. One alert per line for better readability. + CTAlerts: + - Hurricane Force Wind Warning + - Severe Thunderstorm Warning + - Tropical Storm Warning + - Coastal Flood Warning + - Winter Storm Warning + - Thunderstorm Warning + - Extreme Wind Warning + - Storm Surge Warning + - Dust Storm Warning + - Avalanche Warning + - Ice Storm Warning + - Hurricane Warning + - Blizzard Warning + - Tornado Warning + - Tornado Watch + +################################################################################################################################ + +IDChange: + # Configuration for Automatic ID Changing. Requires initial setup in RPT.CONF and manual creation of audio files. + Enable: false + # Specify an alternative directory where ID files are located. + # Default is SkywarnPlus/SOUNDS/ID. + # IDDir: + # Define the sound files for normal ID and weather ID. + IDs: + NormalID: ID.ulaw + WXID: WXID.ulaw + # Define the sound file rpt.conf is looking for as normal ID. + RptID: RPTID.ulaw + # Define the alerts that trigger the weather ID. + # Use a case-sensitive list. One alert per line for better readability. + IDAlerts: + - Hurricane Force Wind Warning + - Severe Thunderstorm Warning + - Tropical Storm Warning + - Coastal Flood Warning + - Winter Storm Warning + - Thunderstorm Warning + - Extreme Wind Warning + - Storm Surge Warning + - Dust Storm Warning + - Avalanche Warning + - Ice Storm Warning + - Hurricane Warning + - Blizzard Warning + - Tornado Warning + - Tornado Watch + +################################################################################################################################ + +AlertScript: + # Completely enable/disable AlertScript + Enable: false + Mappings: + # Define the mapping of alerts to either DTMF commands or bash scripts here. + # Wildcards (*) can be used in the ALERTS for broader matches. + # Examples: + # + # This entry will execute the bash command 'asterisk -rx "rpt fun 1999 *123*456*789"' + # when the alerts "Tornado Warning" AND "Tornado Watch" are detected. + # + # - Type: DTMF + # Nodes: + # - 1999 + # Commands: + # - '*123*456*789' + # Triggers: + # - Tornado Warning + # - Tornado Watch + # Match: ALL + # + # This entry will execute the bash command '/home/repeater/testscript.sh' + # and the bash command '/home/repeater/saytime.sh' when an alert whose + # title ends with "Statement" is detected. + # + # - Type: BASH + # Commands: + # - '/home/repeater/testscript.sh' + # - '/home/repeater/saytime.sh' + # Triggers: + # - *Statement + # + # This entry will execute the bash command 'asterisk -rx "rpt fun 1998 *123*456*789"' + # and the bash command 'asterisk -rx "rpt fun 1999 *123*456*789"' when an alert + # titled "Tornado Warning" OR "Tornado Watch" is detected. + # + # - Type: DTMF + # Nodes: + # - 1998 + # - 1999 + # Commands: + # - '*123*456*789' + # Triggers: + # - Tornado Warning + # - Tornado Watch + # + # This entry will execute the bash command 'asterisk -rx "rpt fun 1999 *123*456*789"' + # and the bash command 'asterisk -rx "rpt fun 1999 *987*654*321"' + # when an alert titled "Tornado Warning" OR "Tornado Watch" is detected. + # + # - Type: DTMF + # Nodes: + # - 1999 + # Commands: + # - '*123*456*789' + # - '*987*654*321' + # Triggers: + # - Tornado Warning + # - Tornado Watch + # Match: ANY + # + - Type: BASH + Commands: + - 'echo "Tornado Warning detected!"' + Triggers: + - Tornado Warning + +################################################################################################################################ + +Pushover: + # Configuration for Pushover integration. Pushover is a free notification service. Register at https://pushover.net/. + Enable: false + # Provide your user key obtained from Pushover. + UserKey: + # Provide the API token obtained from Pushover. + APIToken: + # Enable verbose messaging + Debug: false + +################################################################################################################################ + +Logging: + # Enable verbose logging + Debug: false + # Specify an alternative log file path. + # LogPath: + +################################################################################################################################ + +DEV: + # Delete cached data on startup + CLEANSLATE: false + # Specify the TMP directory. + TmpDir: /tmp/SkywarnPlus + # Enable test alert injection instead of calling the NWS API by setting 'INJECT' to 'True'. + INJECT: false + # List the test alerts to inject. Use a case-sensitive list. One alert per line for better readability. + INJECTALERTS: + - Tornado Warning + - Tornado Watch + - Severe Thunderstorm Warning \ No newline at end of file