v1.14.0
User-facing additions
Two new services
The integration now exposes custom actions you can call from automations or Developer tools → Actions:
eaux_marseille.refresh— triggers an immediate poll of the customer portal for the selected contract, instead of waiting for the next 1-hour cycle. Useful for manual recovery after a network outage or to sync with an automation that runs at meter-read time.eaux_marseille.reimport_statistics— re-runs the historical monthly statistics import for the selected contract. Useful after a previously failed import (a Repair issue is shown in that case) or to fill in a recorder gap.
Both services use ServiceValidationError with translation keys when the target entry is unknown or not loaded, so users see localised error messages. Documented in README (EN + FR) under a new Services section.
Manifest polish
integration_type: "hub"— Home Assistant now groups our sensors under a hub device card, which matches our one-config-entry-per-contract topology.loggers: ["custom_components.eaux_marseille"]— declares our logger namespace so it shows up with a dedicated debug toggle in Settings → System → Logs.
CI hardening
Three new workflows added under .github/workflows/:
release.yml— auto-creates the GitHub release on tag push, pulling the changelog from Conventional-Commit prefixes. Verifies the manifest version matches the tag before publishing. Removes the manualgh release createstep from the maintainer flow.dependabot-auto-approve.yml— approves and enables auto-merge on patch-level Dependabot PRs once the five required status checks pass. Major/minor bumps stay manual so the maintainer reviews behaviour-affecting changes.codeql.yml— GitHub's native security analysis on push, PR, and a weekly schedule. Catches issue classes (injection, hard-coded secrets, weak crypto, unsafe deserialisation) that mypy and ruff don't cover. Findings appear under the Security tab.
A new tests/test_translations.py adds three structural checks:
en.jsonkeys are exactly thestrings.jsonkeysfr.jsonkeys are exactly thestrings.jsonkeys- no
http(s)://URLs in any translation value (hassfest forbids it; we shipped that mistake once in v1.11.0 → v1.11.1, this lock catches it locally)
Quality scale
Three rules promoted from exempt to done:
action-setup(services registered with proper schema)action-exceptions(services raiseServiceValidationErrorwith translation keys)docs-actions(services documented in README)
Verified
- All 5 CI jobs green (Lint, Typecheck, Pytest, Hassfest, HACS)
- Coverage: 96.22% (well above the 95% threshold)
- 64 tests passed (was 49)
- Live smoke test on a Raspberry Pi against SEM