Icom IC-7610
by @morozsm
Control an Icom IC-7610 transceiver over USB/LAN. Get/set frequency, mode, power, S-meter, SWR. CW keying and beacon mode. Remote power on/off.
clawhub install icom-7610π About This Skill
name: icom-7610 description: Control an Icom IC-7610 transceiver over USB/LAN. Get/set frequency, mode, power, S-meter, SWR. CW keying and beacon mode. Remote power on/off. metadata: {"openclaw":{"emoji":"π»","homepage":"https://clawhub.ai/morozsm/icom-7610","requires":{"bins":["rigctl","curl","python3"]},"install":[{"id":"hamlib","kind":"brew","formula":"hamlib","bins":["rigctl"],"label":"Install Hamlib (rigctl)"}]}}
Icom IC-7610
Prerequisites
brew install hamlibpip3 install pyserialConfiguration
Station config in .env (not in git). On first install: cp .env.example .env.
Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| CALLSIGN | *(required for CW/beacon)* | Your callsign |
| SERIAL_PORT | /dev/cu.usbserial-11320 | CI-V USB serial port |
| BAUD_RATE | 19200 | Serial baud rate (β οΈ not 115200!) |
| HAMLIB_MODEL | 3078 | Hamlib model ID for IC-7610 |
| FLRIG_URL | http://127.0.0.1:12345/RPC2 | flrig XML-RPC endpoint |
| RIGCTLD_ADDR | 127.0.0.1:4533 | rigctld TCP address (wfview/hamlib) |
| MAX_POWER_W | 50 | Hard power limit in watts |
source "$(dirname "$0")/.env" 2>/dev/null || true
PORT="${SERIAL_PORT:-/dev/cu.usbserial-11320}"
BAUD="${BAUD_RATE:-19200}"
MODEL="${HAMLIB_MODEL:-3078}"
FLRIG="${FLRIG_URL:-http://127.0.0.1:12345/RPC2}"
RIGCTLD="${RIGCTLD_ADDR:-127.0.0.1:4533}"
MAX_POWER="${MAX_POWER_W:-50}"
RFPOWER Scale
rigctl uses 0.0β1.0 where 1.0 = 100 W. So: RFPOWER = watts / 100.
5 W = 0.05, 50 W = 0.50. β οΈ L RFPOWER 5 = 500 W equivalent, NOT 5 watts!
flrig uses watts directly: rig.set_power 50 = 50 W.
Connecting
Three connection methods, in priority order. Auto-detect logic:
# 1. Check rigctld (wfview LAN or standalone hamlib rigctld)
if rigctl -m 2 -r "$RIGCTLD" f >/dev/null 2>&1; then
CONN="rigctld"
2. Check flrig
elif curl -s --connect-timeout 2 --max-time 3 -X POST "$FLRIG" \
-H "Content-Type: text/xml" \
-d 'rig.get_vfoA ' \
| grep -q ''; then
CONN="flrig"
3. Fall back to direct serial
else
CONN="serial"
fi
rigctld β LAN via wfview (recommended) or standalone hamlib daemon
Connects to IC-7610 over network via wfview (UDP) or a running rigctld daemon.
Full control: freq, mode, power, S-meter, SWR, CW keying, power on/off.
rigctl -m 2 -r "$RIGCTLD"
Read: f m l RFPOWER l SWR
Write: F 14074000 M USB 3000 L RFPOWER 0.50
CW: b "CQ CQ DE YOURCALL K"
Power: set_powerstat 0 (off) set_powerstat 1 (on)
Setup: wfview β Settings β Enable LAN β connect to radio IP β Enable RigCtld (port 4533).
β οΈ Note: M (set mode) may hang waiting for ack from wfview rigctld β command still executes.
Use a timeout wrapper or send as fire-and-forget when needed.
Advantages over serial:
set_powerstat 1 (no raw CI-V / pyserial needed)rigctl serial (direct USB, full control incl. CW and power on/off)
rigctl -m $MODEL -r "$PORT" -s $BAUD
Read: f (freq) m (mode+BW) l RFPOWER l SWR
Write: F 14074000 M USB 3000 L RFPOWER 0.50
CW: b "CQ CQ DE YOURCALL K"
Quick: f m l RFPOWER β freq, mode, BW, power in one call
β οΈ Baud 19200 (not 115200!). Always wrap: timeout 10 rigctl ...
β οΈ Port busy while flrig runs. Close flrig for CW/power on-off.
flrig XML-RPC
call_flrig() {
curl -s --connect-timeout 3 --max-time 5 -X POST "$FLRIG" \
-H "Content-Type: text/xml" \
-d "$1 $2 " | \
grep -o '[^<]* ' | head -1 | sed 's/<[^>]*>//g'
}
Read: call_flrig rig.get_vfoA / rig.get_modeA / rig.get_power / rig.get_Sunits / rig.get_SWR
Write: call_flrig rig.set_vfoA '14074000 '
call_flrig rig.set_modeA 'USB '
call_flrig rig.set_power '50 '
Remote Power On/Off
Requires: rear POWER switch ON + MENU β SET β Network β Power OFF Setting = Standby/Shutdown.
Via rigctld (wfview LAN) β simplest
rigctl -m 2 -r "$RIGCTLD" set_powerstat 0 # off
rigctl -m 2 -r "$RIGCTLD" set_powerstat 1 # on β works! wfview handles it
Via serial β power off works, power on needs raw CI-V
Off: rigctl -m $MODEL -r "$PORT" -s $BAUD set_powerstat 0
On: rigctl set_powerstat 1 DOES NOT WORK via serial (rig_open fails in standby). Use raw CI-V:
python3 -c "
import serial, time
ser = serial.Serial('$PORT', $BAUD, timeout=2)
ser.reset_input_buffer()
ser.write(bytes([0xFE,0xFE,0x98,0xE0,0x18,0x01,0xFD]))
time.sleep(1); resp = ser.read(100); ser.close()
print('Power ON: OK' if 0xFB in resp else 'FAIL')
"
Wait 7β10 sec after power on before sending commands. "Command rejected" during boot is normal.
CW & Beacon
Works via both rigctld (LAN) and direct serial.
# Via rigctld (LAN):
rigctl -m 2 -r "$RIGCTLD" b "CQ CQ CQ DE $CALLSIGN $CALLSIGN K"Via serial:
rigctl -m $MODEL -r "$PORT" -s $BAUD b "CQ CQ CQ DE $CALLSIGN $CALLSIGN K"Beacon loop (works with either connection)
for i in $(seq 1 $REPEATS); do
rigctl -m 2 -r "$RIGCTLD" b "VVV DE $CALLSIGN VVV DE $CALLSIGN"
[ $i -lt $REPEATS ] && sleep $INTERVAL
done
Radio setting for CW: MENU β SET β Connectors β USB Keying (CW) β RTS
Safety Rules
Pre-TX checklist (MANDATORY before every transmission)
1. Operator confirmation received 2. Frequency within amateur band (1.8β2.0, 3.5β4.0, 7.0β7.3, 10.1β10.15, 14.0β14.35, 18.068β18.168, 21.0β21.45, 24.89β24.99, 28.0β29.7 MHz) 3. Mode matches band segment (no phone below CW/data boundary) 4. Power β€ $MAX_POWER_W (default 50 W); above β extra confirmation 5. SWR β€ 3.0 if available; >3.0 β REFUSE (antenna problem)No confirmation needed
Reading freq/mode/S-meter/SWR, switching VFO, changing freq/mode, power on/off.Always require confirmation
PTT, CW keying, beacon, power > $MAX_POWER_W. Any RF transmission.Auto-refuse (even with confirmation)
Transmit outside amateur bands. Transmit with SWR > 3.0.Beacon regulatory (FCC)
Remote operation legal (Β§97.109d). Unattended beacon only 28.2β28.3, 50.06β50.08+ MHz. Below 28 MHz β operator must be on comms.Reference
Full documentation in references/FULL-REFERENCE.md β consult when needed:
βοΈ Configuration
Station config in .env (not in git). On first install: cp .env.example .env.
Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| CALLSIGN | *(required for CW/beacon)* | Your callsign |
| SERIAL_PORT | /dev/cu.usbserial-11320 | CI-V USB serial port |
| BAUD_RATE | 19200 | Serial baud rate (β οΈ not 115200!) |
| HAMLIB_MODEL | 3078 | Hamlib model ID for IC-7610 |
| FLRIG_URL | http://127.0.0.1:12345/RPC2 | flrig XML-RPC endpoint |
| RIGCTLD_ADDR | 127.0.0.1:4533 | rigctld TCP address (wfview/hamlib) |
| MAX_POWER_W | 50 | Hard power limit in watts |
source "$(dirname "$0")/.env" 2>/dev/null || true
PORT="${SERIAL_PORT:-/dev/cu.usbserial-11320}"
BAUD="${BAUD_RATE:-19200}"
MODEL="${HAMLIB_MODEL:-3078}"
FLRIG="${FLRIG_URL:-http://127.0.0.1:12345/RPC2}"
RIGCTLD="${RIGCTLD_ADDR:-127.0.0.1:4533}"
MAX_POWER="${MAX_POWER_W:-50}"
RFPOWER Scale
rigctl uses 0.0β1.0 where 1.0 = 100 W. So: RFPOWER = watts / 100.
5 W = 0.05, 50 W = 0.50. β οΈ L RFPOWER 5 = 500 W equivalent, NOT 5 watts!
flrig uses watts directly: rig.set_power 50 = 50 W.