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.
This commit is contained in:
2026-08-22 12:41:39 +02:00
parent 1b1b530cfa
commit a1e56b997e
+12
View File
@@ -101,6 +101,18 @@ external interfaces. See `docs/architecture/structure.canvas` → *Backend M
that gets updated costs one retry rather than a reconfiguration. The that gets updated costs one retry rather than a reconfiguration. The
payload is identical across both, so only the transport moved. Verified payload is identical across both, so only the transport moved. Verified
against one unit of each generation, read and command 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`), - [x] Node lifecycle as a protocol (`start`/`stop`/`report_health` on `Node`),
replacing the controller's per-type isinstance chains — the same hooks a replacing the controller's per-type isinstance chains — the same hooks a
connector implements, validated on the built-in nodes first connector implements, validated on the built-in nodes first