Would you be OK with an external app using /api/cat/* as its radio-control interface? #78
Replies: 35 comments 3 replies
|
Hi Giovanni, Thanks for the thorough write-up again — testing Your instinct is right, and so is mine apparently: Rather than either leave you exposed to that or freeze the whole controller (which would tie my hands on the actual UI), I think the right move is to give you something narrower and genuinely committed: a small separate endpoint surface — something like The other option, which you already half-offered: extend rigctld itself to close the specific gaps you found — proper VFO B addressing (Hamlib's Both are buildable — I don't have a strong preference either way, so I'd rather build the one you'll actually get long-term value from. Which fits your app better: a small dedicated REST surface, or closing the rigctld gaps? 73, Colin |
|
Hi Giovanni — separate from the external-API discussion, but while I have you: v2.4.2-pre12 includes a fix to the FTDX3000 roofing-filter read-back. The radio reports its roofing filter in a different code space than the one used to set it, which was mislabelling 600 Hz / 300 Hz and desyncing the dropdown in AUTO — that's now corrected (verified against the CAT manual and Hamlib). If you get a chance to check the roofing dropdown behaves correctly on your FTDX3000, I'd appreciate the confirmation, since I can only test it on my FTdx101. https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre12 73, Colin |
|
Quick correction on the version, Giovanni — please grab v2.4.2-pre13 rather than pre12. A settings-save bug slipped into pre12 (the Settings page could silently fail to save if the new TX-toggle key was left blank, which it is by default) — that's now fixed in pre13. The FTDX3000 roofing-filter fix I mentioned is in pre13 as well, so it's the one to test. https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre13 Thanks, and sorry for the version shuffle! |
|
Hi Colin, Tested all three, here's what I found: Split button — confirmed, it does nothing at all on my FTDX3000. No VFO B frequency change, no split indicator, TX stays put. So your suspicion was right: it's a real no-op on this radio, not just me missing something subtle. Good that the fix (driving it via FT instead of ST) is the same mechanism you're already building for the external API split — one piece of work covering both. Radio power-on — good news here: the double-PS1; approach already works reliably on my FTDX3000 as-is, no DTR pulse needed. My own bridge does the DTR toggle mostly out of caution from earlier, flakier attempts — it's not evidence that YWC's simpler approach is insufficient. I'd say don't add the DTR pulse preemptively; if it turns out to matter for some other unit/model down the line, that's the moment to reach for it. Roofing filter (pre13) — confirmed correct now, AUTO mode shows the right 600Hz/300Hz labeling on the FTDX3000. Thanks for the fast turnaround on that one, and for flagging the pre12→pre13 mixup before I grabbed the wrong build. 73, Giovanni |
|
Hi Giovanni, Thanks for testing all three so thoroughly — exactly what I needed.
That fix is in v2.4.2-pre14: https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre14 — since I can only test on my FTdx101, I'd appreciate you confirming the Split button now actually does something on your FTDX3000 (VFO B becomes the TX VFO, split indicator shows, TX moves to the other VFO). Thanks again — your testing keeps the FTDX3000 side honest. 73, Colin |
|
Hi Colin, Confirmed on my end too — the Split button now works correctly on the FTDX3000: VFO B becomes the TX VFO, the split indicator shows, and TX properly moves to the other VFO. pre14 closes that out, thanks for the fast turnaround. One separate bug I noticed while retesting: the +5k button doesn't do anything at all — no frequency change, no visible effect of any kind. While we're on the split topic, one more thing worth raising — about the web UI itself this time, not the external API. Right now pressing Split only ever sets VFO B as the TX VFO; there's no way to do the reverse (TX on A, RX on B) or to run both RX and TX on VFO B. My own app already treats RX-VFO and TX-VFO as two fully independent selections, so a user isn't limited to "A receives, B transmits" as the only shape split can take. Since YWC's internal state already tracks FT and VS separately for the external-API work, it sounds like the web UI's Split button could expose that same independent RX/TX selection rather than just the one fixed direction — figured it's worth flagging in case it's a small lift on top of what you're already building. 73, Giovanni |
|
Hi Giovanni, Thanks for confirming the Split button now works properly on your FTDX3000 in pre14 — good to have that closed out. On the +5k button — you were right, it was doing nothing, and I found the cause. The Quick Split code was formatting the VFO B frequency with too many digits (11 instead of 9), so the radio rejected the command outright and VFO B never moved. On your FTDX3000 that bad command ran just before the split-enable step, which is why you saw no effect at all rather than just a missing offset. It turned out to affect every model, not only yours — I confirmed +5k was broken on my own FtdX101MP too, it had just never been exercised. It's fixed now and will be in the next build I put out; I'd appreciate you confirming it on the FTDX3000 when it lands. On your independent RX/TX split idea — yes, I want to do this, and I agree it's the right shape. The plan is to add two independent selectors to the web UI — one for the RX VFO and one for the TX VFO — so split isn't locked to "A receives, B transmits." Split then simply means RX and TX are on different VFOs, and you get the reverse (B-RX / A-TX) and both-on-one-VFO cases for free. It's built on the same One thing I need from your radio before I wire up the RX side. The TX half is settled —
Whichever one reliably changes the receive VFO is the one I'll build the RX selector on. And — are you happy to keep testing this as I build it? Since it's single-receiver-only, I can't exercise it on my own dual-receiver '101, so your eyes on the FTDX3000 are what will make it solid. 73, Colin |
|
One more thing, Giovanni — I've written up a concrete proposed shape for the dedicated external API (endpoints, response format, and a few questions on units/PTT) as its own discussion, so other folks building on YWC can weigh in too: 👉 #83 — External API v1 — proposed spec (feedback wanted) Since you're the one driving this, your feedback there is the one I most want before I build it. The 73, Colin |
|
Hi Colin, Nice catch on the +5k bug — makes sense it slipped through if nothing had exercised that code path before. Happy to confirm it on the FTDX3000 once the fix lands in a build. On the RX-VFO command, I don't need to test blind: my own CAT bridge already drives exactly this against a real FTDX3000 in daily use, so I can give you a confirmed answer from working code rather than a one-off manual test. FR is the right command, but not FR1;. Per the CAT manual and what I've had running reliably in production: FR0; = VFO-A RX (VFO-B off), and FR4; = VFO-B RX (VFO-A off) — the single-receiver FTDX3000 uses 0/4 as its RX-select values, not 0/1. FR1; isn't something I use, and I wouldn't assume it does what you want. On TX: FT0;/FT1; is exactly what I use too, which lines up with what already fixed the Split button. I've never used VS at all in my bridge, so I don't have a data point either way on VS0;/VS1; on this radio — can't confirm or rule it out from experience. One thing worth flagging on the read-query side, since you asked specifically: my app doesn't actually poll FR; for confirmation. Instead it infers the active RX VFO indirectly — comparing MD0; (the mode of whichever VFO is currently active) against the VFO-A mode embedded in byte 20 of the IF; response; if they differ, VFO B must be the one in RX. I genuinely don't know if that's because FR; read-back turned out unreliable on this radio at some point, or just how the polling loop happened to get built that way — so take it as "here's a method that's known to work," not as evidence FR; itself doesn't answer a read query. If a definitive answer on that would help, I'm happy to test FR;/FR0;/FR4; directly against the radio and report back exactly what it does — just say the word. Also saw #83 — I'll go read through the proposed external API spec and give you feedback there separately. 73, Giovanni |
|
Hi Giovanni, That's exactly what I needed — a confirmed answer from working code beats a one-off test every time. Thank you. So I've built it to that: RX select via It's the two RX/TX selectors we discussed, in the web UI, single-receiver radios only. It's on a branch now and builds cleanly, but since I can't exercise split on my own dual-receiver '101, you're the one who'll tell me whether it actually does the right thing on the FTDX3000 — I'll get it into a pre-release for you shortly. On the read-back: I don't think I need 73, Colin |
|
Hi Giovanni, Both are now in v2.4.2-pre16: https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre16 (pre16 is the one to grab — it's pre15 plus a small unrelated fix. The in-app updater ignores pre-releases, so you'll need the direct link.) Two things to try on the FTDX3000 when you have a moment: 1. The +5k button. You said you'd confirm once it shipped — this is it. Press +5k and VFO B should jump to VFO A + 5 kHz with split engaging (and the button gives a brief flash). 2. The new independent RX/TX selectors. On the toolbar next to Split/+5k you'll now see two small button pairs — RX [A|B] and TX [A|B] (single-receiver radios only). These are built on exactly the commands you gave me:
The things I'd most like confirmed, since I can't exercise any of this on my dual-receiver '101:
This is completely untested on real hardware — it builds cleanly here and that's all I can vouch for — so your eyes on it are what will tell me whether it's right. Anything that behaves oddly, however small, is useful. 73, Colin |
|
Hi Colin, Tested both on the FTDX3000 with pre16. RX/TX selectors — all three checks confirmed, fully working:
This is exactly the RX/TX-independent behavior my own app already does, so I can say with confidence it's right, not just "seems fine." +5k — improved but not quite there yet. It's no longer a full no-op like before: pressing it now engages split correctly, but it doesn't actually add the 5 kHz offset to VFO B — VFO B stays wherever it already was rather than jumping to VFO A + 5 kHz. So the split-enable half of the fix landed, but the frequency-offset half didn't. Separate issue, unrelated to either of the above: right now frequency doesn't sync in either direction. Changing frequency from the web UI doesn't move the radio at all, and turning the VFO knob on the radio itself doesn't update what the web UI shows. Not sure if this is a known gap or something that regressed recently, but flagging it since it's a pretty fundamental piece of the CAT link. Let me know if there's anything else useful to check on my end for any of these. 73, Giovanni |
|
Hi Giovanni, Brilliant — thank you for confirming the RX/TX selectors so thoroughly, the On the frequency sync, one quick check before I dig in, because I suspect it's tied to the testing rather than a separate break. Selecting RX B leaves VFO A's receiver off (that's what So: does normal frequency sync come back if you set RX back to A and turn split off — or after a power-cycle?
I think +5k is the same root — its offset is a frequency write to VFO B, so if writes aren't landing it won't move. Let's settle the sync first and I expect +5k to follow. 73, Colin |
|
Hi Colin, No — it's not the VFO mismatch. I tested exactly that: RX left on A, split untouched (off), and I also closed and reopened YWC entirely to rule out any leftover state. On a fresh open, YWC correctly reads and displays both VFO A and VFO B frequencies once. But after that, VFO A's frequency doesn't live-update in either direction — changing it in the web UI doesn't move the radio, and turning the knob doesn't move the web UI's display. No split, no RX-B involved at any point. So this looks like a genuine regression in the live sync loop rather than the display-follows-wrong-VFO issue you suspected — sounds like it's worth chasing properly as you said. Diagnostics from the About page: No errors in the F12 console. 73, Giovanni |
|
Hi Giovanni, That's the perfect test — restarting fresh with RX on A and split off rules out my theory completely. You're right, it's a genuine regression in the live sync loop, and thank you for being so precise about it. Here's what's going on under the hood: YWC gets live frequency updates from the radio's auto-information ( Could you grab a
Then attach the log here. That'll show me whether the radio is auto-sending frequency frames at all, and whether YWC's commands are still going out after init — which will point straight at the cause. Your setup (real FTDX3000 on COM7 at 38400) is the first live-sync test on that path in a little while, so this is genuinely useful. 73, Colin |
|
Hi Giovanni, Found it — and it's a good one. The write side was failing because of a frequency format difference I hadn't accounted for: the FTDX3000 uses 8-digit The fix: YWC now learns each radio's frequency width from its own responses and formats writes to match, so the FTDX3000 gets 8-digit commands. It's in v2.4.2-pre18: https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre18 When you get a chance, could you confirm on the FTDX3000:
Between the polling fallback in pre17 and this, both directions should finally be solid. Thanks again — your log had the answer sitting right in it. 73, Colin |
|
Hi Colin, No change on pre18, unfortunately — same as pre17. Web → radio still doesn't move the radio, and +5k still doesn't work either. Grabbed a fresh log on pre18 with the same sequence as before (fresh start, knob turns, one frequency change from the web UI) — attached below. 73, Giovanni |
|
Hi Giovanni, Thanks for the quick turnaround — and sorry, pre18 clearly didn't do it. I've realised my 1. A quick isolation test — no new build needed. Could you try changing frequency from the browser with only YWC connected to the radio — i.e. close your own CAT bridge and WSJT-X first, so nothing else is sharing the VSPE link? If the write suddenly works with YWC alone, it tells me this is a collision on the shared link (three apps writing to one port), which is a very different fix. If it still fails with YWC alone, it's the command itself. 2. A diagnostic build. I've put out v2.4.2-pre19, which logs the exact frequency command after the width fix — so we can finally see whether it goes out as 8 or 9 digits: https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre19 If you grab a fresh log on pre19 (same sequence — fresh start, one frequency change from the browser), look for a line tagged Really appreciate your patience with this one — the read side is solid now, and this write path is the last piece. I'm giving up for today, but I'll be back at it tomorrow. 73, Colin |
|
Hi Colin, Went through the pre19 log carefully — no [wire] line anywhere in it, so that diagnostic doesn't seem to be firing at all on this path. But the existing [sent] lines already answer the question on their own: they clearly show 9-digit frequency values still going out — FA021076300;, FA021076100;, FA021076000; from the browser test, and the same pattern on VFO B (FB014074250;, etc.). So the width fix doesn't appear to be applied on this write path even in pre19. And matching that: none of those [sent] FA... lines is followed by the radio echoing the new frequency back — just the usual TX0;/SM00xx;/AN010; telemetry, no FA confirmation — consistent with the radio silently rejecting a 9-digit command it can't parse. Log attached again for reference. 73, Giovanni |
|
Hi Giovanni, Your "no I've moved it to the path the writes really take. v2.4.2-pre20: https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre20 — this is the first build that genuinely sends 8-digit frequency commands to the FTDX3000. Whenever you get to it (no rush — tomorrow's fine):
If it now sends 8 digits and the radio still ignores them, then we're into the shared-link theory and that only-YWC test becomes the next step — but let's see if the format fix alone does it first. Thanks again for the sharp log-reading — that's what turned this around. 73, Colin |
|
Hi Colin, Tested pre20 — victory! Both directions of frequency sync work perfectly now (web ↔ radio, and radio → web via the knob), and +5k finally works too, setting VFO B to +5 kHz and engaging split correctly. This one's fully resolved on my end. I did grab a log from the pre20 test just in case, but since everything's working I won't attach it unless you want it for confirmation. Thanks for sticking with it through all the iterations — the log-reading back-and-forth paid off. 73, Giovanni |
|
Hi Giovanni, Brilliant — thank you. That's the write path sorted, and between pre17's polling and pre20's format fix the FTDX3000 frequency sync is solid both ways, plus +5k. No need for the log — "it all works" is exactly the result I wanted. I owe you a real thank-you for this one. You carried the FTDX3000 through a long chain of pre-releases — the split fix, the +5k catch, the auto-info diagnosis, and then the frequency-width detective work that your log-reading cracked wide open. YWC's FTDX3000 support genuinely exists because of your testing, not my reading of the manual. Which brings me to what I wanted to ask: from everything you've put it through, do you think we can now confidently say YWC works with the FTDX3000? You've exercised frequency (both directions), mode, split — including the independent RX/TX selectors and reverse split — +5k, ATU, roofing filters, meters, and the connection/power handling, so you've covered more of it than anyone. If you're happy it's solid, I'll gladly state the FTDX3000 is fully supported and tested. And if there's anything still on your "not quite right" list, now's the moment — I'll chase it. Either way, these fixes will land in the next full release. Thanks again — this was a proper collaboration. 73, Colin |
|
Hi Colin, I've tested every control feature the panel exposes and they all work correctly at this point. One thing still leaves me uncertain, though: the power meter. If I set max RF power to, say, 40W, the meter can still show the radio outputting something like 70W — well above the configured cap. That shouldn't be possible, so either the reading itself is wrong (a scaling/calibration issue, maybe similar to the VDD conversion mismatch we found back in #75) or something's off in how it relates to the power setting. Worth looking into before calling this fully buttoned up. Apart from that one, I'd say we're there — frequency (both directions), mode, split (including independent RX/TX and reverse split), +5k, ATU, roofing filter, meters otherwise, and connection/power handling have all held up under real testing on the FTDX3000. 73, Giovanni |
|
Hi Giovanni, That's a great result — thank you for putting it through everything. And you were spot-on about the power meter: it's a calibration issue, not a functional one. I dug into the cause: YWC's default power-meter calibration for the FTDX3000 is currently just a copy of the FtdX101MP's. The '101 is a 200W radio and its power-meter ADC scales differently from the FTDX3000's, so that borrowed curve reads high on your 100W rig — which is exactly your "40W showing as 70W." Same "borrowed scaling" story as the VDD mismatch on #75. The good news: if you calibrate it, we can bake your numbers into YWC so every future FTDX3000 user starts correct. Could you do the Power meter on the Calibration page:
Then send me the result — either your Thanks again — this has been a proper team effort. You've essentially made the FTDX3000 a first-class supported radio. 73, Colin |
|
One extra bit of context, Giovanni — while I was in there I checked the rest of your FTDX3000's default calibration, and it turns out the whole set, not just power, is currently inherited from the FtdX101MP: every meter curve is identical. So the FTDX3000 has genuinely been running on the '101's numbers all along. Power is the one that's clearly wrong, because of the 200 W vs 100 W difference — so that's the priority, and your calibration will sort it. The rest are a mixed bag: temperature, PA voltage and the SWR ratio may well be close enough between the two radios (probably why they looked fine to you), while the S-meter and IDD are more radio-specific. The S-meter is actually the easiest of the lot to do — no signal generator needed. The RF/SQL control should let you produce a range of different S-meter readings as you move it, which you can capture as your calibration points straight off the Calibration page. I don't want to send you down a rabbit hole calibrating everything — power alone makes the FTDX3000 solid for the release. But if you fancy knocking off the S-meter too while you're there (or SWR against a known load later), the same Calibration page handles it, and I'll gladly fold whatever you send into the FTDX3000 defaults. No pressure — power's the one that matters right now. 73, Colin |
|
Hi Colin, I'll get the power calibration readings done as soon as I can — I need to pick up a dummy load first before I key the radio at those levels, so it'll take a little while, but I'm on it. 73, Giovanni |
|
Hi Giovanni, You don't necessarily need to buy a dummy load for this — your normal antenna will do as long as it's a low SWR on the band you test on (through your tuner if need be). The only thing that really matters for the calibration is that the radio is genuinely putting out the power it's set to. That's the catch with a mismatched antenna: on higher SWR the FTDX3000's ALC/protection folds the power back, so a "100 W" setting might only deliver 70 W — and you'd be pairing the wrong wattage against the raw reading. Into a good match (or a dummy load's clean 50 Ω) the radio delivers each level accurately, which is why the dummy load is the textbook choice — that, and it keeps your string of test carriers off-air. So: if your antenna's a good match on a quiet frequency, just use it — set a few power levels, note the raw "Current RM Value" against each, and you're done. If the SWR's up where you'd transmit, or you'd rather not radiate a carrier while stepping through the levels, then a dummy load is the cleaner route. Either works fine. 73, Colin |
|
Hi Colin, Since we're already this deep into it, I'd rather do it properly. I'm going to borrow a dummy load from a ham friend and take accurate measurements, so we can get everything calibrated as well as possible — power for sure, and I'll knock out the S-meter too while I'm at it. 73, Giovanni |
|
Perfect — I really appreciate you doing it properly. No rush at all; borrow the dummy load whenever suits. Send me the power and S-meter numbers when you've got them and I'll fold both into the FTDX3000 defaults. Getting a proper two-meter calibration out of this makes the radio genuinely first-class — thank you, Giovanni. 73, Colin |
|
Hi Giovanni, Quick follow-up so you're all set for when the dummy load turns up. I've put out a new test build, v2.4.2-pre21, that makes sending me your calibration painless -- no file-copying involved. Download: https://github.com/mm5agm/Yaesu_Web_Control/releases/tag/v2.4.2-pre21 Grab Yaesu_Web_Control_Setup.exe under Assets. It's a pre-release, so my in-app updater won't offer it automatically -- this direct link is the only way to get it. When you're ready to calibrate:
That's it. I'll fold your power and S-meter figures straight into the FTDX3000 defaults so every FTDX3000 owner gets accurate meters out of the box, with full credit to you. No rush at all -- whenever the dummy load is sorted. 73, Colin |
Uh oh!
There was an error while loading. Please reload this page.
Hi Colin,
Following up on #76 — the ATU support in pre8 works great, thank you again.
Since that landed I started looking at whether I could go further and drop my own CAT bridge entirely, so let me explain the current setup properly this time.
What I'm running today: a custom desktop app for my own shack (logbook/cluster/FT8 automation/dxpedition tracking ecc) that talks to the radio through a small Python TCP bridge I wrote myself (cat_server.py), running on the same Windows PC as YWC. It translates a simple TCP protocol into raw Yaesu CAT over a virtual serial port. My app, YWC, and WSJT-X all share that one physical CAT link concurrently via VSPE virtual serial ports — no port contention, that part's solved.
What I tried next: with ATU now covered, I went looking at whether rigctld alone could replace my bridge entirely. It can't, quite — I found (and tested directly against my running instance) that get_vfo/set_vfo always forces VFOA, get_level SWR isn't implemented, set_level/set_powerstat are no-ops or missing, and split/RIT/XIT are local stub fields that never touch the radio. None of that is a complaint — rigctld is clearly scoped for what WSJT-X/Log4OM need, and it does that well.
What I found instead: poking around the repo, Controllers/CatController.cs — the REST API your own web UI runs on — already covers everything my app needs in one place. GET /api/cat/status gives me both VFOs (freq/mode/S-meter) plus real SWR/power/ALC/compression/temperature in one call, and the POST endpoints for frequency, mode, split, ATU and radio power-on all go straight to ICatClient.SendCommandAsync — real CAT, not stubs. I tested GET /api/cat/status against my running instance from my Mac and it came back with live, correct data for both VFOs.
The actual ask: that API obviously wasn't built or documented as a public integration surface — it's what your own frontend uses internally. Before I build anything real on top of it, I wanted to check: are you comfortable with an external program depending on /api/cat/* the way WSJT-X depends on rigctld? If it's likely to move around or change shape as you keep developing the UI, I'd rather know that now than find out via a broken app after an update. If you'd rather I stick to rigctld and eventually file requests for the specific gaps instead (VFO B, real SWR, real set_level/set_powerstat), that's completely fine too — just want to build on whichever surface you're actually willing to keep stable for outside consumers, rather than assume.
Either way, happy to report back anything I find useful along the way.
Giovanni
All reactions