Skip to content

DL2MF/OpenWXSDR

Repository files navigation

OpenWX SDR - Streamlined Radiosonde Decoder

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.

Features

  • 🎯 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

Hardware Requirements

  • 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

Architecture

┌─────────────────┐
│  RTL-SDR/Airspy │
│   KA9Q Radio    │
└────────┬────────┘
         │
    ┌────▼──────────────┐
    │ Spectrum Analyzer │
    │ Signal Detector   │
    └────┬──────────────┘
         │
    ┌────▼─────────────────┐
    │   Decoder Manager    │
    │ (rs1729/RS decoders) │
    └────┬─────────────────┘
         │
    ┌────▼────────┬──────────┬─────────┐
    │             │          │         │
┌───▼────┐   ┌────▼─────┐  ┌─▼──────┐  │
│ Web UI │   │ UDP JSON │  │  Log   │  │
│ Flask  │   │ OpenWX   │  │  File  │  │
└────────┘   └──────────┘  └────────┘  │
                                       │ 
                                   [sondehub]

Installation

1a. One-Step-Installer

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.

1b. Install System Dependencies

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-sdr

2. Clone and Set Up rs1729/RS Decoders

mkdir -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 ..

3. Install OpenWXSDR

cd ~/!Develop_OpenWXSDR
python3 -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
pip install -r requirements.txt

4. Configure

Edit 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

Configuration

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

UDP JSON Format

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
}

Supported Radiosonde Types

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

5. Run

python3 openwxsdr.py

Access 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

Local WebUI on your device

The local web UI is available at http://yourdevice-ip:5000

Screenshot 2026-05-19 171001

For each configured receiver the frequency spectrum is available:

Screenshot 2026-05-18 132137

Telemetry data upload to external OpenWX.de

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
grafik

Telemetry data upload to external sondehub.org

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)
Screenshot 2026-05-19 152207

Grafana dashboard from Sondehub will show your receiver in the statistics including RSSI/SNR:

Screenshot 2026-05-19 192420

License

GNU GPL2 License - See LICENSE file

Credits

Support

paypal

For issues and questions, please open an issue on GitHub.

About

OpenWX SDR RX radiosonde decoder

Topics

Resources

Stars

Watchers

Forks

Sponsor this project

Packages

 
 
 

Contributors