MCPcopy Index your code
hub / github.com/DL2MF/OpenWXSDR

github.com/DL2MF/OpenWXSDR @v1.0.50

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.0.50 ↗ · + Follow
379 symbols 1,096 edges 25 files 273 documented · 72% updated 21d agov1.0.50 · 2026-06-16★ 331 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

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.

Updated V1.0.46 available:

Important notice: With update to version 1.0.46 the adressed issues of radiosonde telemetry to sondehub.org has been fixed. We are looking forward that the ban / blocking of OpenWXSDR uploads will be suspended after review of the submitted telemetry data.

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: false                                           # See notice at the beginning, please don't activate in V1.0.45
  queue_mode: true                                         # 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: 21600                        # Listener metadata upload interval in seconds (6h / 4 times/day recommend)

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

  • 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

Support

paypal

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

Core symbols most depended-on inside this repo

close
called by 13
src/sdr/ka9q_receiver.py
stop
called by 11
src/decoders/decoder_manager.py
resume
called by 10
src/sdr/rtlsdr_analyzer.py
start
called by 9
src/sdr/airspy_receiver.py
stop
called by 8
src/sdr/airspy_receiver.py
send_telemetry
called by 8
src/output/udp_output.py
_update_mapping_keys_in_text
called by 8
src/webui/web_server.py
_cleanup_all
called by 7
src/sdr/airspy_receiver.py

Shape

Method 312
Class 35
Route 22
Function 10

Languages

Python100%

Modules by API surface

src/webui/web_server.py78 symbols
src/sdr/airspy_receiver.py62 symbols
src/sdr/device_manager.py53 symbols
src/output/sondehub_queue.py21 symbols
src/sdr/audio_pipeline.py19 symbols
src/decoders/decoder_manager.py19 symbols
src/output/sondehub_output.py18 symbols
src/sdr/rtlsdr_analyzer.py15 symbols
src/sdr/ka9q_receiver.py12 symbols
src/openwxsdr_app.py11 symbols
src/decoders/rs1729_decoder.py11 symbols
src/output/mqtt_output.py10 symbols

For agents

$ claude mcp add OpenWXSDR \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact