Band-specific transmit sequencing for the IC-905 VHF/UHF/SHF Transceiver — driven entirely off the Ethernet link between the controller and the RF deck.
A native C systemd service for the Raspberry Pi that taps the control stream, decodes band, frequency and the explicit transmit command, and drives PCA9538A relays as a timed TX/RX sequence — for every band, 2m through 10 GHz.
The IC-905 splits its controller and RF deck, linked only by Ethernet. This service listens on that link and turns it into precise, band-aware relay control — no SEND-jack PTT, no per-band wiring.
Reads the controller's explicit transmit command (byte 38 of the 0x44 status frame) — works on every band, including 2m/70cm.
Decodes band & frequency from the same stream and switches the right relays for the active band.
Per-relay millisecond delays close in order on TX and open mirrored on RX — protects amp and relay contacts.
Authenticated local broker publishes band/TX/frequency/relay state and accepts manual relay commands over WiFi.
Packet path stays off the network and MQTT threads, so relay timing is never blocked.
A simple /etc/ic905-relay.conf maps bands to relays with delays — multi-band rules and per-band timing supported.
The radio reports the true frequency only on 2m; every higher band reports an IF value it up-converts from. All six were measured on-air and map cleanly.
| Band | Real frequency | Reported IF | Relay action |
|---|---|---|---|
| 2m | 144 MHz | 144.1 MHz · true | ✓ verified |
| 70cm | 430 MHz | 233.1 MHz | ✓ verified |
| 23cm | 1296 MHz | 407.0 MHz | ✓ verified |
| 13cm | 2400 MHz | 566.1 MHz | ✓ verified |
| 6cm | 5600 MHz | 1073.0 MHz | ✓ verified |
| 3cm | 10 GHz | 1757.3 MHz | ✓ verified |
Classification keys off the decoded band, not the raw IF — boundaries centered on the measured values.
Promiscuous capture on eth0 of the controller→deck stream (TCP 50004).
Band/frequency at offset 184, TX state at byte 38 of the 0x44 frame.
Schedule relay open/close events per the config delays on each TX/RX edge.
Write the PCA9538A I²C expanders; publish state to MQTT.
One plain-text file — /etc/ic905-relay.conf — maps bands to relays. Every rule is three fields:
1–6. Relays 1–3 are on board 1 (I²C 0x70), 4–6 on board 2 (0x73).
2m 70cm 23cm 13cm 6cm 3cm (or MHz), or all for every band. Combine with /: 23cm/2m.
Milliseconds after the TX edge before the relay closes. Per-band delays can be /-listed too.
# relay, band, delay_ms 1, 23cm, 0 # 23cm: relay 1 closes immediately, 2, 23cm, 10 # relay 2 ten ms later (board 1) 4, 13cm, 0 # 13cm sequence on board 2 5, 13cm, 20 3, all, 25 # amp PTT on ANY band, after the others 6, 2m/70cm, 0 # one relay shared by two bands
On TX the matching relays close in increasing-delay order; on RX they open in mirrored reverse order (same gaps), so contacts are never hot-switched. A band change while keyed ramps the old band down, then the new band up. Edit, then sudo systemctl restart ic905-relay. More ready-to-use patterns in CONFIG-EXAMPLES.md.