flua compatibility notes — what changed to match the real HC3

flua's promise is that the same QA file behaves the same on your laptop and on the controller. To keep that promise honest, flua's behavior is now regularly pinned against a real HC3 — every REST response shape and status, the QA runtime's own view of the api, and the fibaro table. That work surfaced a batch of differences, and flua now matches the controller. If your QA asserts statuses or leans on sim-only conveniences, here is what changed.

The QA's own api layer

QuickApp methods

Status codes

Name rules

customEvent and globalVariable names are validated like QA variable names: [A-Za-z][A-Za-z0-9_]*. A name like my-event is rejected at creation (400) — the HC3's rule, hyphens and all. On the customEvents name routes an invalid name answers the HC3's own quirk, 501.

fire and publish are forgiving

Firing a customEvent that was never created (POST /customEvents/<name> or the publish GET) answers 204 — the HC3 does not error on unknown names, it just does nothing. flua used to 404; QAs that treated the 404 as "not created yet" should check the event list instead.

/plugins is a catalog

GET /plugins answers the HC3's plugin-type catalog ({installed, all}), not a device list. In online mode flua passes the controller's answer through. QA devices live in /devices, like on the HC3.

Everything above is pinned by the offline test suite — the same capture-based parity checks that will re-run against each new firmware, so the differences stay honest rather than drifting back.