mirror of
https://github.com/NickoScope/nickol-knx-mcp.git
synced 2026-10-18 04:42:07 +02:00
Found on a real 1312-GA house, confirmed across all seven corpus projects.
- A quantity word in the name of a 1-bit, date/time or text GA names what the flag,
threshold trigger or timestamp is about ("on by motion detector by illuminance",
"CO2 threshold 1", "meter value recorded, date"), not the value. 12 of 12 hits on
1-bit GAs in the corpus were false positives; mains 1, 10, 11, 16, 19 are skipped.
- Legitimate alternatives are accepted, checked against xknx 3.20: power 9.024 kW and
14.080 VA; energy 13.010 to 13.016 and 14.031 J, plus power DPTs under Russian
"электроэнергия" names that are routinely used for power readings.
- Power factor gets its own rule (14.057) ahead of power, so "Фактор мощности" is no
longer expected to be 14.056.
Real findings still fire: a bare DPT 9 named "lux threshold", a 5.x named "temperature
control", a 5.001 named "power", 9.002 named "temperature". New test file
test_real_house_fixes.py, wired into CI.
Corpus: subdpt_suspect 17 -> 2 on the house, 7 -> 2 and 1 -> 0 on two others; no other
metric moved. Baseline re-recorded in this commit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
122 lines
3.8 KiB
YAML
122 lines
3.8 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
# The workflow only reads the tree; nothing here needs a writable token.
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
lint:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
- uses: actions/setup-python@v7
|
|
with:
|
|
python-version: "3.12"
|
|
cache: pip
|
|
- name: Install package and tools
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install -e . ruff mypy
|
|
- name: Lint (ruff — errors only, no style rules)
|
|
run: ruff check nickol_knx_mcp tests tools
|
|
- name: Types (mypy)
|
|
run: mypy
|
|
|
|
smoke-test:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Python ${{ matrix.python-version }}
|
|
uses: actions/setup-python@v7
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
cache: pip
|
|
|
|
- name: Install package
|
|
run: |
|
|
python -m pip install --upgrade pip
|
|
pip install -e .
|
|
|
|
- name: End-to-end smoke test (synthetic 16-GA project)
|
|
run: python tests/test_pipeline.py
|
|
|
|
- name: Device catalog wiring (catalog-exact + recipe fallback)
|
|
run: python tests/test_device_catalog.py
|
|
|
|
- name: App-program parser (synthetic .knxprod round-trip)
|
|
run: python tests/test_appprog_parser.py
|
|
|
|
- name: v0.8 fixes (positional pairing, ref-merge, range names)
|
|
run: python tests/test_v08_fixes.py
|
|
|
|
- name: Cover step/stop pairing stays within the ETS Function (issue #11)
|
|
run: python tests/test_cover_pairing.py
|
|
|
|
- name: RM/Rückmeldung shutter feedback classifies as status, not light (issue #12)
|
|
run: python tests/test_rm_status.py
|
|
|
|
- name: Policy profile — inferred taxonomy, declared profile, project-seeded example (issue #13)
|
|
run: python tests/test_policy.py
|
|
|
|
- name: Structure-first entity suggestions (HA SuggestionProvider prototype)
|
|
run: python tests/test_suggest.py
|
|
|
|
- name: Stable ordering + cursor paging for large tool results
|
|
run: python tests/test_paging.py
|
|
|
|
- name: GA-export intake, entity naming, climate setpoint shift
|
|
run: python tests/test_ga_export.py
|
|
|
|
- name: Regressions from a real 1312-GA house (subDPT false positives, HA lights, self-reporting status)
|
|
run: python tests/test_real_house_fixes.py
|
|
|
|
- name: Repair proposals and council-review fixes
|
|
run: python tests/test_council_fixes.py
|
|
|
|
- name: Domain classifier (name + DPT + range context)
|
|
run: python tests/test_domain_classifier.py
|
|
|
|
- name: explain_ga provenance
|
|
run: python tests/test_explain.py
|
|
|
|
- name: Aggregates carry their evidence
|
|
run: python tests/test_explainable_aggregates.py
|
|
|
|
- name: Device parameter checks
|
|
run: python tests/test_param_check.py
|
|
|
|
- name: Value-status completeness (brightness / position)
|
|
run: python tests/test_role_completeness.py
|
|
|
|
- name: Room template library
|
|
run: python tests/test_room_library.py
|
|
|
|
- name: Root-cause regressions
|
|
run: python tests/test_root_cause.py
|
|
|
|
- name: Hardened archive and XML parsing
|
|
run: python tests/test_safexml.py
|
|
|
|
- name: Theben reference projects
|
|
run: python tests/test_theben_corrections.py
|
|
|
|
- name: Topology limits
|
|
run: python tests/test_topology.py
|
|
|
|
- name: Console script is installed
|
|
run: |
|
|
python -c "import importlib.metadata as m; print('entry points:', [e.name for e in m.entry_points(group='console_scripts') if e.name == 'nickol-knx-mcp'])"
|
|
command -v nickol-knx-mcp
|