{
  "schemaVersion": "1.0",
  "item": {
    "slug": "icom-7610",
    "name": "Icom IC-7610",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/morozsm/icom-7610",
    "canonicalUrl": "https://clawhub.ai/morozsm/icom-7610",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/icom-7610",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=icom-7610",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/FULL-REFERENCE.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/icom-7610"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/icom-7610",
    "agentPageUrl": "https://openagent3.xyz/skills/icom-7610/agent",
    "manifestUrl": "https://openagent3.xyz/skills/icom-7610/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/icom-7610/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Prerequisites",
        "body": "Hamlib (rigctl): brew install hamlib\ncurl: usually pre-installed\npython3: usually pre-installed\npyserial (only for serial power on): pip3 install pyserial\nwfview (optional, for LAN control): wfview.org/download"
      },
      {
        "title": "Configuration",
        "body": "Station config in .env (not in git). On first install: cp .env.example .env."
      },
      {
        "title": "Environment Variables",
        "body": "VariableDefaultDescriptionCALLSIGN(required for CW/beacon)Your callsignSERIAL_PORT/dev/cu.usbserial-11320CI-V USB serial portBAUD_RATE19200Serial baud rate (⚠️ not 115200!)HAMLIB_MODEL3078Hamlib model ID for IC-7610FLRIG_URLhttp://127.0.0.1:12345/RPC2flrig XML-RPC endpointRIGCTLD_ADDR127.0.0.1:4533rigctld TCP address (wfview/hamlib)MAX_POWER_W50Hard power limit in watts\n\nsource \"$(dirname \"$0\")/.env\" 2>/dev/null || true\nPORT=\"${SERIAL_PORT:-/dev/cu.usbserial-11320}\"\nBAUD=\"${BAUD_RATE:-19200}\"\nMODEL=\"${HAMLIB_MODEL:-3078}\"\nFLRIG=\"${FLRIG_URL:-http://127.0.0.1:12345/RPC2}\"\nRIGCTLD=\"${RIGCTLD_ADDR:-127.0.0.1:4533}\"\nMAX_POWER=\"${MAX_POWER_W:-50}\""
      },
      {
        "title": "RFPOWER Scale",
        "body": "rigctl uses 0.0–1.0 where 1.0 = 100 W. So: RFPOWER = watts / 100.\n5 W = 0.05, 50 W = 0.50. ⚠️ L RFPOWER 5 = 500 W equivalent, NOT 5 watts!\nflrig uses watts directly: rig.set_power 50 = 50 W."
      },
      {
        "title": "Connecting",
        "body": "Three connection methods, in priority order. Auto-detect logic:\n\n# 1. Check rigctld (wfview LAN or standalone hamlib rigctld)\nif rigctl -m 2 -r \"$RIGCTLD\" f >/dev/null 2>&1; then\n  CONN=\"rigctld\"\n# 2. Check flrig\nelif curl -s --connect-timeout 2 --max-time 3 -X POST \"$FLRIG\" \\\n     -H \"Content-Type: text/xml\" \\\n     -d '<?xml version=\"1.0\"?><methodCall><methodName>rig.get_vfoA</methodName></methodCall>' \\\n     | grep -q '<value>'; then\n  CONN=\"flrig\"\n# 3. Fall back to direct serial\nelse\n  CONN=\"serial\"\nfi"
      },
      {
        "title": "rigctld — LAN via wfview (recommended) or standalone hamlib daemon",
        "body": "Connects to IC-7610 over network via wfview (UDP) or a running rigctld daemon.\nFull control: freq, mode, power, S-meter, SWR, CW keying, power on/off.\n\nrigctl -m 2 -r \"$RIGCTLD\" <cmd>\n# Read:  f   m   l RFPOWER   l SWR\n# Write: F 14074000   M USB 3000   L RFPOWER 0.50\n# CW:    b \"CQ CQ DE YOURCALL K\"\n# Power: set_powerstat 0 (off)   set_powerstat 1 (on)\n\nSetup: wfview → Settings → Enable LAN → connect to radio IP → Enable RigCtld (port 4533).\n\n⚠️ Note: M (set mode) may hang waiting for ack from wfview rigctld — command still executes.\nUse a timeout wrapper or send as fire-and-forget when needed.\n\nAdvantages over serial:\n\nNo USB cable needed — Ethernet only\nPower on works with simple set_powerstat 1 (no raw CI-V / pyserial needed)\nMultiple programs can share the radio via wfview (rigctld + virtual serial port)\nLonger distance (Ethernet 100m vs USB 5m)"
      },
      {
        "title": "rigctl serial (direct USB, full control incl. CW and power on/off)",
        "body": "rigctl -m $MODEL -r \"$PORT\" -s $BAUD <cmd>\n# Read:  f (freq)  m (mode+BW)  l RFPOWER  l SWR\n# Write: F 14074000   M USB 3000   L RFPOWER 0.50\n# CW:    b \"CQ CQ DE YOURCALL K\"\n# Quick: f m l RFPOWER   → freq, mode, BW, power in one call\n\n⚠️ Baud 19200 (not 115200!). Always wrap: timeout 10 rigctl ...\n⚠️ Port busy while flrig runs. Close flrig for CW/power on-off."
      },
      {
        "title": "flrig XML-RPC",
        "body": "call_flrig() {\n  curl -s --connect-timeout 3 --max-time 5 -X POST \"$FLRIG\" \\\n    -H \"Content-Type: text/xml\" \\\n    -d \"<?xml version=\\\"1.0\\\"?><methodCall><methodName>$1</methodName><params>$2</params></methodCall>\" | \\\n    grep -o '<value>[^<]*</value>' | head -1 | sed 's/<[^>]*>//g'\n}\n# Read:  call_flrig rig.get_vfoA / rig.get_modeA / rig.get_power / rig.get_Sunits / rig.get_SWR\n# Write: call_flrig rig.set_vfoA '<param><value><double>14074000</double></value></param>'\n#        call_flrig rig.set_modeA '<param><value><string>USB</string></value></param>'\n#        call_flrig rig.set_power '<param><value><double>50</double></value></param>'"
      },
      {
        "title": "Remote Power On/Off",
        "body": "Requires: rear POWER switch ON + MENU → SET → Network → Power OFF Setting = Standby/Shutdown."
      },
      {
        "title": "Via rigctld (wfview LAN) — simplest",
        "body": "rigctl -m 2 -r \"$RIGCTLD\" set_powerstat 0   # off\nrigctl -m 2 -r \"$RIGCTLD\" set_powerstat 1   # on — works! wfview handles it"
      },
      {
        "title": "Via serial — power off works, power on needs raw CI-V",
        "body": "Off: rigctl -m $MODEL -r \"$PORT\" -s $BAUD set_powerstat 0\n\nOn: rigctl set_powerstat 1 DOES NOT WORK via serial (rig_open fails in standby). Use raw CI-V:\n\npython3 -c \"\nimport serial, time\nser = serial.Serial('$PORT', $BAUD, timeout=2)\nser.reset_input_buffer()\nser.write(bytes([0xFE,0xFE,0x98,0xE0,0x18,0x01,0xFD]))\ntime.sleep(1); resp = ser.read(100); ser.close()\nprint('Power ON: OK' if 0xFB in resp else 'FAIL')\n\"\n\nWait 7–10 sec after power on before sending commands. \"Command rejected\" during boot is normal."
      },
      {
        "title": "CW & Beacon",
        "body": "Works via both rigctld (LAN) and direct serial.\n\n# Via rigctld (LAN):\nrigctl -m 2 -r \"$RIGCTLD\" b \"CQ CQ CQ DE $CALLSIGN $CALLSIGN K\"\n\n# Via serial:\nrigctl -m $MODEL -r \"$PORT\" -s $BAUD b \"CQ CQ CQ DE $CALLSIGN $CALLSIGN K\"\n\n# Beacon loop (works with either connection)\nfor i in $(seq 1 $REPEATS); do\n  rigctl -m 2 -r \"$RIGCTLD\" b \"VVV DE $CALLSIGN VVV DE $CALLSIGN\"\n  [ $i -lt $REPEATS ] && sleep $INTERVAL\ndone\n\nRadio setting for CW: MENU → SET → Connectors → USB Keying (CW) → RTS"
      },
      {
        "title": "Pre-TX checklist (MANDATORY before every transmission)",
        "body": "Operator confirmation received\nFrequency 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)\nMode matches band segment (no phone below CW/data boundary)\nPower ≤ $MAX_POWER_W (default 50 W); above → extra confirmation\nSWR ≤ 3.0 if available; >3.0 → REFUSE (antenna problem)"
      },
      {
        "title": "No confirmation needed",
        "body": "Reading freq/mode/S-meter/SWR, switching VFO, changing freq/mode, power on/off."
      },
      {
        "title": "Always require confirmation",
        "body": "PTT, CW keying, beacon, power > $MAX_POWER_W. Any RF transmission."
      },
      {
        "title": "Auto-refuse (even with confirmation)",
        "body": "Transmit outside amateur bands. Transmit with SWR > 3.0."
      },
      {
        "title": "Beacon regulatory (FCC)",
        "body": "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."
      },
      {
        "title": "Reference",
        "body": "Full documentation in references/FULL-REFERENCE.md — consult when needed:\n\nComplete flrig XML-RPC method list (30+ methods)\nCI-V protocol reference (commands, modes, addressing)\nError recovery table (common errors + fixes)\nShell helper functions (freq_valid, set_power_safe, rig_retry, preflight, quick_status)\nRadio menu settings (Network, CI-V, Connectors)\nCompatibility notes for other Icom transceivers\nUS Amateur Band Plan table (detailed, with CW/Data/Phone segments)"
      }
    ],
    "body": "Icom IC-7610\nPrerequisites\nHamlib (rigctl): brew install hamlib\ncurl: usually pre-installed\npython3: usually pre-installed\npyserial (only for serial power on): pip3 install pyserial\nwfview (optional, for LAN control): wfview.org/download\nConfiguration\n\nStation config in .env (not in git). On first install: cp .env.example .env.\n\nEnvironment Variables\nVariable\tDefault\tDescription\nCALLSIGN\t(required for CW/beacon)\tYour callsign\nSERIAL_PORT\t/dev/cu.usbserial-11320\tCI-V USB serial port\nBAUD_RATE\t19200\tSerial baud rate (⚠️ not 115200!)\nHAMLIB_MODEL\t3078\tHamlib model ID for IC-7610\nFLRIG_URL\thttp://127.0.0.1:12345/RPC2\tflrig XML-RPC endpoint\nRIGCTLD_ADDR\t127.0.0.1:4533\trigctld TCP address (wfview/hamlib)\nMAX_POWER_W\t50\tHard power limit in watts\nsource \"$(dirname \"$0\")/.env\" 2>/dev/null || true\nPORT=\"${SERIAL_PORT:-/dev/cu.usbserial-11320}\"\nBAUD=\"${BAUD_RATE:-19200}\"\nMODEL=\"${HAMLIB_MODEL:-3078}\"\nFLRIG=\"${FLRIG_URL:-http://127.0.0.1:12345/RPC2}\"\nRIGCTLD=\"${RIGCTLD_ADDR:-127.0.0.1:4533}\"\nMAX_POWER=\"${MAX_POWER_W:-50}\"\n\nRFPOWER Scale\n\nrigctl 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.\n\nConnecting\n\nThree connection methods, in priority order. Auto-detect logic:\n\n# 1. Check rigctld (wfview LAN or standalone hamlib rigctld)\nif rigctl -m 2 -r \"$RIGCTLD\" f >/dev/null 2>&1; then\n  CONN=\"rigctld\"\n# 2. Check flrig\nelif curl -s --connect-timeout 2 --max-time 3 -X POST \"$FLRIG\" \\\n     -H \"Content-Type: text/xml\" \\\n     -d '<?xml version=\"1.0\"?><methodCall><methodName>rig.get_vfoA</methodName></methodCall>' \\\n     | grep -q '<value>'; then\n  CONN=\"flrig\"\n# 3. Fall back to direct serial\nelse\n  CONN=\"serial\"\nfi\n\nrigctld — LAN via wfview (recommended) or standalone hamlib daemon\n\nConnects 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.\n\nrigctl -m 2 -r \"$RIGCTLD\" <cmd>\n# Read:  f   m   l RFPOWER   l SWR\n# Write: F 14074000   M USB 3000   L RFPOWER 0.50\n# CW:    b \"CQ CQ DE YOURCALL K\"\n# Power: set_powerstat 0 (off)   set_powerstat 1 (on)\n\n\nSetup: wfview → Settings → Enable LAN → connect to radio IP → Enable RigCtld (port 4533).\n\n⚠️ 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.\n\nAdvantages over serial:\n\nNo USB cable needed — Ethernet only\nPower on works with simple set_powerstat 1 (no raw CI-V / pyserial needed)\nMultiple programs can share the radio via wfview (rigctld + virtual serial port)\nLonger distance (Ethernet 100m vs USB 5m)\nrigctl serial (direct USB, full control incl. CW and power on/off)\nrigctl -m $MODEL -r \"$PORT\" -s $BAUD <cmd>\n# Read:  f (freq)  m (mode+BW)  l RFPOWER  l SWR\n# Write: F 14074000   M USB 3000   L RFPOWER 0.50\n# CW:    b \"CQ CQ DE YOURCALL K\"\n# Quick: f m l RFPOWER   → freq, mode, BW, power in one call\n\n\n⚠️ Baud 19200 (not 115200!). Always wrap: timeout 10 rigctl ... ⚠️ Port busy while flrig runs. Close flrig for CW/power on-off.\n\nflrig XML-RPC\ncall_flrig() {\n  curl -s --connect-timeout 3 --max-time 5 -X POST \"$FLRIG\" \\\n    -H \"Content-Type: text/xml\" \\\n    -d \"<?xml version=\\\"1.0\\\"?><methodCall><methodName>$1</methodName><params>$2</params></methodCall>\" | \\\n    grep -o '<value>[^<]*</value>' | head -1 | sed 's/<[^>]*>//g'\n}\n# Read:  call_flrig rig.get_vfoA / rig.get_modeA / rig.get_power / rig.get_Sunits / rig.get_SWR\n# Write: call_flrig rig.set_vfoA '<param><value><double>14074000</double></value></param>'\n#        call_flrig rig.set_modeA '<param><value><string>USB</string></value></param>'\n#        call_flrig rig.set_power '<param><value><double>50</double></value></param>'\n\nRemote Power On/Off\n\nRequires: rear POWER switch ON + MENU → SET → Network → Power OFF Setting = Standby/Shutdown.\n\nVia rigctld (wfview LAN) — simplest\nrigctl -m 2 -r \"$RIGCTLD\" set_powerstat 0   # off\nrigctl -m 2 -r \"$RIGCTLD\" set_powerstat 1   # on — works! wfview handles it\n\nVia serial — power off works, power on needs raw CI-V\n\nOff: rigctl -m $MODEL -r \"$PORT\" -s $BAUD set_powerstat 0\n\nOn: rigctl set_powerstat 1 DOES NOT WORK via serial (rig_open fails in standby). Use raw CI-V:\n\npython3 -c \"\nimport serial, time\nser = serial.Serial('$PORT', $BAUD, timeout=2)\nser.reset_input_buffer()\nser.write(bytes([0xFE,0xFE,0x98,0xE0,0x18,0x01,0xFD]))\ntime.sleep(1); resp = ser.read(100); ser.close()\nprint('Power ON: OK' if 0xFB in resp else 'FAIL')\n\"\n\n\nWait 7–10 sec after power on before sending commands. \"Command rejected\" during boot is normal.\n\nCW & Beacon\n\nWorks via both rigctld (LAN) and direct serial.\n\n# Via rigctld (LAN):\nrigctl -m 2 -r \"$RIGCTLD\" b \"CQ CQ CQ DE $CALLSIGN $CALLSIGN K\"\n\n# Via serial:\nrigctl -m $MODEL -r \"$PORT\" -s $BAUD b \"CQ CQ CQ DE $CALLSIGN $CALLSIGN K\"\n\n# Beacon loop (works with either connection)\nfor i in $(seq 1 $REPEATS); do\n  rigctl -m 2 -r \"$RIGCTLD\" b \"VVV DE $CALLSIGN VVV DE $CALLSIGN\"\n  [ $i -lt $REPEATS ] && sleep $INTERVAL\ndone\n\n\nRadio setting for CW: MENU → SET → Connectors → USB Keying (CW) → RTS\n\nSafety Rules\nPre-TX checklist (MANDATORY before every transmission)\nOperator confirmation received\nFrequency 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)\nMode matches band segment (no phone below CW/data boundary)\nPower ≤ $MAX_POWER_W (default 50 W); above → extra confirmation\nSWR ≤ 3.0 if available; >3.0 → REFUSE (antenna problem)\nNo confirmation needed\n\nReading freq/mode/S-meter/SWR, switching VFO, changing freq/mode, power on/off.\n\nAlways require confirmation\n\nPTT, CW keying, beacon, power > $MAX_POWER_W. Any RF transmission.\n\nAuto-refuse (even with confirmation)\n\nTransmit outside amateur bands. Transmit with SWR > 3.0.\n\nBeacon regulatory (FCC)\n\nRemote operation legal (§97.109d). Unattended beacon only 28.2–28.3, 50.06–50.08+ MHz. Below 28 MHz → operator must be on comms.\n\nReference\n\nFull documentation in references/FULL-REFERENCE.md — consult when needed:\n\nComplete flrig XML-RPC method list (30+ methods)\nCI-V protocol reference (commands, modes, addressing)\nError recovery table (common errors + fixes)\nShell helper functions (freq_valid, set_power_safe, rig_retry, preflight, quick_status)\nRadio menu settings (Network, CI-V, Connectors)\nCompatibility notes for other Icom transceivers\nUS Amateur Band Plan table (detailed, with CW/Data/Phone segments)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/morozsm/icom-7610",
    "publisherUrl": "https://clawhub.ai/morozsm/icom-7610",
    "owner": "morozsm",
    "version": "2.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/icom-7610",
    "downloadUrl": "https://openagent3.xyz/downloads/icom-7610",
    "agentUrl": "https://openagent3.xyz/skills/icom-7610/agent",
    "manifestUrl": "https://openagent3.xyz/skills/icom-7610/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/icom-7610/agent.md"
  }
}