Let a connector write, and publish strings bare
Two things stopped the engine commanding this house. ConnectorNode hardwired its node function to a no-op, so an input message reaching a connector was discarded and Art-Net's packet builder was unreachable; write() now carries the input ports, which is additive so the contract version holds. And the MQTT publisher JSON-encoded every payload, so "ON" went on the wire quoted and the devices on a shared broker, which speak bare values, ignored it. seed_house_control.py is the rig: a flow that drives the washing machine plug, a dimmer and a colour fixture over MQTT, carries the same two as DMX on an Art-Net node with transmit still off, and a dashboard to drive it by hand.
This commit is contained in:
+25
-1
@@ -60,9 +60,33 @@ Postgres + Redis + git-files split stays; the actionable part is durability.
|
||||
Needs someone watching the real hardware, so it is not a background task. This
|
||||
is what M4 still waits on, together with porting the flows.
|
||||
|
||||
- FEAT/NODE: the connectors only read. Enable the write paths with someone watching: WF-RAC `setAirconStat` (needs an operatorId registered with the unit first, which is itself a write) and Art-Net `transmit`.
|
||||
Art-Net can write now: `ConnectorNode.write` carries a node's input ports, a
|
||||
per-port `channels` map places each on its own DMX channel, and `transmit`
|
||||
still gates the socket. Verified on the wire against a listener (channel 33 =
|
||||
255, channel 31 = 60, nothing else set) and the MQTT half was driven end to
|
||||
end against the house broker. The rig is the `house_control` flow and its
|
||||
dashboard, seeded by `make -C app seed-house`.
|
||||
|
||||
- FEAT/NODE: Art-Net against the real fixtures is still untried. The house's own dmxnet sender re-emits universe 1 every 1000 ms, so fluksio and Node-RED overwrite each other; the test needs Node-RED's Art-Net sender stopped, and while it is stopped every channel fluksio does not set is dark.
|
||||
- FEAT/NODE: the WF-RAC write path stays gated. `setAirconStat` needs an operatorId registered with the unit first, which is itself a write, and the aircon is not on the safe-to-control list.
|
||||
- FEAT/NODE: the second WF-RAC unit (the one Node-RED addresses with operatorId "0") closes the connection on an anonymous read. It likely wants an account registered; the first unit answers without one.
|
||||
- CHORE/NODE: `wfrac` reports `mode` as "unknown" while the unit is off, because the mode bits hold a value outside the known set. Faithful to the reference decoder, but "off" would read better.
|
||||
- PERF/NODE: `ArtNetOut.write` sends one frame per input port, so a node with two ports emits two frames per run. The last one carries both channels, so the end state is right; folding them into one send would halve the traffic.
|
||||
- CHORE/NODE: the Art-Net node starts from an all-zero universe and has no way to learn what the fixtures are currently at — Art-Net has no read-back. Taking over a universe therefore blanks everything the flow does not drive. A baseline setting, or driving every channel, is what a real cutover needs.
|
||||
|
||||
### Porting the Node-RED flows
|
||||
|
||||
What the reference actually does, extracted while building the write-path rig.
|
||||
One `Art-Net Out` node in 865 covers every physical device: `mqtt in <topic>`
|
||||
-> `change` (msg.topic = DMX channel) -> an `nCH` encoder function -> Art-Net,
|
||||
to the Art-Net node's address universe 1. Payloads are bare: `ON`/`OFF`, a number, `[h,s,v]`,
|
||||
`UP`/`DOWN`. Nothing is retained, so state lives only in Node-RED globals and
|
||||
is lost on its restart.
|
||||
|
||||
- CHORE/FLOW: three DMX channel collisions in the reference — ch 9 (`light/bathRoomLight` vs `light/bathRoomSinkLight`), ch 28 (`actor/windowOpenerStorage` 28-29 vs `light/traverseAmbientLight` 28-30), ch 129 (`actor/canopy` 129-130 vs an orphaned 1CH mapping). Decide these deliberately rather than porting them.
|
||||
- CHORE/FLOW: 1CH values are not scaled. `light/traverseSpotLight` and `light/kitchenDirectLight` receive 0-100 and that number lands on DMX as-is, so those fixtures never go above 100/255. The 4CH "A" channel gets `v` raw for the same reason. Faithful is ugly; deliberate is better.
|
||||
- BUG/FLOW: the reference's `function 9`/`function 10` publish the string `"undefined"` for unselected zones (`var a, b, c = [0,0,0]` only initialises `c`), which reaches the 3CH/4CH encoders and produces `NaN` DMX values. A port should emit an explicit `OFF`.
|
||||
- CHORE/FLOW: dead in the reference and not worth porting — the `AmbientModeToLight` chain, the four Dashboard toggle chains, `light/generalLight` (written, no consumer), `light/outdoorPavillonLight` (no wiring), `Color Adapt`.
|
||||
|
||||
### Bugs found while building the screens
|
||||
|
||||
|
||||
Reference in New Issue
Block a user