Files
Nikolay1andClaude Opus 4.8 5036a19b4b feat(P2): role-aware feedback completeness — catch a value command with no value status
'Does the function have *a* status' missed a dimmer with on/off status but no
brightness status (demo planted error #3), silently inflating coverage/Matter.
detect_role_completeness flags a brightness/position command (5.001) whose device
has no matching value status (missing_value_status), with a device-identity match
so it doesn't borrow a sibling's status. Demo recall 4/5 -> 5/5. Raised by the
external expert review. Test + demo ground-truth updated. Full suite green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 09:23:02 +02:00

5.2 KiB

Demo House — end-to-end example

A complete, synthetic worked example of the whole stack this project targets:

demo-home.knxproj   →   nickol-knx-mcp   →   generated/ (report · HA entities · ETS export)
   (KNX design)          (design-time)              ↓
                                            ha-brain/ (Home Assistant smart logic)

It exists so you can see real input → real output without needing your own project, and as a showcase of how the KNX (I/O) and Home Assistant (logic) layers fit together.

What's here

Path What it is
demo-home.knxproj The synthetic project: 239 group addresses, 47 ETS Functions, 13 zones (living w/ fireplace, kitchen, master + 2 kids bedrooms each with ensuite, guest WC, laundry, 2 corridors, staircase). Lighting (switch/dim/CCT/RGBW), underfloor heating + AC, sensors, scenes.
generated/project_report.md project_report output — inventory + 🔴🟡🔵 findings + HA mapping preview.
generated/home-assistant-knx.yaml generate_ha_package output — KNX entities (switch / light incl. RGBW/RGB/CCT colour / cover / climate / binary_sensor / sensor) + a review list. Nothing is dropped silently.
generated/group-addresses.xml / .csv generate_ets_group_addresses output — ETS-importable.
ha-brain/ The Home Assistant smart layer on top of these entities — circadian lighting, multi-factor climate, presence/season/time logic, statistics. See its own README.

What the tool found (and the deliberate flaws)

The project intentionally contains 5 mistakes so the checks have something to catch — see them flagged in generated/project_report.md:

# Planted mistake Caught?
1 A group address with no DPT (Living room CO2, 4/2/1) ✅ check_dpt 🔴
2 Two GAs with the same name, different DPT (Kitchen temperature) ✅ check_dpt
3 A dimmer with an on/off status but no brightness status (Kitchen worktop LED) ✅ check_missing_status (missing_value_status)*
4 A switch with no status at all (Guest WC ceiling) ✅ check_missing_status
5 A GA with an empty name (2/5/2) ✅ check_naming 🔴

* Now fixed (role-aware feedback completeness). This demo originally surfaced an honest limitation — the missing-status check asked "does this control have a status?", so the Kitchen dimmer's on/off status masked its missing brightness status. detect_role_completeness now flags a brightness/position command (5.001) that has no matching value status (missing_value_status), without borrowing a sibling device's status. Recall on this demo is now 5/5.

Inventory: 239 GAs · 47 Functions · 0 errors that block parsing. The HA generator produced 19 switches, 13 lights (incl. RGBW / RGB / CCT colour), 6 covers, 6 climate zones, 13 binary sensors, 41 sensors — on/off, brightness, colour and climate command/status pairs assembled into multi-address entities, with 18/19 switches getting a state_address paired via ETS Function roles.

Generated by the current tool. Lights carry rgbw_address / color_address / color_temperature_address (+ color_temperature_mode) where the project has colour; climate entities carry temperature_address, target_temperature_state_address, operation_mode_address and command_value_state_address — keys verified against the Home Assistant KNX docs. A climate is emitted only when its required keys are present, otherwise the zone is sent to review, so an invalid entity is never written. Reserve / logic / scratch group addresses are classified and kept out of the error and missing-status checks (none in this clean synthetic project, but it stops the tool crying wolf on real ones).

⚠️ Caveats (please read)

  • Synthetic & generated — does NOT import into stock ETS. This .knxproj was authored programmatically (ETS6 schema project/22) — not exported from ETS. It parses cleanly with xknxproject (the library this tool uses) and is intended for tool validation and demonstration. A professional KNX engineer confirmed that ETS rejects it on import ("Project file has no valid signature") — ETS cryptographically signs its own projects and that signature can't be forged (by design). So: use this file with xknxproject-based tooling. To get a real, ETS-signed project, import the group-address export (generated/group-addresses.xml) into a fresh ETS project via Import Group Addresses and export from ETS — that file opens everywhere and is the gold standard. This round-trip was done and validated: a KNX engineer imported the export into ETS6 and sent back a real signed .knxproj, and the tool ran the full pipeline on it cleanly (note that an Import Group Addresses round-trip does not carry ETS Functions, so command/status pairing then relies on naming alone).
  • The flaws are on purpose. Do not "fix" them — they are the point.
  • ha-brain/ is a design demo. Valid Home Assistant YAML built on best practices, but not deployed against a live bus here; entity IDs assume the names generate_ha_package produces.