What's Changed
Integration
- Doorbell event entities (HmIP-DBB, HmIP-DSD-PCB) now expose and fire the standard
ringevent type instead ofpress_short(#3300). Home Assistant requires doorbell event entities to supportring(deprecation warning today, mandatory from HA 2027.4) and its new doorbell triggers listen for it. Other event types such aspress_longare unchanged, as are the device triggers. Breaking: automations that trigger on thepress_shortevent type of these event entities must be switched toring - The doorbell device list now comes from openccu-data's curated
device_semanticsextract (viaaiohomematic.device_semantics.DOORBELL_MODELS) instead of a hardcoded tuple — one source of truth shared with openccu-loom's MQTT discovery. The classicHM-Sen-DB-PCBjoinsHmIP-DBBandHmIP-DSD-PCB: its short press now fires the standardringevent type on its doorbell event entity (#3300 follow-up) - Event entities now carry the full device identity (name, manufacturer, model, serial number, firmware) in their
DeviceInfo. Previously they registered only the device identifiers — if an event entity happened to be the device's first registration, the device entry was created without a name and the generated (sticky) entity_id degraded to the config-entry title (e.g.event.<instance_name>_ch1instead ofevent.<device_name>_ch1) - Reauthentication now reloads the config entry exactly once. The flow's entry update schedules a reload only when the registered update listener will not already do so (unloaded entry or unchanged data), replacing
ConfigFlow.async_update_reload_and_abort, whose extra reload schedule alongside an update listener caused a double reload and is deprecated with HA 2026.12
Development
- Added a
Makefileas the entry point for all development tasks (make helplists every target): setup, code quality (ruff, mypy, pylint, bandit, codespell, yamllint, prettier, translations, prek), tests (incl. coverage, CI mode and the opt-in e2e suite), hassfest/HACS validation, running Home Assistant against./config, and housekeeping. Targets run throughscript/run-in-env.sh, so they work with or without an activated virtual environment.CLAUDE.mdandCONTRIBUTING.mddocument the targets; the brokencov.sh(it referenced a non-existent.coveragerc) is superseded bymake test-cov-htmland was removed - Dual-backend parity hardening: a backend surface contract test (
tests/contract/test_backend_surface_contract.py) inventories thecentral.*member and call surface the integration actually uses from the sources via AST and checks it against both backend classes, the three-way e2e suite gained behavioral parity probes (identical HA service calls, a CCU-side push, the config-surface paramset description) plus an entity-set parity ratchet that lets model coverage only grow, and the new.github/workflows/e2e-parity.yamlruns the suite as a gate on dependency-bump PRs and nightly. Test infrastructure only — no runtime effect - Config flow and diagnostics groundwork for the openccu-loom backend (backend-aware flow titles, in-place backend switch on a matching CCU serial, sub-device toggle, serial-keyed manual setup, diagnostics on the compat adapter). The compile-time master switch
LOOM_BACKEND_SELECTABLEis replaced by a discovery-based gate — the flow offers the backend when a daemon announces itself via mDNS or a loom entry already exists — and every entry point is marked Beta. A callback-signature fix in the active mDNS browse makes the daemon selection usable — zeroconf fires state changes with keyword arguments only, and it fires them from the browser constructor once the shared cache is warm, so the mismatched parameter names raised synchronously inside the flow step. The user-facing details stay out of scope for this changelog until the backend leaves Beta
Dependencies
Bump aiohomematic to 2026.8.0
- Fix XML-RPC commands hanging forever when a connection goes half-open. The operational XML-RPC proxy is now created with a socket timeout (
rpc_timeout, 60 s by default), matching backend detection; previously it had none, so a silently dropped or half-open (TLS) keep-alive connection made asetValue/putParamsetblock indefinitely in the proxy's single worker thread. Since each interface has exactly one worker, that wedged the interface's entire outgoing command path until Home Assistant was restarted — commands were neither sent nor failed, the only visible symptom being the 30 s optimistic rollback, while incoming events kept arriving over the separate callback path. A stuck request now aborts as a retryableNoConnectionException, which frees the worker thread and lets the command retry handler react - Fix data point names getting a redundant
ch<no>postfix even when the channel's custom name is already unique (#3313). The postfix for parameters that exist on multiple channels of a device is now only appended when the channel name alone does not identify the channel — device-derived names, names following the<name>:<no>scheme, or several same-named channels providing the same parameter. A channel with a unique custom name (e.g. a status channel named<sub device> Status) keeps its clean entity name again - New
aiohomematic.device_semanticsmodule exposing the curated device-semantics classifications from openccu-data — first classification:DOORBELL_MODELS, the basis for the doorbell-model change above (#3304) - Adds the
ALARM_CONTROL_PANELcategory/type vocabulary — pure vocabulary, no behaviour change on the CCU path - Raises the minimum
openccu-datato2026.7.2, pulling in the corrected CCU translation and easymode artifacts (see below). The package is a transitive dependency, so the manifest bump is what applies it - Unhandled task exceptions are logged with an explicit
exc_infoinstead of_LOGGER.exception(). The handler runs from a task done-callback, i.e. outside an active exception handler, whereexception()has no ambient traceback to draw on — some task failures previously lost their traceback in the log. Log level and output are otherwise unchanged
Bump openccu-data to 2026.7.2
- Adds the curated
device_semanticsextract (doorbell classification) that aiohomematic's newdevice_semanticsmodule reads - Regenerates the easymode and translation extracts as well as the
BLIND_VIRTUAL_RECEIVER,SHUTTER_VIRTUAL_RECEIVERandWATER_SWITCH_VIRTUAL_RECEIVERprofiles from the latest OCCU sources: a newSHORT_OUTPUT_BEHAVIOURparameter in the water-switch profiles,LONG_PROFILE_ACTION_TYPEnarrowed to a fixed value in the blind/shutter profiles, plus revised German/English help texts and value labels - Fixes HTML character references leaking into display strings: the easymode and profile extractors now decode
ä,&, and friends, matching what the translation extractor always did. 36 profile files (197 strings) and the easymode archive were regenerated, so German umlauts and ampersands in parameter help texts and value labels render as characters instead of escape sequences
Bump aiohomematic-config to 2026.8.0
- Tracking bump that raises its own
aiohomematicandopenccu-datafloors to match the versions above. No functional change
Bump openccu-loom-client to 2026.8.0 (pins openccu-loom-types==0.2.4)
- Groundwork bump for the openccu-loom backend (Beta); it has no runtime effect on the direct-CCU backend. Advances the bundled loom client from
2026.7.6to2026.8.0and its transitively pinnedopenccu-loom-typesfrom0.1.53to0.2.4
homematicip-local-frontend
- Bundled
homematic-config.jsrebuilt. The device list now renders virtualized (newhm-device-rowelement behindha-list-virtualized) once more than 100 filtered devices are shown and Home Assistant provides the element, which keeps large installations responsive; below that threshold the existing grouped rendering is unchanged - The unsaved-changes warning in the channel and link configuration now also triggers when navigating away or closing the tab (capture-phase
clickinterception plusbeforeunload), not only via the panel's own back button - The config panel header was restyled to match Home Assistant's standard toolbar/header design (frontend #73, @smoki3)
- The device list and interface group headers now use Home Assistant's standard
ha-cardstyling for visual consistency with the rest of HA, via a new<hm-interface-header>component (frontend #75, @smoki3) - Removed a duplicated view title in the device list (frontend #76, @smoki3)