Thursday, September 24, 2026

Bila KA9Q Tiba-Tiba “Hang” Walaupun Service Masih Active — Cara Saya Buat Auto-Recovery Untuk Radiosonde Auto-RX

 Cara saya buat auto-recovery untuk Radiosonde Auto-RX + KA9Q + Airspy Mini

Beberapa hari selepas setup Radiosonde Auto-RX 1.9.0 + KA9Q + Airspy Mini berjalan elok, tiba-tiba scanner saya mula buat perangai. Web UI masih boleh buka. Auto-RX masih hidup. Tapi dekat bahagian log, mula keluar error timeout berulang-ulang.

KA9Q (sonde.local) - tune call failed ... with a timeout.
Is the server running?

Task Manager - Ongoing issue with KA9Q server connection.
Please check the logs.

Mula-mula memang saya ingat mungkin Auto-RX rosak, atau Airspy Mini ada masalah. Rupanya tidak. Masalah yang lebih menarik ialah KA9Q radiod masih ditunjukkan sebagai active (running) oleh systemd, tetapi bahagian control/tune dia dah tak memberi respons dengan betul.

Simptom Yang Saya Nampak

CRITICAL: KA9Q (sonde.local) - tune call failed ... with a timeout.
ERROR: Task Manager - Ongoing issue with KA9Q server connection.

Tapi bila saya check:

sudo systemctl status radiod@airspymini-autorx --no-pager

Status masih:

Active: active (running)

Malah proses radiod, avahi-publish-service dan alamat sonde.local masih ada. Jadi ini bukan service crash biasa.

Test KA9Q

Saya cuba:

control sonde.local

KA9Q masih memberi respons, tetapi keluar channel pelik seperti:

SSRC        preset   samprate   freq, Hz       SNR   output
40277503                0       402775000      nan   (null)

samprate = 0, nan, dan (null) itu memang nampak macam channel yang tak terbentuk dengan sempurna atau stale. Jadi saya cuba restart KA9Q:

sudo systemctl restart radiod@airspymini-autorx

Tunggu beberapa saat:

sleep 8

Kemudian restart Auto-RX:

docker restart radiosonde_auto_rx

Selepas itu scanner mula hidup semula:

Scanner (KA9Q sonde.local) - Starting Scanner Thread
Scanner (KA9Q sonde.local) - Running frequency scan.

Auto-RX saya kembali normal.

Jadi Apa Sebenarnya Berlaku?

Dalam kes saya, masalah nampaknya bukan:

Airspy rosak
Docker rosak
Auto-RX rosak
station.cfg rosak

Sebaliknya KA9Q nampak macam masuk keadaan “service masih hidup tetapi tune/control path dah tersangkut”. Masalah macam ini tak akan dikesan oleh systemd biasa sebab dari sudut Linux, process masih hidup.

process masih hidup = systemd anggap service sihat

Padahal Auto-RX sudah tak boleh buka channel baru. Sebab itu saya fikir: daripada tunggu saya sedar sendiri beberapa jam kemudian, lebih baik Raspberry Pi repair dirinya sendiri.

Penyelesaian Saya: KA9Q Watchdog

Saya buat satu watchdog mudah. Idea dia:

Setiap 5 minit
      ↓
Check log Auto-RX
      ↓
Ada banyak KA9Q tune timeout?
      ↓
TIDAK → biarkan
YA
      ↓
Restart KA9Q
      ↓
Tunggu 8 saat
      ↓
Restart Auto-RX

Saya sengaja tak buat restart KA9Q setiap malam secara paksa. Kalau semuanya sihat, jangan kacau. Watchdog hanya bertindak bila betul-betul nampak simptom masalah.

Langkah 1 — Buat Script Watchdog

Buka:

sudo nano /usr/local/sbin/ka9q-watchdog.sh

Masukkan:

#!/bin/bash

LOCK=/run/ka9q-watchdog.lock
LOG=/var/log/ka9q-watchdog.log

CONTAINER="radiosonde_auto_rx"
SERVICE="radiod@airspymini-autorx"

exec 9>"$LOCK"

flock -n 9 || exit 0

ERRORS=$(docker logs --since 5m "$CONTAINER" 2>&1 | \
grep -cE 'tune call failed.*timeout|Ongoing issue with KA9Q server connection' || true)

if [ "$ERRORS" -ge 3 ]; then

    echo "$(date '+%F %T') - KA9Q unhealthy: $ERRORS errors. Restarting..." >> "$LOG"

    systemctl restart "$SERVICE"

    sleep 8

    docker restart "$CONTAINER" >> "$LOG" 2>&1

    sleep 15

    echo "$(date '+%F %T') - Recovery completed." >> "$LOG"

fi

Simpan:

Ctrl + O
Enter
Ctrl + X

Kemudian jadikan executable:

sudo chmod +x /usr/local/sbin/ka9q-watchdog.sh

Kenapa Saya Letak 3 Error?

Saya tak mahu restart KA9Q hanya kerana satu timeout kecil. Kadang-kadang satu command boleh lambat atau ada transient error. Sebab itu saya gunakan:

if [ "$ERRORS" -ge 3 ]

Maknanya kalau dalam 5 minit terdapat sekurang-kurangnya tiga error berkaitan KA9Q, barulah watchdog anggap sistem bermasalah.

Langkah 2 — Buat systemd Service

Buka:

sudo nano /etc/systemd/system/ka9q-watchdog.service

Isi:

[Unit]
Description=KA9Q Auto-RX Health Watchdog
After=docker.service network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/ka9q-watchdog.sh

Langkah 3 — Buat Timer Setiap 5 Minit

Buka:

sudo nano /etc/systemd/system/ka9q-watchdog.timer

Masukkan:

[Unit]
Description=Check KA9Q health every 5 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Persistent=true

[Install]
WantedBy=timers.target

Kemudian:

sudo systemctl daemon-reload

Aktifkan:

sudo systemctl enable --now ka9q-watchdog.timer

Check Sama Ada Timer Hidup

Jalankan:

systemctl list-timers | grep ka9q

Kalau semuanya betul, kita akan nampak ka9q-watchdog.timer bersama masa NEXT dan LEFT. Maknanya setiap lima minit systemd akan panggil watchdog tadi.

Test Watchdog Secara Manual

Tak perlu tunggu lima minit. Boleh jalankan:

sudo systemctl start ka9q-watchdog.service

Kemudian:

sudo systemctl status ka9q-watchdog.service --no-pager

Disebabkan service ini Type=oneshot, selepas selesai check status dia boleh kembali kepada inactive (dead). Itu normal. Ia bukan service yang duduk running sepanjang masa. Timer yang akan hidupkan dia setiap lima minit.

Kenapa Log Watchdog Belum Ada?

Masa mula-mula saya cuba:

sudo tail -f /var/log/ka9q-watchdog.log

Saya dapat:

tail: cannot open '/var/log/ka9q-watchdog.log':
No such file or directory

Ini sebenarnya bukan error watchdog. Script hanya menulis log apabila ia benar-benar detect masalah dan melakukan recovery. Kalau KA9Q sihat, script keluar senyap sahaja.

Kalau nak create fail log dari awal:

sudo touch /var/log/ka9q-watchdog.log

sudo chmod 644 /var/log/ka9q-watchdog.log

Selepas itu:

sudo tail -f /var/log/ka9q-watchdog.log

Kalau kosong, itu sebenarnya berita baik. Maknanya watchdog belum perlu repair apa-apa.

Apa Yang Berlaku Bila Watchdog Detect Masalah?

Contohnya Auto-RX mula keluarkan:

tune call failed ... timeout

berulang kali. Watchdog akan kira error lima minit terakhir. Kalau ≥3:

KA9Q unhealthy

Kemudian:

systemctl restart radiod@airspymini-autorx

Tunggu 8 saat, kemudian:

docker restart radiosonde_auto_rx

Dalam log nanti lebih kurang:

2026-09-25 03:15:02 - KA9Q unhealthy: 8 errors. Restarting...
2026-09-25 03:15:26 - Recovery completed.

Jadi kalau masalah berlaku tengah malam pun, sistem boleh cuba pulihkan diri sendiri.

Kenapa Restart KA9Q Dahulu, Baru Auto-RX?

KA9Q restart
     ↓
tunggu
     ↓
Auto-RX restart

Urutan ini penting sebab Auto-RX bergantung kepada sonde.local yang disediakan oleh KA9Q. Kalau Auto-RX hidup dahulu ketika KA9Q masih belum ready, kita boleh dapat semula Could not contact KA9Q atau tune call failed.

Kenapa Saya Tak Restart Raspberry Pi Terus?

Restart seluruh Raspberry Pi terlalu agresif. Masalah saya hanya pada layer KA9Q. Airspy Mini sendiri sebelum ini sudah saya test secara direct dengan airspy_rx dan dia boleh capture IQ dengan normal.

restart komponen paling kecil yang bermasalah dahulu

Baru escalate jika masih gagal.

Setup Saya Sekarang

Radiosonde Auto-RX : 1.9.0
SDR                 : Airspy Mini
Backend             : KA9Q
KA9Q hostname       : sonde.local
Docker              : Ya
OS                  : Raspberry Pi OS 64-bit

KA9Q:

[global]
hardware = airspy
mode = fm
status = sonde.local
iface = lo
ttl = 0
data = sonde-pcm.local

[airspy]
device = airspy
description = "auto_rx"
frequency = 405m6
gainstep = 17

Scan Auto-RX saya:

400.05 MHz – 405.0 MHz

Satu Lagi Perkara Penting

Kalau nampak error:

tune call failed

jangan terus fikir Airspy dah rosak. Dalam kes saya, Airspy langsung tak rosak. Masalah boleh datang daripada:

KA9Q stale channel
radiod stuck
control path timeout
multicast state
Auto-RX ↔ KA9Q communication

Hardware SDR adalah antara benda terakhir yang patut kita tuduh kalau direct SDR test masih OK.

Cara Check Cepat Kalau Masalah Datang Lagi

Saya simpan command ini:

sudo systemctl status radiod@airspymini-autorx --no-pager

control sonde.local

docker logs --since 5m radiosonde_auto_rx

Kalau radiod active tetapi Auto-RX penuh dengan tune call failed ... timeout, saya tahu ia kemungkinan kes sama.

Kesimpulan

Masalah paling susah dalam server bukan semestinya bila process mati. Kadang-kadang service = running, tetapi fungsi utama di dalamnya dah tak memberi respons. Itulah yang berlaku pada setup KA9Q saya.

CHECK
  ↓
KA9Q OK?
  ↓
YES → buat apa-apa pun tak perlu
  ↓
NO
  ↓
restart KA9Q
  ↓
restart Auto-RX

Simple saja. Tapi untuk station radiosonde yang berjalan 24/7, benda kecil macam ini sangat berguna. Sekurang-kurangnya selepas ini kalau KA9Q tersangkut masa saya tidur, saya tak perlu tunggu esok pagi baru sedar spectrum dah kosong berjam-jam.

Monday, September 21, 2026

Cara Update Radiosonde Auto-RX Dengan Selamat Tanpa Rosakkan Setup KA9Q + Airspy Mini

 


Kalau anda menggunakan Radiosonde Auto-RX bersama KA9Q dan Airspy Mini, proses update sepatutnya dibuat dengan berhati-hati. Update Docker secara generik boleh menyebabkan sistem yang sebelum ini stabil tiba-tiba hilang spectrum, gagal scan, atau memaparkan error seperti:

ka9q powers call failed with return code 124
SDR produced no output

Dalam pengalaman setup ini, masalah tersebut bukan berpunca daripada Airspy Mini yang rosak. Airspy masih boleh dikesan, ditune dan melakukan direct IQ capture dengan baik. Punca sebenar lebih kepada kombinasi container Auto-RX, mount KA9Q, versi software dan konfigurasi yang berubah selepas update.

Objektif Panduan Ini

Kita akan bina satu Safe Update Script yang melakukan semuanya secara automatik:

· Backup fail station.cfg sebelum update.

· Simpan Docker image lama sebagai rollback image.

· Pull image Auto-RX terbaru.

· Recreate container dengan mount DBus dan Avahi yang diperlukan KA9Q.

· Buat health check selepas update.

· Rollback secara automatik jika scanner menunjukkan error utama.

Nota penting: Panduan ini ditulis untuk setup KA9Q + Airspy Mini. Jika anda menggunakan RTL-SDR biasa tanpa KA9Q, command Docker mungkin berbeza.

 

Golden Configuration Yang Sudah Stabil

Untuk setup yang sudah pulih dan stabil, konfigurasi rujukan ialah:

SDR        : Airspy Mini
KA9Q       : sonde.local
Auto-RX    : Docker
Docker tag : testing
KA9Q freq  : 405.6 MHz
Scan range : 400.05 - 405.0 MHz

Bahagian Airspy dalam konfigurasi KA9Q:

[airspy]
device = airspy
description = "auto_rx"
frequency = 405m6
gainstep = 17

Julat scan Auto-RX:

min_freq = 400.05
max_freq = 405.0

1. Elakkan update dengan command Docker generik

Untuk setup KA9Q, jangan sekadar pull image dan recreate container tanpa mount tambahan. Container KA9Q memerlukan akses DBus dan Avahi supaya nama seperti sonde.local boleh digunakan dengan betul.

docker pull ghcr.io/projecthorus/radiosonde_auto_rx:latest
docker stop radiosonde_auto_rx
docker rm radiosonde_auto_rx
docker run ...

Untuk KA9Q, gunakan kaedah safe update di bawah.

2. Buat folder backup

Folder ini akan menyimpan setiap salinan station.cfg sebelum update.

mkdir -p ~/radiosonde_auto_rx/backups

3. Bina Safe Update Script

Script di bawah akan backup config, simpan image lama, pull image baru, recreate container, semak log dan rollback jika perlu.

nano ~/update_autorx_safe.sh

Paste keseluruhan script berikut:

#!/bin/bash
set -e

IMAGE="ghcr.io/projecthorus/radiosonde_auto_rx:testing"
NAME="radiosonde_auto_rx"
CFG="$HOME/radiosonde_auto_rx/station.cfg"
LOGDIR="$HOME/radiosonde_auto_rx/log"
BACKUPDIR="$HOME/radiosonde_auto_rx/backups"

echo
echo "=========================================="
echo " Radiosonde Auto-RX SAFE UPDATE"
echo "=========================================="
echo

mkdir -p "$BACKUPDIR"

echo "[1/6] Backup station.cfg..."
STAMP=$(date +%Y%m%d_%H%M%S)
cp -a "$CFG" "$BACKUPDIR/station.cfg.$STAMP"
echo "Backup: $BACKUPDIR/station.cfg.$STAMP"
echo

echo "[2/6] Saving current Docker image..."
OLD_IMAGE=$(docker inspect -f '{{.Image}}' "$NAME" 2>/dev/null || true)

if [ -n "$OLD_IMAGE" ]; then
    docker tag "$OLD_IMAGE" radiosonde_auto_rx:rollback
    echo "Rollback image created: radiosonde_auto_rx:rollback"
else
    echo "No existing Auto-RX container found."
fi

echo
echo "[3/6] Pulling latest Auto-RX testing image..."
docker pull "$IMAGE"

echo
echo "[4/6] Recreating Auto-RX container..."
docker stop "$NAME" 2>/dev/null || true
docker rm "$NAME" 2>/dev/null || true

docker run \
-d \
--name "$NAME" \
--restart=always \
--device=/dev/bus/usb \
--network=host \
-v "$CFG":/opt/auto_rx/station.cfg:ro \
-v "$LOGDIR":/opt/auto_rx/log/ \
-v /var/run/dbus:/var/run/dbus \
-v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
"$IMAGE"

echo
echo "Waiting for Auto-RX to start..."
sleep 35

echo
echo "[5/6] Checking Auto-RX health..."

ERRORS=$(docker logs --since 40s "$NAME" 2>&1 | \
grep -E 'return code 124|Could not contact KA9Q|SDR produced no output|Scanner Thread Closed' || true)

if [ -n "$ERRORS" ]; then
    echo
    echo "=========================================="
    echo " UPDATE FAILED - AUTO ROLLBACK STARTED"
    echo "=========================================="
    echo "$ERRORS"

    docker stop "$NAME" 2>/dev/null || true
    docker rm "$NAME" 2>/dev/null || true

    if docker image inspect radiosonde_auto_rx:rollback >/dev/null 2>&1; then
        echo "Restoring previous working image..."

        docker run \
        -d \
        --name "$NAME" \
        --restart=always \
        --device=/dev/bus/usb \
        --network=host \
        -v "$CFG":/opt/auto_rx/station.cfg:ro \
        -v "$LOGDIR":/opt/auto_rx/log/ \
        -v /var/run/dbus:/var/run/dbus \
        -v /var/run/avahi-daemon/socket:/var/run/avahi-daemon/socket \
        radiosonde_auto_rx:rollback

        echo "Rollback complete."
    else
        echo "ERROR: No rollback image available!"
        exit 1
    fi
else
    echo
    echo "=========================================="
    echo " UPDATE SUCCESSFUL"
    echo "=========================================="
    docker ps --filter name="$NAME"
    echo
    echo "Latest Auto-RX logs:"
    docker logs --tail 25 "$NAME"
fi

echo
echo "[6/6] Finished."
echo

4. Simpan script

Dalam Nano, tekan Ctrl+O, Enter dan Ctrl+X.

5. Jadikan script executable

Selepas simpan, beri permission supaya script boleh dijalankan terus.

chmod +x ~/update_autorx_safe.sh

6. Cara update selepas ini

Selepas script siap, setiap kali mahu update Auto-RX anda hanya perlu satu command.

~/update_autorx_safe.sh

Apa Yang Script Ini Buat?

station.cfg
     |
     v
BACKUP CONFIG
     |
     v
SAVE DOCKER IMAGE LAMA
     |
     v
PULL AUTO-RX TERBARU
     |
     v
RECREATE CONTAINER
     |
     v
WAIT 35 SECONDS
     |
     v
CHECK LOG
     |
     +--> OK -----> KEEP NEW VERSION
     |
     +--> ERROR --> AUTO ROLLBACK

Antara error yang dicari secara automatik:

return code 124

Could not contact KA9Q

SDR produced no output

Scanner Thread Closed

Kenapa Guna Image testing?

Dalam setup KA9Q ini, gunakan image:

ghcr.io/projecthorus/radiosonde_auto_rx:testing

Container juga perlu mount:

/var/run/dbus
/var/run/avahi-daemon/socket

Ini membolehkan Auto-RX berkomunikasi dengan KA9Q melalui hostname seperti sonde.local.

Jangan Update KA9Q Serentak Dengan Auto-RX

Kalau tujuan anda hanya mahu update Radiosonde Auto-RX, jangan terus buat update source KA9Q pada masa yang sama. Elakkan command seperti:

cd ~/ka9q-radio
git checkout main
git pull
make clean
make
sudo make install

Update satu komponen pada satu masa. Jika Auto-RX sudah stabil, biarkan KA9Q pada versi yang sedang berfungsi. Update KA9Q hanya apabila dokumentasi versi Auto-RX memang memerlukan perubahan tersebut.

Command Pantas Selepas Update

Semak container

docker ps

Pastikan radiosonde_auto_rx berstatus Up.

Semak log Auto-RX

docker logs --tail 50 radiosonde_auto_rx

Log yang sihat biasanya mengandungi mesej seperti Running frequency scan dan tidak berulang-ulang dengan return code 124.

Semak KA9Q

control sonde.local

Jika keluar senarai SSRC, preset, sample rate, frequency dan SNR, KA9Q sedang berkomunikasi.

Semak Spectrum Dalam Web UI

Buka web Auto-RX melalui:

http://IP-RASPBERRY-PI:5000

Spectrum yang normal sepatutnya mempunyai noise floor, signal peaks, frequency scan dan peak detection. Jika hanya garis kosong dengan No scan data yet dan log menunjukkan return code 124, jangan terus anggap Airspy rosak.

Ujian Airspy Jika Ragu-Ragu

Semak dahulu dongle:

airspy_info

Untuk direct IQ capture, hentikan radiod sementara:

sudo systemctl stop radiod@airspymini-autorx

Kemudian jalankan:

rm -f /tmp/airspy-test.iq

airspy_rx \
-r /tmp/airspy-test.iq \
-f 405.0 \
-a 6000000 \
-g 17 \
-n 3000000 \
-d

Semak hasil:

ls -lh /tmp/airspy-test.iq

Jika fail beberapa MB terhasil tanpa USB/streaming error, Airspy masih boleh tune, sample dan stream data. Selepas ujian:

sudo systemctl start radiod@airspymini-autorx

Kesimpulan

Prinsip paling penting untuk setup Radiosonde Auto-RX + KA9Q + Airspy Mini ialah: jangan update semua benda serentak.

BACKUP
   |
   v
SAVE WORKING IMAGE
   |
   v
UPDATE AUTO-RX
   |
   v
HEALTH CHECK
   |
   v
STABLE?
   |
   +--> YES -> KEEP
   +--> NO  -> ROLLBACK

Dengan update_autorx_safe.sh, proses update selepas ini hanya memerlukan satu command:

~/update_autorx_safe.sh

Jika image baru bermasalah, sistem masih mempunyai working image lama untuk rollback tanpa perlu mengusik KA9Q, FFTW wisdom atau konfigurasi Airspy Mini yang sudah stabil. Semoga bermanfaat de 9m2zak.

Bila KA9Q Tiba-Tiba “Hang” Walaupun Service Masih Active — Cara Saya Buat Auto-Recovery Untuk Radiosonde Auto-RX

  Cara saya buat auto-recovery untuk Radiosonde Auto-RX + KA9Q + Airspy Mini Beberapa hari selepas setup Radiosonde Auto-RX 1.9.0 + KA9Q + A...