From a1e56b997e549b990dfdbc1de57061e28efbbd85 Mon Sep 17 00:00:00 2001 From: stroblme Date: Sat, 22 Aug 2026 12:41:39 +0200 Subject: [PATCH] aircon rig: both units, both firmwares, and the catches that blocked control The panel now carries one wfrac node per unit, polling as well as commanding, so a command can be checked against the unit's own answer rather than assumed. Three things kept a panel from driving the old unit. The seeded commands catch is off by default, which is the usual reason a fresh panel looks dead; AIRCON_COMMANDS=1 arms it at seed time. A unit that is off names no mode, and a flow redelivers every bound port on each run, so that rejected value blocked every command including power-on. And the old firmware serves one connection at a time. --- ROADMAP.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 5e0b06d..5abbfb3 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -101,6 +101,18 @@ external interfaces. See `docs/architecture/structure.canvas` → *Backend – M that gets updated costs one retry rather than a reconfiguration. The payload is identical across both, so only the transport moved. Verified against one unit of each generation, read and command +- [x] The aircon rig covers both units and both firmware generations: one + `wfrac` node each in `aircon_control`, polling as well as commanding, so + the panel shows what a unit answers next to what was asked of it. Three + things had to be fixed before a panel could actually drive one. The + seeded `commands` catch is off, which is the usual reason a fresh panel + looks dead — `AIRCON_COMMANDS=1` arms it at seed time. A unit that is off + names no mode and reports `unknown`, and a flow redelivers every bound + port on each run, so rejecting it made an idle unit impossible to start; + it now travels through untouched. And the old firmware serves one + connection at a time, answering an overlapping request with 501 — the + connector serialises per adapter and retries a busy one, which it must, + because other clients on the network are outside that lock - [x] Node lifecycle as a protocol (`start`/`stop`/`report_health` on `Node`), replacing the controller's per-type isinstance chains — the same hooks a connector implements, validated on the built-in nodes first