mirror of
https://github.com/NickoScope/nickol-knx-mcp.git
synced 2026-09-29 19:31:12 +02:00
Round-2 fixes found by running against more public ETS4/5/6 fixtures (yene DemoCase, KnxProjParser, knxray, open-knxviewer): - Lights assemble both on/off and brightness status via identity-based pairing and fold the on/off command into one light entity (no duplicate switch), pairing even when device identity is a single name token. Switches too. - Cover up/down recognised on 1.008 or any 1.x named up/down; stop on 1.007/1.010/1.017 or a stop-name. Siblings attach only to the same shutter (zone-identity guard) so multiple blinds don't cross-wire. - Date/time/text DPTs (10/11/16/19) route to review (manual_datetime/manual_text). - Add regression tests for all three. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
Changelog
All notable changes to this project are documented here. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Added
- Dimmable lights are assembled completely. A light now collects BOTH its on/off
status (1.x) and brightness status (5.x) via identity-based pairing, folds the on/off
command into the same
lightentity (no more duplicateswitch), and pairs correctly even when the device identity is a single name token (e.g.HaloSpotLeft.A.VALUE↔HaloSpotLeft.A.STATE%). Switches gained the same identity-based status pairing. - Wider shutter detection. A cover's up/down is recognised on canonical DPT 1.008 or
any 1.x command named up/down (
UP/DOWN,auf/ab); stop is recognised on DPT 1.007 / 1.010 / 1.017 or a "stop"/"stopp"/"стоп" name. Position and stop siblings attach only to the same shutter (zone-identity guard), so multiple blinds in one main group no longer cross-wire. Real ETS4/5 projects that use 1.001+1.017 now map to full covers. - Date / time / text DPTs recognised (10.001 time, 11.001 date, 19.001 datetime,
16.000/16.001 string): routed to
reviewasmanual_datetime/manual_text(HA KNX has dedicated date/time/text platforms) instead of an opaqueunmapped_dpt.
0.1.1 — 2026-06-28
Hardening release. Every change below was surfaced by running the tool end-to-end
against real ETS5/ETS6 project files (the XKNX/xknxproject test fixtures), not the
synthetic smoke test — which alone never exercised the real parser or the MCP server path.
Five new regression tests now guard these cases.
Fixed
- Critical: the
load_projectMCP tool recursed infinitely (RecursionError) on every real.knxproj. The server tool functionload_projectshadowed the imported project loader of the same name, so it called itself instead of parsing. It now delegates toload_project_file. This made the tool's primary entry point unusable over MCP; the synthetic smoke test missed it because it calls the parser directly, bypassing the server.
Added
- ETS Function role pairing — the headline feature — is now actually implemented.
command↔status pairs are taken from ETS Function roles (e.g.
SwitchOnOff↔InfoOnOff) viapairing.function_status_pairs(), consumed by bothcheck_missing_statusand the HA generator. Previously Functions were ignored entirely despite the README claiming they were the primary signal. Consequences fixed: a feedback GA named only "Status" now pairs correctly (name tokens no longer required), HA entities get the rightstate_address, and function-paired commands are no longer false-flagged as missing a status. - No silent drops in HA generation ("no silent caps"). Every group address is now either
emitted as an entity or listed in the
reviewoutput; the YAML header reports how many need manual review. Previously, GAs the generator could not classify simply vanished. - Smarter shutter classification. German/directional names are recognised (
Behang,Lamelle,auf/ab,Raffstore,Markise, plus RU equivalents). A shutter-looking command whose DPT lacks a sub-type now gets an actionableshutter_incomplete_dptreview hint (set 1.008 / 1.010 / 5.001 in ETS) instead of being dropped as "unknown". - Venetian slats handled as tilt. A slat GA (Lamelle / slat / ламель / tilt) is attached
to its parent blind cover as
move_short_addressinstead of becoming a standalone cover; an unmatched slat is flaggedshutter_slat_unattachedfor manual attachment. - Diagnostics alarms are inputs. A 1-bit diagnostics GA (wind/frost/rain/smoke/leak
alarm, fault) is now a read-only
binary_sensorinstead of a phantom command switch.
0.1.0 — 2026-06-28
Initial public beta.
Added
- Design-time MCP server with 12 tools:
load_project,list_group_addresses,get_devices,get_topology,check_naming,check_missing_status,check_dpt,analyze_all,generate_ha_package,generate_ets_group_addresses,project_report,workspace_info. - Read-only
.knxprojparsing viaxknxproject(ETS5/ETS6, password-protected supported). - GA classification (category + kind) from DPT and multilingual (EN/DE/RU) name keywords.
- Naming, missing-status, and DPT validation checks.
- Home Assistant KNX YAML generation with a conservative
reviewlist for ambiguous items. - ETS-importable group-address export in XML (
knx.org/xml/ga-export/01) and CSV. - Markdown project report.
- Confined-workspace write guarantee (
NICKOL_KNX_WORKSPACE); no bus access by design. CLAUDE.mddesign playbook, end-to-end smoke test (synthetic 16-GA project), example Claude Desktop config.
Known limitations
- Tested end-to-end on a synthetic project only; real-world
.knxprojtesting is ongoing (see the call for testers in the README).