🌤️ A complete all-in-one solution for downloading weather data from Weather Underground and transmitting it to the APRS-IS network.
This script combines weather data collection from Weather Underground with APRS (Automatic Packet Reporting System) transmission capabilities, allowing amateur radio operators to send weather station data to the global APRS network with a single command.
- 🎯 One Command Solution: Download weather data and transmit to APRS-IS in one step
- 💾 Configuration Storage: Save your station ID, callsign, passcode, and API key for easy reuse
- ⏰ Scheduled Transmissions: Automatic weather station mode with configurable intervals (default: 15 minutes)
- 📍 Real Coordinates: Uses actual latitude/longitude from Weather Underground API
- 🌐 Global APRS Network: Transmits to APRS-IS servers worldwide with automatic failover
- 🔒 Secure Authentication: Uses official APRS-IS passcodes for secure transmission
- 🛡️ Error Handling: Robust handling of missing data and null values
- 🎨 Simple Interface: User-friendly command-line interface with helpful error messages
# Save your configuration interactively
python wunderground_to_aprs_sender.py --save-config
# Or save configuration with command line arguments
python wunderground_to_aprs_sender.py --save-config STATION_ID CALLSIGN PASSCODE --api-key YOUR_API_KEY# Just run the script with no arguments (single transmission)
python wunderground_to_aprs_sender.py
# Run as automatic weather station (every 15 minutes)
python wunderground_to_aprs_sender.py --schedule
# Run with custom interval (every 30 minutes)
python wunderground_to_aprs_sender.py --schedule --interval 30python wunderground_to_aprs_sender.py STATION_ID CALLSIGN PASSCODE# Save configuration from Czech station IXXXXX1
python wunderground_to_aprs_sender.py --save-config IXXXXX1 YOUR_CALLSIGN YOUR_PASSCODE --api-key YOUR_API_KEY
# Single transmission using no arguments (uses saved configuration automatically!)
python wunderground_to_aprs_sender.py
# Automatic weather station mode (every 15 minutes)
python wunderground_to_aprs_sender.py --schedule
# Custom interval automatic mode (every 20 minutes)
python wunderground_to_aprs_sender.py --schedule --interval 20
# Traditional one-time usage
python wunderground_to_aprs_sender.py KLAX N6ABC 23456 --server noam.aprs2.net
# Show your current saved configuration
python wunderground_to_aprs_sender.py --show-config- Python 3.7+
- Valid amateur radio license and callsign
- Internet connection
- APRS-IS passcode (for transmitting)
- Weather Underground API key (optional, but recommended for real data)
- Clone or download the script
- Install dependencies:
pip install -r requirements.txt
- Set up your configuration (recommended):
python wunderground_to_aprs_sender.py --save-config
- Run the script:
python wunderground_to_aprs_sender.py
Before (traditional method):
python wunderground_to_aprs_sender.py IXXXXX1 YOUR_CALLSIGN YOUR_PASSCODE --api-key 8298c13da23c45ea98c13da23cc5ea53 --server euro.aprs2.netAfter (with configuration):
# Single transmission
python wunderground_to_aprs_sender.py
# Automatic weather station
python wunderground_to_aprs_sender.py --scheduleBenefits:
- ✅ Security: No passwords visible in command history
- ✅ Convenience: One simple command every time
- ✅ Automation: Perfect for cron jobs and scheduled tasks
- ✅ Sharing: Easy to run the same setup on multiple computers
- ✅ Default: No arguments needed - just run the script!
- ✅ Scheduling: Automatic weather station mode with --schedule
--save-config: Save current settings to configuration file--use-config: Use saved configuration (this is the default when no arguments provided)--show-config: Show current saved configuration--delete-config: Delete saved configuration file
--schedule: Run continuously, sending weather data at regular intervals--interval MINUTES: Interval between transmissions in minutes (default: 15)
station_id: Weather station ID (e.g., IXXXXX1, KLAX, KDFW)callsign: Your amateur radio callsignpasscode: APRS-IS passcode for transmitting
--station STATION: Weather station ID (alternative to positional argument)--server SERVER: Specific APRS-IS server hostname--api-key API_KEY: Weather Underground API key
Turn your computer into an automatic APRS weather station that sends data at regular intervals:
# Run every 15 minutes (default)
python wunderground_to_aprs_sender.py --schedule
# Run every 30 minutes
python wunderground_to_aprs_sender.py --schedule --interval 30
# Run every hour
python wunderground_to_aprs_sender.py --schedule --interval 60- 15 minutes: Standard for active weather monitoring
- 30 minutes: Good balance for regular updates
- 60 minutes: Minimal impact, good for stable conditions
- 5 minutes: Minimum recommended (shorter intervals may violate APRS-IS guidelines)
For automatic startup after reboot and robust service management:
-
Quick Setup:
# Run the installer sudo ./install-service.sh # Configure the service sudo -u aprs /opt/wunderground-to-aprs/venv/bin/python /opt/wunderground-to-aprs/wunderground_to_aprs_sender.py --save-config # Start the service sudo systemctl start wunderground-to-aprs
-
Service Management:
# Check status sudo systemctl status wunderground-to-aprs # View logs sudo journalctl -u wunderground-to-aprs -f # Restart service sudo systemctl restart wunderground-to-aprs
Features of the Linux service:
- ✅ Auto-start on boot - Starts automatically after system reboot
- ✅ Auto-restart on failure - Restarts if the process crashes
- ✅ Secure execution - Runs as dedicated non-root user
- ✅ System integration - Full systemd integration with logging
- ✅ Easy management - Standard systemctl commands
See SERVICE_SETUP.md for detailed installation instructions.
Use cron for simpler scheduling without service features:
# Edit crontab
crontab -e
# Add line for every 15 minutes
*/15 * * * * cd /path/to/script && python3 wunderground_to_aprs_sender.pyThe project is organized into modular components for better maintainability:
wunderground-to-aprs/
├── wunderground_to_aprs_sender.py # Main script (entry point)
├── requirements.txt # Python dependencies
├── README.md # This documentation
└── src/ # Source code modules
├── __init__.py # Package initialization
├── config_manager.py # Configuration file management
├── config_handler.py # High-level configuration workflows
├── argument_parser.py # Command line argument parsing
├── wunderground_downloader.py # Weather Underground API client
├── aprs_frame_generator.py # APRS protocol frame formatting
├── aprs_client.py # APRS-IS network client
├── scheduler.py # Automatic scheduling system
└── core.py # Main workflow orchestration
- 🔧 Maintainable: Each component has a single responsibility
- 🧪 Testable: Individual modules can be tested separately
- 🔄 Reusable: Components can be imported by other projects
- 📚 Readable: Clean separation of concerns
The script can save your credentials to avoid typing them every time:
- Windows:
C:\Users\USERNAME\.weather_to_aprs_config.json - Linux/Mac:
~/.weather_to_aprs_config.json
- Weather station ID
- Amateur radio callsign
- APRS-IS passcode (encrypted storage)
- Weather Underground API key
- Preferred APRS-IS server
- Scheduling settings (enable/disable automatic mode, transmission interval)
# Interactive setup (prompts for missing information)
python wunderground_to_aprs_sender.py --save-config
# Command line setup
python wunderground_to_aprs_sender.py --save-config IXXXXX1 YOUR_CALLSIGN YOUR_PASSCODE --api-key YOUR_KEY
# Save configuration with automatic scheduling enabled (every 30 minutes)
python wunderground_to_aprs_sender.py --save-config IXXXXX1 YOUR_CALLSIGN YOUR_PASSCODE --schedule --interval 30
# View saved configuration
python wunderground_to_aprs_sender.py --show-config
# Run with saved configuration (default behavior)
python wunderground_to_aprs_sender.py
# Automatic weather station mode (uses scheduling settings from config if saved)
python wunderground_to_aprs_sender.py --schedule
# Custom interval automatic mode (overrides saved config)
python wunderground_to_aprs_sender.py --schedule --interval 30
# Override saved settings temporarily
python wunderground_to_aprs_sender.py --station KLAX --server euro.aprs2.net
# Scheduled mode with overrides
python wunderground_to_aprs_sender.py --schedule --station KLAX --interval 20
# Delete configuration
python wunderground_to_aprs_sender.py --delete-configWhen you save your configuration, you can also choose to enable automatic scheduling:
# During interactive setup, you'll be prompted:
python wunderground_to_aprs_sender.py --save-config
# Enable automatic scheduling? (y/N): y
# Enter transmission interval in minutes (default: 15): 30
# Or save directly with scheduling enabled:
python wunderground_to_aprs_sender.py --save-config --station IXXXXX1 --schedule --interval 20- Default mode: If scheduling is enabled in config, running with no arguments will use saved settings
- Override: Command line
--scheduleand--intervaloptions override saved settings - Persistent: Scheduling preferences are remembered between sessions
python wunderground_to_aprs_sender.py --show-config
# Will display:
# Schedule Mode: Enabled/Disabled
# Interval: X minutes- IXXXXX1 - Czech Republic personal weather station
- KLAX - Los Angeles International Airport
- KDFW - Dallas/Fort Worth International Airport
- KORD - Chicago O'Hare International Airport
The script automatically selects from these servers with failover:
rotate.aprs2.net- Primary server poolnoam.aprs2.net- North Americaeuro.aprs2.net- Europeasia.aprs2.net- Asiaaunz.aprs2.net- Australia/New Zealandsoam.aprs2.net- South America
- Visit Weather Underground API
- Sign up for a free account
- Create an API key
- Use with
--api-keyparameter or setWUNDERGROUND_API_KEYenvironment variable
The script works without an API key using sample data, but coordinates will be 0,0. For real coordinates and weather data, an API key is required.
You need an official APRS-IS passcode tied to your amateur radio license. Calculate it using online tools or ham radio software. This passcode is required for transmitting to the APRS-IS network.
The script sends a complete APRS weather frame including:
- Position: Real coordinates from Weather Underground (lat/lon)
- Weather Data: Temperature, humidity, pressure, wind speed/direction
- Timestamp: Current UTC time
- Identification: Your callsign and "WX" weather identifier
YOUR_CALLSIGN>APRS,TCPIP*:@141049z52xx.99N/018xx.45E_316/004g007t066r000p000P10176h60b10176 WX
Frame Breakdown:
YOUR_CALLSIGN- Your callsign52xx.xxN/018xx.xxE- Position (52.xxx°N, 18.xxx°E)316/004g007- Wind: 316° at 4mph, gusts 7mpht066- Temperature: 66°FP10176h60- Pressure: 1017.6mb, Humidity: 60%WX- Weather station identifier
After transmission, your weather data appears on:
- aprs.fi - Search for your callsign
- aprsdirect.com - APRS tracking
- Local APRS applications and digipeaters
- Check internet connection
- Try different APRS-IS server with
--server - Verify callsign format (e.g., YOUR_CALLSIGN, N6ABC-1)
- Verify your APRS-IS passcode is correct
- Check callsign spelling and format
- Get Weather Underground API key for real data
- Verify station ID exists (check wunderground.com)
- Some stations may have incomplete data (null values are handled automatically)
"Error: Passcode required"- Provide your official APRS-IS passcode"Invalid callsign format"- Use proper amateur radio callsign format"Failed to download weather data"- Check station ID and internet connection
- Download: Fetches weather data from Weather Underground API
- Convert: Extracts coordinates and weather parameters
- Generate: Creates APRS-formatted weather frame
- Transmit: Sends frame to APRS-IS network via TCP socket
- Real coordinates from Weather Underground API when available
- Automatic conversion from decimal degrees to APRS format
- Graceful handling of null/missing coordinate data
Standard APRS weather format with position, timestamp, and weather data according to APRS specification.
This project is for amateur radio use only. Users must have a valid amateur radio license before transmitting to APRS-IS networks.
This is a community project for amateur radio operators. Feel free to:
- Report issues and bugs
- Suggest improvements
- Submit pull requests
- Share usage examples
For support:
- Check this README for common solutions
- Verify your amateur radio license and APRS-IS passcode
- Check APRS.org for APRS protocol information
73! (Amateur radio greeting meaning "best wishes")
Created for the amateur radio community