AI-controllable Yaesu FT-991A transceiver interface with web GUI, CLI, and MCP server
Project description
FT-991A Control Package
AI-controllable Yaesu FT-991A transceiver interface with LCARS-themed web GUI, command-line tools, and MCP server for AI integration.
๐ค AI Assistants: This package exposes FT-991A ham radio control via MCP (Model Context Protocol). Use
ft991a-mcpto launch the MCP server, then control frequency, mode, power, PTT, and monitor S-meter readings through standardized MCP tools.
Features
๐ LCARS Web GUI (Star Trek Theme)
- 10+ tabbed interface โ VFO Control, Audio/Waterfall, Band Scanner, Memory Channels, System, Config, Status, Diagnostics
- Audio Waterfall โ Real-time spectrogram via PCM2903B USB CODEC + browser-side FFT
- Spectrum Analyzer โ Overlay with gradient fill, grid lines, center frequency marker
- 5 Color Palettes โ RADIO (default), AMBER, BLUE, GREEN, GRAY with pre-computed color LUTs
- Inline VFO Tuner โ Click-to-type frequency entry, UP/DN buttons, step selector (10 Hzโ1 MHz), arrow key tuning
- S-Meter History Chart โ Last 120 readings with peak/avg labels and color gradient
- Band Scanner โ Sweep frequency ranges with configurable step size and squelch, click-to-tune results, CSV export
- Memory Channel Manager โ List, recall, store, and clear channels 001-099
- Antenna Auto-Tune โ ATU control button (AC001/AC002 CAT commands)
- SDR Panadapter โ Wideband waterfall via SDRplay RSP2pro (SoapySDR)
- Audio Streaming โ Listen to radio audio directly in the browser
- WebSocket Real-time Updates โ Live frequency, mode, S-meter, TX status
- Mobile Responsive โ Horizontal scrollable tab bar for phone/tablet
๐ฅ๏ธ CLI Tools
ft991a-cli statusโ Get radio statusft991a-cli freq set <hz>โ Set frequencyft991a-cli mode set <mode>โ Change modeft991a-cli cw encode/decode/sendโ Morse code operationsft991a-cli scan band --heatmap [--max-bins N] [--hotspots --hotspot-threshold S --hotspot-top N] [--hotspot-windows --window-gap-hz HZ] [--window-plan --plan-cycle-ms MS] [--window-timeline] [--window-clock] [--window-now] [--window-upcoming --upcoming-count N] [--window-brief --upcoming-count N] [--window-cue] [--window-action --action-ready-ms MS] [--window-decision --action-critical-ms MS] [--window-ops --upcoming-count N] [--window-directive --upcoming-count N] [--window-handoff --upcoming-count N] [--window-snapshot --upcoming-count N] [--window-fingerprint] [--window-stability] [--window-route] [--window-control]โ Adaptive RX band activity heatmap + ranked hotspots + merged hotspot windows + ranked RX review plan + cycle timeline projection + wall-clock sync schedule + upcoming handoff projection + compact live handoff brief + one-line live handoff cue + HOLD/READY/SWITCH handoff action signal + urgency/recheck decision signal + compact ops card with queue snapshot + actionable directive checklist + compact shift-handoff packet + machine-friendly one-line snapshot + deterministic fingerprint + stability classification + route directive + consolidated machine control packet (Features 1/20โ20/20)
Adaptive Heatmap โ Operator Note (Interface-Controlled)
- Scope is restricted to the existing
scan bandcommand path. --heatmapenables adaptive RX activity summarization;--max-binslimits output density.--hotspotsadds ranked candidate frequencies from the same adaptive heatmap model (--hotspot-threshold,--hotspot-top).--hotspot-windowsmerges nearby hotspot bins into tune-ready windows (--window-gap-hz) to reduce frequency hopping during manual review.--window-planbuilds a ranked, dwell-timed RX review sequence from hotspot windows (--plan-cycle-ms) for faster manual monitoring loops.--window-timelineprojects that ranked plan into one-cycle offsets (start/end/revisit) so operators can coordinate listen windows without changing radio state.--window-clockanchors timeline offsets to current local wall-clock time so teams can synchronize manual RX monitoring in real time.--window-nowresolves the current active window plus next scheduled step from that wall-clock plan for live RX handoff guidance.--window-upcomingprojects the next queued handoff steps from the current wall-clock position (--upcoming-count) so operators can pre-brief upcoming manual tune sequence.--window-briefprovides one compact RX handoff brief (active frequency, switch countdown, and upcoming queue) to reduce operator context switching during manual monitoring.--window-cueprovides a single-line activeโnext handoff cue for low-overhead terminal glance checks.--window-actionadds a one-line HOLD/READY/SWITCH directive derived from live handoff timing; tune READY sensitivity via--action-ready-ms.--window-decisionadds one-line action+urgency escalation (LOW/MEDIUM/HIGH/CRITICAL) plus a recommended recheck cadence; tune HIGH/CRITICAL boundary via--action-critical-ms.--window-opsadds a compact multi-line operator ops card that combines decision state with a near-term handoff queue (--upcoming-count) for lower-overhead manual RX execution.--window-directiveadds a concise actionable checklist distilled from ops-card state to reduce handoff misses during manual RX loops.--window-handoffadds a compact shift-handoff packet (headline + immediate steps + queued steps) for fast operator transitions.--window-snapshotadds a one-line machine-friendly handoff snapshot (key=value) for logs/automation glue while staying RX-only.--window-fingerprintadds deterministic snapshot signatures for dedupe/change-tracking automation.--window-stabilityadds a stability score (STABLE/WATCH/VOLATILE) from urgency + countdown pressure.--window-routeadds compact route guidance (MONITOR/PREP_HANDOFF/IMMEDIATE_HANDOFF).--window-controladds a consolidated machine control packet combining snapshot, fingerprint, stability, and route.- These features are receive-side analysis only; they do not add or modify TX behavior.
- No new top-level CLI groups or web/MCP API surfaces are introduced by these features.
๐ค MCP Server (AI Integration)
- Full radio control via Model Context Protocol
- Compatible with Claude, GPT, and other MCP-capable assistants
๐ก CAT Protocol
- Complete Yaesu CAT command implementation
- Frequency, mode, power, PTT, S-meter, band switching
- Memory channel read/write (MR/MC/MW commands)
- Antenna tuner control (AC commands)
- VFO swap, AโB copy
- TX lockout safety
Quick Install
# Install from PyPI
pip install ft991a-control
# Launch LCARS web GUI
ft991a-web --host 0.0.0.0 --port 8000 --radio-port /dev/ttyUSB0
# Launch MCP server for AI
ft991a-mcp
# Direct CLI control
ft991a-cli status
Hardware Setup
Required
- Yaesu FT-991A with USB-A to USB-B cable
- Linux host (tested on Ubuntu 22.04)
- Radio Menu โ 031 CAT RATE โ 38400 baud
- Add user to
dialoutgroup:sudo usermod -a -G dialout $USER
Recommended
- USB Audio CODEC (e.g., PCM2903B) for audio waterfall
- SDRplay RSP2pro (or compatible SoapySDR device) for wideband panadapter
Udev Rules (Stable Device Paths)
# /etc/udev/rules.d/99-ft991a.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea70", \
ATTRS{bInterfaceNumber}=="01", SYMLINK+="ft991a-cat"
Then use --radio-port /dev/ft991a-cat for stable access regardless of USB enumeration order.
Architecture
โโโโโโโโโโโโโโโโโโโ WebSocket โโโโโโโโโโโโโโโโโโโ
โ Web Browser โโโโโโโโโโโโโโโโโโโบโ FastAPI โ
โ LCARS GUI โ Real-time โ Web Server โ
โ โ Audio/FFT โ (ft991a-web) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโ โ
โ AI Assistant โโโโ MCP Protocol โโโโโโโโโโค
โ (Claude, etc) โ โ
โโโโโโโโโโโโโโโโโโโ โ
โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ SDRplay โ โ USB Audio โ โ
โ RSP2pro โ โ CODEC โ โ
โ (SoapySDR) โ โ (PCM2903B) โ โ
โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโ โ
โ IQ Data โ PCM Audio โ
โโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโค
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโ
โ FT991A CAT Library โ
โ (ft991a.cat) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
โ USB Serial
โ 38400 baud, 2 stop bits
โผ
โโโโโโโโโโโโโโโโโโโ
โ Yaesu FT-991A โ
โ Transceiver โ
โโโโโโโโโโโโโโโโโโโ
Web GUI Tabs
| Tab | Description |
|---|---|
| VFO Control | Frequency display, mode buttons, band presets, power slider, VFO swap/copy, ATU |
| Audio | Audio waterfall, spectrum analyzer, inline tuner, S-meter history, listen button |
| SDR | Wideband panadapter waterfall via SDRplay (click-to-tune, bandwidth selector) |
| Scanner | Band scanner with preset bands, custom range, step sizes, squelch threshold, and adaptive RX heatmap (ft991a-cli scan band --heatmap) |
| Memory | Memory channel manager โ list, recall, store, clear channels 001-099 |
| System | Audio device config, WebSocket status, connection info |
| Config | Serial port settings, baud rate, connection test |
| Status | Live radio status, VFO-A/B, mode, power, S-meter, SWR |
| Diagnostics | Error log, raw CAT command testing, system health |
CI/CD
GitHub Actions automatically publishes to PyPI on version tag push:
# Bump version in pyproject.toml and __init__.py, then:
git tag v0.6.2
git push github main --tags
# โ GitHub Actions builds and publishes to PyPI
Configuration
Serial Port Settings
ft991a-web --radio-port /dev/ft991a-cat --radio-baud 38400 --host 0.0.0.0 --port 8000
Radio Menu Settings
- Menu 031 (CAT RATE): 38400 (or match
--radio-baud) - Menu 032 (CAT TOT): 10 min or longer
- Menu 033 (CAT RTS): Enable
Safety
โ ๏ธ Important:
- Always verify proper antenna connection before TX
- Use TX lockout when not actively transmitting
- Ensure amateur radio license privileges for frequency/mode
- Start with low power (5-10W) for testing
- Never transmit without a licensed operator present
๐ Built-in Safety:
- Frequency range validation (30 kHz โ 470 MHz)
- Power limits (5-100W)
- TX lockout toggle
- Mode validation per frequency
- Serial timeout protection
Python API
from ft991a import FT991A, Mode
radio = FT991A(port="/dev/ft991a-cat", baudrate=38400)
radio.connect()
# Read status
status = radio.get_status()
print(f"Frequency: {status.frequency_a} Hz")
print(f"Mode: {status.mode}")
print(f"S-Meter: {status.s_meter}")
# Tune
radio.set_frequency_a(14_250_000) # 20m SSB
radio.set_mode(Mode.USB)
# Antenna tuner
radio.tuner_start() # Auto-tune
# Memory channels
radio.recall_memory(1)
radio.store_memory(5)
REST API
| Endpoint | Method | Description |
|---|---|---|
/api/status |
GET | Radio status (frequency, mode, S-meter, TX) |
/api/frequency/a |
POST | Set VFO-A frequency |
/api/frequency/b |
POST | Set VFO-B frequency |
/api/mode |
POST | Set operating mode |
/api/power |
POST | Set TX power |
/api/tuner/start |
POST | Start antenna auto-tune |
/api/tuner/on |
POST | Turn ATU on |
/api/tuner/off |
POST | Turn ATU off |
/api/vfo/swap |
POST | Swap VFO-A โ VFO-B |
/api/vfo/a-to-b |
POST | Copy VFO-A โ VFO-B |
/api/scan |
POST | Start band scan |
/api/scan/stop |
POST | Stop scan |
/api/memory/list |
GET | List memory channels |
/api/memory/recall |
POST | Recall memory channel |
/api/memory/store |
POST | Store to memory channel |
/api/memory/clear |
POST | Clear memory channel |
/ws |
WebSocket | Real-time status updates |
/ws/audio |
WebSocket | Audio FFT stream |
/ws/sdr |
WebSocket | SDR wideband FFT stream |
Contributing
git clone https://github.com/heliosarchitect/lbf-ham-radio.git
cd lbf-ham-radio
pip install -e .[dev]
pytest tests/
License
MIT License โ see LICENSE.
Links
- PyPI: https://pypi.org/project/ft991a-control/
- GitHub: https://github.com/heliosarchitect/lbf-ham-radio
- Gitea: https://gitea.fleet.wood/Helios/lbf-ham-radio
73 de KO4TUV! ๐ก AI-controlled ham radio with LCARS style
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ft991a_control-0.30.0.tar.gz.
File metadata
- Download URL: ft991a_control-0.30.0.tar.gz
- Upload date:
- Size: 140.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
893bd184c97d1251cb80e092d17e66a42b99d7d6f482331ee33f1433bb2cd665
|
|
| MD5 |
61ee70207762c82ff05a564004d960ad
|
|
| BLAKE2b-256 |
de8e7aa6dbe5246ef9d88301a5529e7f3e4be0c1ef2f9622d026b2e5c27f177d
|
File details
Details for the file ft991a_control-0.30.0-py3-none-any.whl.
File metadata
- Download URL: ft991a_control-0.30.0-py3-none-any.whl
- Upload date:
- Size: 120.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdebf8407c81d5b15e7c8ddf4a587f59fb23cf57cf414dff8df78789607f2886
|
|
| MD5 |
e699cc575ef4d3c319d9d410932e3ab5
|
|
| BLAKE2b-256 |
9fd2233da6afc1d275b406ea49d48b5679fd4207c8a6292f1be1218b31d738f1
|