A lightweight, efficient radiosonde decoder for Raspberry Pi, designed to work with RTL-SDR, Airspy and KA9Q radio receivers. Using the excellent rs1729/RS decoders embedded into this framework.
- 🎯 Automatic Signal Detection: Scans spectrum and automatically detects radiosonde signals
- 🔧 Multiple Sonde Types: Supports RS41, RS92, DFM, M10, M20, iMet, LMS6, MRZ
- 📡 Dual SDR Support: Works with RTL-SDR, Airspy R2, Airspy Mini USB dongles
- 🎛️ Virtual Receivers: Configurable parallel decoding of multiple sondes with KA9Q radio
- 🗺️ Web Interface: Clean Leaflet-based map showing real-time flight paths
- 📤 OpenWX Integration: MQTT & UDP JSON output for seamless data upload
- 📤 Sondehub Integration: seamless data upload to sondehub.org
- ⚡ Lightweight: Minimal overhead compared to several other decoder solutions
- 🔧 One-step installer: Easy installtion of all required packages
- Raspberry Pi 4 / 5 / 400 / 500 (8GB recommended) or Intel x86_64 client
- Debian 13 "Trixie" or Raspberry Pi OS (64 Bit)
- RTL-SDR, Airspy R2, Airspy Mini dongle or KA9Q-compatible SDR
- Antenna tuned for 400-406 MHz
- Selective 400 MHz LNA
- SAW filter recommended
┌─────────────────┐
│ RTL-SDR/Airspy │
│ KA9Q Radio │
└────────┬────────┘
│
┌────▼──────────────┐
│ Spectrum Analyzer │
│ Signal Detector │
└────┬──────────────┘
│
┌────▼─────────────────┐
│ Decoder Manager │
│ (rs1729/RS decoders) │
└────┬─────────────────┘
│
┌────▼────────┬──────────┬─────────┐
│ │ │ │
┌───▼────┐ ┌────▼─────┐ ┌─▼──────┐ │
│ Web UI │ │ UDP JSON │ │ Log │ │
│ Flask │ │ OpenWX │ │ File │ │
└────────┘ └──────────┘ └────────┘ │
│
[sondehub]
OpenWXSDR offers an easy-to-use One-Step-Installer to install the necessary libraries, packages and OpenWXSDR package.
See the wiki for detailed installation instructions: https://github.com/DL2MF/OpenWXSDR/wiki/Installation
If you prefer manual installation of the package, continue below.
sudo apt-get update
sudo apt-get install -y git build-essential cmake pkg-config \
libusb-1.0-0-dev python3-pip python3-venv rtl-sdrmkdir -p decoders
cd decoders
git clone https://github.com/rs1729/RS.git rs1729
cd rs1729
# Build the decoders
cd demod && make
cd ../rs41 && make
cd ../rs92 && make
cd ../dfm && make
cd ../m10 && make
cd ../imet && make
cd ../lms6 && make
cd ..cd ~/!Develop_OpenWXSDR
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txtEdit config.yaml to match your setup:
- Set SDR type and parameters
- Configure frequency ranges for your region
- Set receiver specific settings (span, gain, fft, treshold)
- Configure OpenWX UDP and external output destinations
Key configuration options in config.yaml:
- sdr.type: Choose 'rtlsdr', 'airspy', 'flux242' or 'ka9q'
- receivers.max_concurrent: Number of parallel decoders (1-8 recommended)
- detection.freq_ranges: Frequency ranges to scan
- output.udp: Configure OpenWX server destination
Data sent to OpenWX server:
{
"software_name": "OpenWXSDR",
"software_version": "1.0.45",
"uploader_callsign": "<your-call>",
"time_received": "2026-04-30T12:34:56.789Z",
"type": "RS41",
"frame": 12345,
"id": "T1234567",
"datetime": "2026-04-30T12:34:56.000Z",
"lat": 51.5074,
"lon": -0.1278,
"alt": 15420.5,
"vel_h": 12.3,
"vel_v": 5.2,
"heading": 285.5,
"temp": -45.2,
"humidity": 25.5,
"pressure": 150.25,
"frequency": 402.700,
"sats": 8,
"snr": 25.5
}| Type | Decoder | Notes |
|---|---|---|
| RS41 | rs41mod | Vaisala RS41-SG/SGP/SGM |
| RS92 | rs92mod | Vaisala RS92-SGP/NGP |
| DFM | dfm09mod | Graw DFM06/09/17 |
| M10 | m10mod | Meteomodem M10 |
| M20 | m20mod | Meteomodem M20 |
| iMet | imet54mod | InterMet iMet-54 |
| LMS6 | lms6mod | Lockheed Martin LMS6 |
| MRZ | mrzmod | Meteo-Radiy MRZ |
python3 openwxsdr.pyAccess the web UI at http://raspberry-pi-ip:5000
Many configuration settings are also available in the WebUI and can be changed during operation:
- SNR treshold
- Scan interval
- Callsign and SSID
- SDR-Type and device settings
- Center Frequency
- Sample Rate
- Gain
- PPM correction
- MQTT and upload
- Server IP / hostname
- Port
- User credentials
The local web UI is available at http://yourdevice-ip:5000
For each configured receiver the frequency spectrum is available:
If enabled in config.yaml your device will upload radiosonde telemetry and sensor ptu to OpenWX.de http://map.openwx.de:
Upload to OpenWX.de is preferable via MQTT configurable. Generate your API-key in your OpenWX-Account and configure your credentials in config.yaml.
# MQTT upload to OpenWX.de broker
mqtt:
enabled: true
server: '<server-ip>' # MQTT broker hostname or IP
port: 1883 # MQTT broker port (1883 = plain, 8883 = TLS)
username: '<username>' # MQTT username (leave empty if not required)
password: '<password>' # MQTT password (leave empty if not required)
topic_prefix: 'OPENWXSDR/<your-call>/' # MQTT topic prefix (e.g. OPENWXSDR/<callsign>/<serial>)
client_id: '<your-call>-15' # MQTT client ID
keepalive: 60 # MQTT keepalive in seconds
connect_timeout: 10 # Wait this many seconds for initial CONNACK
tls_enabled: true # Set false for username/password brokers on plain TCP (usually port 1883)
tls_insecure: true # Accept brokers by IP/self-signed cert without CA validation
tls_ca_certs: '' # Optional CA bundle path for strict TLS validation
transport: 'tcp' # MQTT transport
If enabled in config.yaml your device will upload radiosonde telemetry and sensor ptu to sondehub.org:
# ============================================================
# SondeHub Upload
# ============================================================
sondehub:
enabled: true
queue_mode: false # false = direct upload mode, true = queued batch upload mode
queue_batch_max: 50 # Max telemetry objects uploaded per queued request (10-fast 50-robust)
queue_max_size: 1000 # Max queued objects before oldest/new drops may occur (200-fast 1000-robust)
upload_url: 'https://api.v2.sondehub.org/sondes/telemetry'
listeners_url: 'https://api.v2.sondehub.org/listeners' # Listener metadata endpoint
station_id: '<your-call>->ssid>' # Station ID (use callsign/SSID style)
uploader_callsign: '<your-call>' # Receiver callsign shown in SondeHub
uploader_antenna: '1/4 wave UHF vertical' # Receiver antenna
uploader_radio: 'Airspy Mini + rs1729' # Optional receiver hardware/radio description
contact_email: '<mail>@domain.com' # Optional contact email for listener metadata
uploader_lat: 52.00 # Must match station.lat above
uploader_lon: 10.00 # Must match station.lon above
uploader_alt: 100 # Must match station.alt above
upload_rate_s: 10 # Upload interval in seconds (1-5 for queue mode -10 recommended for single tracking)
listener_upload_interval_s: 900 # Listener metadata upload interval in seconds (reduced from 900 for testing)
Grafana dashboard from Sondehub will show your receiver in the statistics including RSSI/SNR:
GNU GPL2 License - See LICENSE file
- rs1729/RS decoders: https://github.com/rs1729/RS
- Inspired by Project Horus radiosonde_auto_rx: https://github.com/projecthorus/radiosonde_auto_rx/
- Built for the OpenWX.de network community
For issues and questions, please open an issue on GitHub.
