Sistem Log FT8 Otomatis

Panduan langkah demi langkah menyambungkan WSJT-X ke Buku Log QSO Hamfinity.

Pemasangan Sistem "Live Bridge"

Sistem ini bekerja dengan memantau file log di komputer Anda. Setiap kali Anda menekan "Log QSO" di perangkat lunak FT8, program kecil ini akan menangkap dan mengirimkannya langsung ke portal secara real-time. Ikuti 7 langkah mudah ini dengan seksama.

1 🐍 Instal Perangkat Lunak Python
  1. Buka situs web resmi: python.org/downloads
  2. Klik tombol kuning besar (Download Python) untuk versi Windows terbaru.
  3. Buka file installer yang baru saja diunduh.
  4. ⚠️ SANGAT PENTING: Sebelum Anda menekan "Install Now", lihat di bagian paling bawah jendela instalasi. Anda HARUS mencentang kotak yang bertuliskan "Add python.exe to PATH". Jika langkah ini terlewat, sistem tidak akan berfungsi!
  5. Setelah dicentang, klik Install Now dan tunggu hingga selesai.
2 🌐 Instal 'Requests' (Komunikator Internet)
  1. Tekan tombol Windows di keyboard Anda, ketik cmd, dan tekan Enter. Jendela hitam (Command Prompt) akan terbuka.
  2. Salin (copy) perintah di bawah ini, tempel (paste) ke dalam jendela hitam tersebut, dan tekan Enter:
    pip install requests
  3. Sistem akan mengunduh beberapa file kecil secara otomatis. Saat muncul tulisan "Successfully installed", tutup jendela hitam tersebut.
3 📁 Temukan File Log WSJT-X Anda
  1. Buka perangkat lunak WSJT-X (atau JTDX) Anda seperti biasa.
  2. Di sudut kiri atas, klik File lalu pilih Open log directory.
  3. Sebuah folder komputer akan terbuka. Temukan file bernama wsjtx_log.adi di dalamnya.
  4. Klik pada ruang kosong di bilah alamat (address bar) di bagian paling atas folder tersebut. Teks akan berubah menjadi biru (contoh: C:\Users\PC-Anda\AppData\Local\WSJT-X).
  5. Klik kanan teks biru itu dan pilih Copy. Simpan jalur (path) ini di ingatan komputer Anda!
4 📝 Buat File Skrip Baru
  1. Buka aplikasi Notepad di komputer Anda (Tekan Start, ketik Notepad).
  2. Gulir ke bagian paling bawah halaman panduan ini, salin (copy) seluruh KODE PYTHON yang berada di dalam kotak gelap.
  3. Tempel (paste) seluruh kode tersebut ke dalam Notepad yang kosong. Jangan di-save dulu, lanjutkan ke Langkah 5.
5 ⚙️ Perbarui Pengaturan Skrip

Di bagian atas kode di Notepad Anda, cari bagian CONFIGURATION. Anda harus mengubah 3 hal penting:

  1. API_KEY: Ubah menjadi kata sandi rahasia (Silakan hubungi Admin untuk mendapatkan kode ini). Pastikan tetap berada di dalam tanda kutip " ".
  2. MY_CALLSIGN: Ganti "YOUR_CALLSIGN_HERE" dengan Callsign asli Anda (Contoh: "9M8ZAL").
  3. WSJTX_LOG_PATH: Hapus jalur (path) lama, lalu paste jalur persis yang Anda salin pada Langkah 3.
    ⚠️ PENTING: Anda HARUS menambahkan kata \wsjtx_log.adi di akhir jalur Anda, dan biarkan huruf r kecil tetap di depannya!
    Contoh: r"C:\Users\Ahmad\AppData\Local\WSJT-X\wsjtx_log.adi"
6 💾 Simpan File dengan Benar
  1. Di dalam Notepad, klik File -> Save As...
  2. Pilih lokasi penyimpanan di Desktop komputer Anda.
  3. Pada bagian Save as type, ubah dari "Text Documents (*.txt)" menjadi "All Files (*.*)".
  4. Pada kolom File name, ketik nama ini dengan tepat: ft8_live_bridge.py
  5. Klik Save.
7 🚀 Luncurkan Sistem Anda!
  1. Buka kembali jendela Command Prompt hitam (Tekan tombol Windows, ketik cmd, tekan Enter).
  2. Arahkan sistem ke Desktop Anda dengan mengetik perintah ini lalu tekan Enter:
    cd Desktop
  3. Terakhir, jalankan skrip Anda dengan mengetik perintah ini lalu tekan Enter:
    python ft8_live_bridge.py

🎉 Selamat, Anda Berhasil!

Selama jendela hitam tersebut tertulis "QSO Hamfinity Live Bridge Started" dan dibiarkan terbuka, ia sedang bekerja. Cobalah melakukan satu QSO di WSJT-X. Saat Anda mengklik "Log QSO", jendela hitam akan menampilkan ✅ Success. Anda sekarang dapat memeriksa buku log pribadi Anda di portal QSO Hamfinity!

💻 Python Script Code

Salin semua baris kod di dalam kotak gelap ini dan tampal (paste) ke dalam fail ft8_live_bridge.py anda seperti yang diterangkan di Langkah 4.

import time
import os
import re
import requests

# ==========================================
# ⚙️ CONFIGURATION - CHANGE THESE 3 THINGS!
# ==========================================
# 1. The exact URL to your new API file
API_URL = "https://qso.hamfinity.com/dashboard/api_live_log.php"

# 2. Must match the secret key provided by the Admin
API_KEY = "QSOHamfinity_Live_Secret!" 

# 3. Your callsign (to tell the database whose logbook to put it in)
MY_CALLSIGN = "YOUR_CALLSIGN_HERE"

# The location of your WSJT-X ADIF log file. 
WSJTX_LOG_PATH = r"C:\Users\YOUR_PC_NAME\AppData\Local\WSJT-X\wsjtx_log.adi"
# ==========================================

def parse_adif_record(record_string):
    """Extracts data from a single ADIF string."""
    data = {}
    tags = ['call', 'band', 'mode', 'freq', 'rst_sent', 'rst_rcvd', 'qso_date', 'time_on', 'gridsquare']
    
    for tag in tags:
        match = re.search(rf'<{tag}:\d+[^>]*>([^<\s]+)', record_string, re.IGNORECASE)
        if match:
            data[tag] = match.group(1).strip()
    return data

def send_to_portal(qso_data):
    """Sends the extracted QSO to the QSO Hamfinity PHP API."""
    
    date_str = qso_data.get('qso_date', '')
    if len(date_str) == 8:
        date_str = f"{date_str[0:4]}-{date_str[4:6]}-{date_str[6:8]}"
        
    time_str = qso_data.get('time_on', '')
    if len(time_str) >= 4:
        time_str = f"{time_str[0:2]}:{time_str[2:4]}:{time_str[4:6] if len(time_str)>=6 else '00'}"

    payload = {
        'api_key': API_KEY,
        'owner_callsign': MY_CALLSIGN,
        'qso_call': qso_data.get('call', ''),
        'band': qso_data.get('band', ''),
        'mode': qso_data.get('mode', 'FT8'),
        'freq': qso_data.get('freq', ''),
        'grid': qso_data.get('gridsquare', ''),
        'rst_sent': qso_data.get('rst_sent', ''),
        'rst_rcvd': qso_data.get('rst_rcvd', ''),
        'qso_date': date_str,
        'qso_time': time_str
    }

    try:
        print(f"📡 Sending {payload['qso_call']} to QSO Hamfinity Portal...")
        response = requests.post(API_URL, data=payload)
        
        if response.status_code == 200:
            print(f"✅ Success: {response.text}\n")
        else:
            print(f"❌ Error {response.status_code}: {response.text}\n")
    except Exception as e:
        print(f"⚠️ Connection Failed: {e}\n")

def watch_log_file():
    """Watches the WSJT-X log file