Version 2026.2.21 (2026-02-20)¶
What's Changed¶
Fixed¶
- Documentation audit and corrections: Comprehensive review and update of ~20 documentation files to match the current implementation. Key fixes include: corrected class names (
AsyncXmlRpcServer,AsyncRPCFunctions,AioJsonRpcAioHttpClient,CommandTracker), updated API signatures for metrics emission functions (emit_*now usekeyparameter instead ofsource/source_id/operation), fixed coordinator access patterns (central.state,central.hub_coordinator,central.client_coordinator,central.link), corrected event types (DataPointValueReceivedEvent), updated constant values (COMMAND_TRACKER_MAX_SIZE: 500,LAST_COMMAND_SEND_STORE_TIMEOUT: 60), fixed exception hierarchy (BaseHomematicExceptionas base), and updated sequence diagrams with correctRecoveryStageenum values andEventBussubscription patterns.
Version 2026.2.20 (2026-02-19)¶
What's Changed¶
Added¶
-
LinkCoordinator for device direct link management: Add
LinkCoordinatoras a high-level facade for listing, creating, and removing direct links between device channels. IncludesDeviceLinkandLinkableChanneldataclasses for enriched link data with translated channel type labels, device metadata, and link direction. The coordinator provides linkable channel discovery with role-based filtering. Exposed viaLinkFacadeProtocoland wired intoCentralUnitaslinkproperty. -
Dimmer last-level tracking: Add
last_levelproperty andset_last_levelmethod toCustomDpDimmerfor tracking the last non-default brightness level, enabling restore-to-previous-brightness workflows. -
Channel link peer categories: Add
link_peer_source_categoriesandlink_peer_target_categoriesproperties toChannelGroupingProtocolfor exposing link role categories per channel. -
Configurable device listing: Add
get_configurable_devicestoConfigurationCoordinatorreturningConfigurableDevicedataclasses with resolved channel type labels, effective paramset keys (MASTER excluded when no writable visible parameters exist), andMaintenanceDatafrom channel 0. Exposed viaConfigurationFacadeProtocol. -
Paramset copy operation: Add
copy_paramsettoConfigurationCoordinatorfor copying writable paramset values from a source channel to a target channel. Filters non-writable and missing parameters, returnsCopyParamsetResultwith copy/skip counts and old target values for change tracking.
Documentation¶
-
Architecture docs updated: Add
ConfigurationCoordinatorandLinkCoordinatorto Mermaid component diagram, Central Protocols listing, and coordinator categorization (new "Facade coordinators" category). UpdateChannelGroupingProtocoldescription with new link peer category properties. -
CLAUDE.md updated: Update coordinator directory tree (7 → 9 files, add
configuration.pyandlink.py). AddConfigurationFacadeProtocolandLinkFacadeProtocolto Key Protocol Interfaces listing. -
API reference updated: Add
configurationandlinkproperties toCentralUnitmembers list indocs/reference/api/central.md.
Version 2026.2.19 (2026-02-19)¶
What's Changed¶
Added¶
- On-demand LINK paramset description fetching: Add
get_paramset_description_on_demandtoInterfaceClientandget_link_paramset_descriptiontoConfigurationCoordinatorfor fetching LINK paramset descriptions directly from the backend when needed. LINK paramsets are not cached during device discovery, so this API enables direct link configuration without requiring a full device reload.
Version 2026.2.18 (2026-02-17)¶
What's Changed¶
Improved¶
- Add translations for LINK paramset parameters: LINK paramset parameters use
SHORT_/LONG_prefixes (e.g.SHORT_ON_LEVEL,LONG_RAMPON_TIME). The translation lookup now strips these prefixes as fallback, matching the CCU WebUI behavior, and prepends the press-type label (e.g. "Tastendruck kurz" / "Button press short"). Added 138 custom parameter name translations and 1,150 custom enum value translations covering all LINK paramset parameters (time bases, time modes, action types, profile actions, condition types, jump targets, driving modes, control modes, and more).
Fixed¶
- Fix delayed device creation failing on multi-interface devices: When a new HmIP device was paired, the CCU sends
newDeviceson multiple interfaces (e.g. HmIP-RF and VirtualDevices) with the same device address._delayed_device_descriptionswas keyed by device address only, causing the firstadd_new_devices_manuallycall to consume descriptions from all interfaces, while the second call found nothing and failed withNo device description found. Fixed by making_delayed_device_descriptionsinterface-aware (keyed by{interface_id: {address: [descriptions]}}). Also fixed:DEVICES_DELAYEDevent now only reports addresses for the current interface, and missing addresses in a batch no longer abort the entire operation (continueinstead ofreturn).
Version 2026.2.17 (2026-02-16)¶
What's Changed¶
Fixed¶
- Preserve channel postfix when translation suppresses parameter name: When a parameter translation resolves to an empty string (
"") for a multi-channel data point, the channel disambiguation postfix (e.g.ch13) was lost because the truthiness check treated""the same asNone. Changed to an identity check (is not None) so that an empty translation correctly yieldstranslated_name="ch13"instead of removing the name entirely.
Changed¶
- example.py uses environment variables: Hardcoded CCU credentials replaced with
os.environlookups. A lightweight.envloader reads variables from the project-root.envfile at startup.
Version 2026.2.16 (2026-02-16)¶
What's Changed¶
Improved¶
- Translate custom data point postfix: When a custom data point provides a
data_point_name_postfix(e.g.BUTTON_LOCK), it is now translated viaget_parameter_translation— the same mechanism used for generic data points and events. The translated postfix populatestranslated_nameandtranslated_full_nameinDataPointNameData.
Version 2026.2.15 (2026-02-15)¶
What's Changed¶
Fixed¶
- i18n: Allow multiple CentralUnit instances:
set_locale()is now idempotent — calling it again with the same locale is a no-op. When called with a different locale, it logs a message and keeps the original. Previously, creating a secondCentralUnitraisedRuntimeErrorbecauseset_locale()was strictly one-shot.
Version 2026.2.14 (2026-02-15)¶
What's Changed¶
Improved¶
- Empty parameter translation suppresses parameter name: When a CCU parameter translation resolves to an empty string (
""), the parameter name is now omitted fromtranslated_nameandtranslated_full_nameinDataPointNameData. This allows translations to explicitly suppress redundant parameter names when the channel name already conveys the meaning.None(no translation found) still falls back to the original untranslated name as before.
Version 2026.2.13 (2026-02-15)¶
What's Changed¶
Improved¶
-
Extraction script: PNAME and easymode TCL parsing: Added two new extraction sources to
extract_ccu_translations.py: -
PNAME.txtfiles with direct parameter name → label mappings - Easymode TCL files (
*_master.tcl) for parameter → template variable resolution viaset param/${stringTable...}patterns - Improved HTML entity decoding (
",<,>) - Source merging refactored into
_merge_sources()helper -
Parameters: 841 → 1029 (+188), parameter values: 1256 → 1326 (+70), device models: 365 → 367 (+2)
-
Extraction script fixes: Fixed multiple bugs in
extract_ccu_translations.pythat caused ~215 parameter translations to be missed: -
Added
translate.lang.extension.jsandtranslate.lang.jsas extraction sources - Added MASTER_LANG device-specific translation files as additional source
- Fixed comment regex that destroyed
://URLs inside string values - Fixed regex to target
langJSONspecifically (ignoringHMIdentifierblocks) - Added parsing of
langJSONalias assignments after jQuery.extend blocks - Added handling of invalid JS escape sequences (
\',\.) for JSON compatibility -
Added
channelDescription.jsanddeviceDescription.jsto template resolution -
Custom translation cleanup: Removed 17 redundant entries from
ccu_custom/parameters_*.jsonandccu_custom/parameter_values_*.jsonthat are now correctly provided by the improved extraction. Added 67 channel-qualified override keys to ensure custom translations take precedence over extracted channel-specific translations. -
Value-only translation fallback:
get_parameter_value_translationnow has a three-tier lookup: channel-specific → parameter-specific → value-only. The new value-only fallback builds an index of standalone enum values mapped to their shortest (most generic) translation, so shared values liketrue,false, or weekday names resolve even for unknown parameters. -
Weekday translations: Added
show_weekdayvalue translations (Monday–Sunday) toccu_custom/parameter_values_*.json(EN + DE). -
Configurable channel filtering:
get_configurable_channelsnow applies CCU-compatible filtering rules: channels must have the VISIBLE flag set and must not have the INTERNAL flag. WEEK_PROGRAM channels are excluded as they are handled by schedule cards.
Version 2026.2.12 (2026-02-13)¶
What's Changed¶
Improved¶
- CCU translation loading via pkgutil: Replaced
Path.read_text()withpkgutil.get_data()for loading CCU translation files. This avoids blocking file I/O detection in Home Assistant's event loop. Translations are now eagerly initialized at import time to prevent any later I/O on first use.
Version 2026.2.11 (2026-02-13)¶
What's Changed¶
Improved¶
-
Robust JSON parsing with stdlib fallback: When
orjsonfails to parse JSON from CCU Rega scripts (e.g., due to non-standard literals likeNaNorInfinity), the parser now falls through to Python's stdlibjsonmodule which handles these edge cases gracefully. -
Extended control character sanitization: The JSON sanitizer now also escapes the DEL character (U+007F) in string values, in addition to the existing U+0000–U+001F range.
-
Diagnostic logging for JSON parse errors: When a Rega script response fails to parse as JSON, the exact problematic character (Unicode codepoint), its position, and surrounding context are now logged at WARNING level to aid diagnosis.
Changed¶
- CCU translation API: Renamed functions and properties for semantic accuracy:
get_device_model_label()→get_device_model_description()get_channel_type_label()→get_channel_type_translation()get_parameter_label()→get_parameter_translation()get_parameter_value_label()→get_parameter_value_translation()Device.label→Device.model_descriptionChannel.label→Channel.type_translationBaseParameterDataPoint.label→BaseParameterDataPoint.translationBaseParameterDataPoint.value_labels→BaseParameterDataPoint.value_translationsCalculatedDataPoint.label→CalculatedDataPoint.translation
Version 2026.2.10 (2026-02-11)¶
What's Changed¶
Added¶
-
CCU translation extraction: New script (
script/extract_ccu_translations.py) that extracts human-readable translations from the OpenCCU/RaspberryMatic WebUI for channel types, device models, parameter names, and parameter enum values. Supports local OCCU checkout (OCCU_PATH) and remote CCU fetch (CCU_URL). Resolves the two-level stringtable indirection, URL-decodes Latin-1 characters, and strips HTML from values. -
CCU translations loader module: New module (
aiohomematic/ccu_translations.py) providing typed lookup functions for CCU-sourced translations: -
get_channel_type_label(): Channel type labels (e.g.BLIND-> "Jalousieaktor") get_device_model_label(): Device model descriptions withsub_modelfallback for abbreviated HmIP keys (e.g.PS,SMO,BSM)get_parameter_label(): Parameter labels with channel-specific fallbackget_parameter_value_label(): Enum value labels with channel-specific fallback
All lookups are thread-safe (double-checked locking) and asyncio event loop safe (lazy initialization, then pure dict reads with zero I/O).
-
Generated translation files: 8 JSON files under
aiohomematic/translations/ccu_extract/(4 categories x 2 locales: de, en) with 2500+ translation entries total. -
CCU translation custom override layer: New
aiohomematic/translations/ccu_custom/directory with identically-named JSON files (empty by default). Keys inccu_custom/override or supplement keys fromccu_extract/at load time and survive re-extraction. -
Labels for calculated data points: Calculated data points (dew point, enthalpy, frost point, etc.) now resolve human-readable labels via
ccu_translations, matching the behavior of parameter-backed data points. Custom translations for all 10 calculated parameters are provided inccu_custom/parameters_{de,en}.json.
Documentation¶
- ADR-0024: Architecture Decision Record for CCU translation extraction (
docs/adr/0024-ccu-translation-extraction.md)
Version 2026.2.9 (2026-02-11)¶
What's Changed¶
Added¶
-
parameter_toolsmodule: New standalone module (aiohomematic/parameter_tools.py) providing pure-function utilities for working withParameterDatadescriptions, independent of DataPoint instances: -
ParameterHelper: Flag and operation checks (
is_parameter_visible,is_parameter_writable,has_parameter_events), enum resolution (resolve_enum_value,resolve_enum_index), and step size calculation (get_parameter_step). - ParameterValidator: Value validation (
validate_value,validate_paramset) and type coercion (coerce_value) against parameter descriptions without requiring a DataPoint instance. -
ParamsetDiff: Type-aware comparison of two paramset snapshots (
diff_paramset) with proper float equality handling. -
ConfigurationCoordinator: New high-level facade (aiohomematic/central/coordinators/configuration.py) for device configuration operations, exposed ascentral.configuration. Provides: -
get_paramset_description()/get_all_paramset_descriptions(): Read parameter definitions for a channel. get_paramset()/put_paramset(): Read and write paramset values with optional built-in validation.get_configurable_channels(): Discover configurable channels for a device.-
get_parameter_data(): Look up a single parameter description. -
ConfigurationFacadeProtocol: Protocol interface for the configuration facade, enabling dependency injection and testability for consumers.
Version 2026.2.8 (2026-02-09)¶
What's Changed¶
Refactored¶
-
Extract
DeviceQueryFacadefromCentralUnit(P1): Moved 12 query methods (get_data_points,get_events,get_generic_data_point,get_custom_data_point,get_data_point_by_custom_id,get_event,get_event_groups,get_readable_generic_data_points,get_state_paths,get_install_mode,get_un_ignore_candidates,get_parameters) into a newDeviceQueryFacadeclass (~348 LOC). CentralUnit retains one-line delegates for API compatibility. -
Centralize circuit breaker management in
BaseBackend: Circuit breakers are now collected and managed by the base backend class via acircuit_breakerstuple.all_circuit_breakers_closed,circuit_breaker, andreset_circuit_breakersare implemented once inBaseBackend, eliminating duplicate logic inCcuBackend,HomegearBackend, andJsonCcuBackend. -
Replace
hasattrintrospection inConnectionHealth.update_from_client: The method now acceptsClientConnectionProtocolinstead ofAnyand readsclient.statevia the public API instead of reaching into_state_machine,_proxy._circuit_breaker, and_json_rpc_client._circuit_breaker. -
Thread-safe
RequestCoalescer: The check-and-register operation is now protected by anasyncio.Lock, making it safe under Python 3.13+ free-threading. The lock is released before awaiting the actual request to allow concurrent coalescing. -
Extract
OptimisticValueTrackerfromBaseParameterDataPoint: Consolidated 5 optimistic-update-related slots into a single pure state management class (aiohomematic/model/optimistic.py, ~136 LOC). Manages apply, confirm, and rollback lifecycle with burst support and automatic rollback timeouts — no event publishing, logging, or I/O. -
Extract
_DeviceAvailabilityand_DeviceFirmwarefromDevice: Moved availability state management (UN_REACH, STICKY_UN_REACH, forced availability) and firmware version tracking / update operations into dedicated helper classes withindevice.py, reducing the mainDeviceclass complexity. -
Split
support.pyintosupport/package: The monolithicsupport.pymodule is now a package with three focused submodules: -
address.py: Address parsing/validation with@lru_cache file_ops.py: Async file system operationsmixins.py:LogContextMixinandPayloadMixinfor structured logging
The package re-exports all public symbols, so external imports remain unchanged.
- Rename proxy lifecycle methods on
InterfaceClient:initialize_proxy()→init_proxy(),deinitialize_proxy()→deinit_proxy(),reinitialize_proxy()→reinit_proxy().
Added¶
-
cleanup()method onCentralDataCache: Forces an expiration check on all interfaces, callable from scheduler or tests. -
@runtime_checkableon client and model sub-protocols: Added toClientStateMachineProtocol,ClientIdentityProtocol,ClientConnectionProtocol,ClientLifecycleProtocol,DeviceDiscoveryOperationsProtocol,ParamsetOperationsProtocol,ValueOperationsProtocol,LinkOperationsProtocol,FirmwareOperationsProtocol,SystemVariableOperationsProtocol,ProgramOperationsProtocol,BackupOperationsProtocol, and several channel/device sub-protocols. -
_migrate_schema()hook re-enabled inBasePersistentCache.load()(P12): Schema version mismatches now attempt migration via_migrate_schema()before falling back toVERSION_MISMATCH. Default raisesNotImplementedErrorso existing behaviour is preserved.
Documentation¶
-
Device class section comments (P8): Added 7 section markers (
# -- 1. Metadata & Identity --through# -- 7. Week Profile --) to organize the Device class body. -
DataPoint hierarchy diagram (P9): Added class hierarchy documentation to
data_point.pyshowing the 5-level parameter-backed chain and 2-level calculated chain. -
Cache concurrency model (P10): Added
Concurrencysection toCentralDataCache,CommandTracker,PingPongTracker, andDeviceDetailsCachedocumenting the single-event-loop assumption and PEP 703 implications. -
Lazy cache expiration (P11): Documented the intentional lazy expiration strategy and
_is_initializinglifecycle inCentralDataCache. -
Protocol selection guide (
docs/architecture/protocol_selection_guide.md): Decision tree for choosing among 115 protocol interfaces by use case, with guidance on naming conventions and interface segregation principles.
Testing¶
-
Benchmark test suite (
tests/benchmarks/): Performance baseline tests forCentralDataCache,CircuitBreaker,EventBus, andRequestCoalescer. -
Error-path test suite (
tests/test_error_paths.py, ~585 LOC): Comprehensive resilience tests coveringRequestCoalescerburst scenarios, circuit breaker integration, cache expiration edge cases, and shutdown cleanup.
Version 2026.2.7 (2026-02-09)¶
What's Changed¶
Added¶
- Paramset consistency checker: Automatically detects missing parameters on HmIP/HmIPW devices after firmware updates. The HmIPServer (crRFD) on the CCU sometimes fails to refresh its stored parameter data after a firmware update, creating a mismatch between
getParamsetDescription()(schema) andgetParamset()(actual values). The checker runs as a background task after device creation and reports inconsistencies via: - Home Assistant Repairs (as
IntegrationIssuewith typePARAMSET_INCONSISTENCY) - Log warnings with affected device addresses and missing parameters
- Diagnostics data (via
IncidentStore) A factory reset of the affected device on the CCU resolves the issue. See troubleshooting documentation and ADR-0023 for details. Based on Homematic forum discussion.
Changed¶
- Rename
_temporary_valueto_unconfirmed_value: All internal references to_temporary_value,_temporary_refreshed_at,_temporary_modified_at,write_temporary_value,_reset_temporary_value, and related methods have been renamed to_unconfirmed_*/write_unconfirmed_value/_reset_unconfirmed_value. This clarifies the role of the second value tier in the three-tier resolution model (optimistic → unconfirmed → confirmed). Affected files:data_point.py,hub/data_point.py,interface_client.py,interfaces/model.py.
Fixed¶
-
XML-RPC server race condition on multi-hub startup: Fixed a race condition in
AsyncXmlRpcServer.start()that caused "address in use" errors when multiple central units (e.g., two OpenCCU instances) started concurrently. The singleton server is now protected by anasyncio.Lockto ensure only one coroutine can bind to the port at a time. Also added proper cleanup of partial state if binding fails. -
Optimistic rollback now clears unconfirmed value:
_rollback_optimistic_value()now calls_reset_unconfirmed_value()before restoring the previous confirmed value. Previously, the unconfirmed value survived the rollback and would override the restored value through the timestamp comparison in_value, undermining the rollback entirely.
Documentation¶
-
Three-tier value resolution architecture doc: New
docs/architecture/value_resolution.mddescribing the full value resolution mechanism (optimistic → unconfirmed → confirmed), including timing, scope, interaction between tiers, rollback behaviour, and the hub sysvar variant. -
Updated ADR 0020: Added unconfirmed value tier to the value resolution description and documented that rollback clears the unconfirmed value.
Version 2026.2.6 (2026-02-06)¶
What's Changed¶
Added¶
- WeekProfileDataPoint: Added device-level data points that serve as the central interface for schedule data — both for climate and non-climate devices. One data point per device exposes schedule metadata, target channel mappings, and delegates read/write operations to the underlying WeekProfile.
New classes and types:
WeekProfileDataPoint/ClimateWeekProfileDataPointinaiohomematic.model.week_profile_data_pointWeekProfileDataPointProtocol/ClimateWeekProfileDataPointProtocolinaiohomematic.interfacesScheduleTypeStrEnum inaiohomematic.const(CLIMATE,DEFAULT)TargetChannelInfodataclass inaiohomematic.model.schedule_models
New device properties:
device.week_profile_data_point: Access the data point (orNone)device.channel_groups: Channel group configurations keyed by group number
Data point properties:
schedule_type: ReturnsScheduleType.CLIMATEorScheduleType.DEFAULTschedule: Cached schedule asScheduleDictavailable_target_channels: Human-readable target channel mapping (non-climate only)min_temp/max_temp: Temperature bounds (climate only)value: Number of active schedule entries (state property)
Schedule operations (both types):
get_schedule(),set_schedule(),reload_schedule(),fire_schedule_updated()
Climate-specific operations (ClimateWeekProfileDataPoint):
get_schedule_profile(),set_schedule_profile()get_schedule_weekday(),set_schedule_weekday()copy_schedule(),copy_schedule_profile()-
available_profiles,schedule_profile_nos -
Automatic profile sync from device:
ClimateWeekProfileDataPointnow binds the device'sACTIVE_PROFILE(IP) orWEEK_PROGRAM_POINTER(RF) generic data point.current_schedule_profileupdates automatically when the thermostat switches profiles. -
Climate CDP notification on schedule change: When schedule data changes (e.g., after
CONFIG_PENDING=Falsereload), the linked Climate CDP is automatically notified via an internal subscription, causing the HA Climate Entity to update. -
device_active_profile_indexproperty: Returns the 1-based profile index from the device parameter (int | None). RF values are normalised from 0-based to 1-based.
Changed¶
-
Schedule access removed from climate CDPs (breaking change): All schedule methods and properties removed from
BaseCustomDpClimate. Schedule operations are now exclusively available viadevice.week_profile_data_point. Removed:available_schedule_profiles,schedule,get_schedule(),set_schedule(),get_schedule_profile(),set_schedule_profile(),get_schedule_weekday(),set_schedule_weekday(),copy_schedule(),copy_schedule_profile(). -
Schedule access removed from non-climate CDPs:
has_schedule,schedule,get_schedule(), andset_schedule()removed fromCustomDataPointbase class andCustomDataPointProtocol. -
Climate profile property renames (breaking change): On
ClimateWeekProfileDataPointProtocol,active_profile→current_schedule_profile,active_schedule→current_profile_schedule,set_active_profile()→set_current_schedule_profile(). This avoids a naming conflict with the device parameterACTIVE_PROFILE.copy_scheduleandcopy_schedule_profileparameter renamed fromtarget_climate_data_pointtotarget_data_point. -
Copy method refactoring:
ClimateWeekProfile.copy_schedulerenamed tocopy_schedule_toandcopy_profilerenamed tocopy_profile_to. Both now accepttarget_week_profile: ClimateWeekProfileinstead oftarget_climate_data_point: BaseCustomDpClimate. -
HA-Addon renamed to HA-App (breaking change):
SystemInformation.is_ha_addonrenamed tois_ha_app. The rega scriptget_backend_info.fnnow returnsis_ha_appinstead ofis_ha_addonin the JSON response.
Fixed¶
-
CommandThrottle busy-wait replaced with asyncio.Event: The background worker in
CommandThrottleno longer polls withasyncio.sleep(0.1)(ASYNC110 violation). Usesasyncio.Eventfor efficient wake-on-enqueue, reducing idle CPU usage and improving command latency. -
CallbackDataPoint ownership reset on unsubscribe: When the owning
custom_idfully unsubscribes from a data point,_custom_idis now reset toNone. This allows re-registration with a differentcustom_id(e.g. after an entity_id rename in Home Assistant), preventingAioHomematicExceptionon resubscription.
Refactoring¶
- DelegatedProperty expansion: Replaced 56 boilerplate
@propertymethods withDelegatedPropertydescriptors across 23 files (central, client, model, store layers). This reduces repetitive delegation code while preserving the same runtime behavior. Properties that are overridden in subclasses (category,state_uncertain) remain as@propertymethods.
Version 2026.2.5 (2026-02-05)¶
What's Changed¶
Fixed¶
-
i18n format specs: Fixed
i18n.tr()silently dropping format specifiers like{interval:.3f}because all kwargs values were converted tostrbeforeformat_map(). Float format specs require the original type. Placeholders with format specs now render correctly in log messages. -
Optimistic mismatch false positives: Fixed false
OPTIMISTIC_MISMATCHwarnings when the CCU rounds float values (e.g., optimistic0.3803…vs CCU-confirmed0.38). Float values are now rounded to 2 decimal places before comparison. -
Optimistic burst false rollbacks: Fixed false
OptimisticRollbackEventand logbook entries during rapid command bursts (e.g., dimming a light through multiple values). Intermediate CCU confirmations are now silently accepted; mismatch is only evaluated on the final confirmation when all pending sends have been acknowledged. -
Optimistic mismatch no longer fires rollback events:
VALUE_MISMATCHno longer publishesOptimisticRollbackEvent. When the CCU confirms a different value (e.g., clamping to minimum dimming level), the CCU value is silently accepted as authoritative. Rollback events are now only published for actual rollbacks (TIMEOUT,SEND_ERROR). This eliminates noisy logbook entries during normal CCU value corrections.
Version 2026.2.4 (2026-02-05)¶
What's Changed¶
Added¶
- Optimistic updates: Added optimistic state updates for data points to provide instant UI feedback before CCU confirmation. Data points immediately update their state when
send_value()is called, then rollback if the CCU rejects the value or times out. Configure rollback timeout viaTimeoutConfig.optimistic_update_timeout(default: 30.0s).
New event: OptimisticRollbackEvent in aiohomematic.central.events
New properties on data points:
is_optimistic: Check if data point has pending optimistic value-
optimistic_age: Get age of optimistic value in seconds -
Command priority queue: Added three-tier priority system for command throttling to ensure security-critical commands bypass queues while bulk operations are deprioritized:
-
CRITICAL (priority 0): Security and access control commands (locks, sirens, alarms) bypass throttle entirely
- HIGH (priority 1): Interactive user commands use normal throttle with high queue priority
- LOW (priority 2): Burst detection automatically downgrades commands when burst thresholds are exceeded
New enum: CommandPriority in aiohomematic.client
CRITICAL priority is declared at the service-method level via @bind_collector(priority=CommandPriority.CRITICAL) on lock and siren service methods.
- Command throttle: Added configurable per-interface rate limiting for outgoing device commands (
set_value,put_paramset). The throttle enforces a minimum delay between consecutive commands on the same RF interface to ensure smooth operation and prevent packet loss during bulk operations. Configure viaTimeoutConfig.command_throttle_interval(default:0.0= disabled).
New class: CommandThrottle in aiohomematic.client
- CRITICAL queue purge: When a CRITICAL command arrives (e.g., cover STOP, lock, siren), all pending queued commands for the same channel group are automatically purged from the throttle queue. This prevents queued movement commands from restarting a cover after STOP. Purged commands are cancelled with
CommandSupersededErrorand return an empty result to callers. Channel group scope is respected — STOP on group 1 does not affect group 2 on the same device.
New exception: CommandSupersededError in aiohomematic.exceptions
New method: CustomDataPoint.get_channel_group_addresses() — returns all channel addresses in the data point's channel group
New parameter: purge_addresses on set_value(), put_paramset(), and CommandThrottle.acquire()
Removed¶
-
CRITICAL_PRIORITY_PARAMETERS: Removed the frozenset fromaiohomematic.const. CRITICAL priority is now declared exclusively via@bind_collector(priority=CommandPriority.CRITICAL)on service methods. The parameter-set-based detection was redundant since all lock/siren commands flow through decorated service methods. -
Bulk operation context: Removed
_is_bulk_operation_context()fromBaseParameterDataPoint. TheRequestContextbulk operation flag was never used by the HA integration, making it dead code. The command throttle's built-in burst detection provides automatic LOW priority downgrade without requiring explicit context flags.
Improved¶
- Internationalization: Added German and English translations for 8 new log messages in command throttle and optimistic updates subsystems
- Type safety: Fixed multiple mypy strict mode violations including Future/Task type parameters, call_later signatures, and protocol definitions
- Code quality: Removed lazy imports in production code, fixed import violations in test files to use public API
Fixed¶
- Syntax error: Fixed unterminated triple-quoted string in
interfaces/central.pythat prevented module compilation - Type annotations: Fixed missing
configproperty inCentralInfoProtocolandConfigProviderProtocol - Cover target levels: Fixed
_target_leveland_target_tilt_levelproperties to check forNonebefore callingfloat(), preventing type errors - Event bus access: Fixed optimistic rollback event publishing to use
_event_bus_provider.event_businstead of non-existent_event_busattribute - Optimistic updates in collector path: Fixed optimistic values interfering with
is_state_change()checks in parent service methods. When usingCallParameterCollector, optimistic values are now deferred untilsend_data()instead of being applied immediately insend_value(), preventing sibling data point reads from returning premature values
Version 2026.2.3 (2026-02-03)¶
What's Changed¶
Added¶
-
Domain-specific schedule validation: Added validation for schedule data based on device category (SWITCH, LIGHT, COVER, VALVE). The validation enforces that only appropriate fields are used for each device type:
-
SWITCH: Level must be binary (0.0 or 1.0),
level_2andramp_timeare forbidden - LIGHT:
level_2(slat position) is forbidden - COVER:
ramp_timeanddurationare forbidden - VALVE:
level_2andramp_timeare forbidden
The validation is backward-compatible: when no domain context is provided (e.g., direct SimpleSchedule.model_validate() calls), all fields are accepted. Domain-specific validation is automatically applied when using DefaultWeekProfile.set_schedule().
New exports from schedule_models.py:
SCHEDULE_DOMAIN_CONTEXT_KEY: Context key for passing domain to Pydantic validatorsSCHEDULE_DOMAINS: frozenset of categories that support schedules
Version 2026.2.2 (2026-02-03)¶
What's Changed¶
Fixed¶
- JSON control character sanitization: Fixed
JSONDecodeErrorwhen ReGa scripts (e.g.,fetch_all_device_data.fn) return JSON containing unescaped control characters in device names or values. The_sanitize_json_control_charsfunction is now applied consistently to all JSON parsing from CCU responses, including script results in_post_scriptand nested JSON in_get_serial. The sanitization is now selective - it only escapes control characters within JSON string values, preserving structural whitespace (newlines between JSON objects, etc.) to avoid "unexpected content after document" errors. - CustomDataPoint schedule conversion: Fixed
get_schedule()andset_schedule()methods inCustomDataPointto correctly convert betweenScheduleDict(string keys, dict values) andSimpleSchedulePydantic model (integer keys, Pydantic values). The methods now: - Accept both
ScheduleDictandSimpleScheduleas input toset_schedule() - Properly delegate to
week_profile.get_schedule()to ensureValidationExceptionis raised for unsupported devices - Convert between formats correctly in both directions
Documentation¶
- Week profile: Added comprehensive documentation for
SimpleScheduleEntryfields inweek_profile.md, including: - Complete field reference with types, ranges, and validation rules
- Device-type-specific meanings for
levelfield (switch, light, cover, valve) - Condition types (
fixed_time,astro,fixed_if_before_astro,fixed_if_after_astro) - Duration and ramp_time format examples
- Field summary table and complete usage examples
- Week profile module docstring: Updated to reflect API changes from version 2026.2.1 (removed "simple" prefix from method names)
Version 2026.2.1 (2026-02-02)¶
What's Changed¶
Fixed¶
- LINK paramset validation: Fixed
put_paramsetwithcheck_against_pd=Truefor LINK paramsets. LINK paramsets are not cached during device initialization (by design), so validation is now automatically skipped for LINK calls to prevent "Parameter not found" errors. Fixes #2903. - ClimateWeekProfile type signature: Fixed incorrect type annotation in
convert_dict_to_raw_schedule()- removedClimateSchedulefrom union type since the method only accepts_ClimateScheduleDictInternal(13-slot format). The Pydantic modelClimateScheduleuses a different structure (simple format withbase_temperatureandperiods). - Schedule Pydantic models JSON serialization: Added
_JsonSerializableMixinto all schedule Pydantic models (ClimateSchedule,ClimateProfileSchedule,ClimateWeekdaySchedule,ClimateSchedulePeriod,SimpleSchedule,SimpleScheduleEntry) to support orjson/Home Assistant JSON serialization via__json__()method.
Breaking Changes¶
- Climate schedule API unified to Pydantic models only: The old dual-format API (TypedDict + Pydantic) has been removed. All schedule methods now use Pydantic models exclusively.
Renamed methods in BaseCustomDpClimate:
simple_scheduleproperty →scheduleget_schedule_simple_profile()→ removed (useget_schedule_profile())get_schedule_simple_schedule()→get_schedule()get_schedule_simple_weekday()→get_schedule_weekday()set_simple_schedule()→set_schedule()set_simple_schedule_profile()→set_schedule_profile()set_simple_schedule_weekday()→set_schedule_weekday()
Removed types from const.py:
ScheduleSlotTypeenumScheduleSlotTypedDictClimateWeekdayScheduletype alias (now Pydantic model inschedule_models)ClimateProfileScheduletype alias (now Pydantic model inschedule_models)ClimateScheduleDicttype alias (nowClimateSchedulePydantic model)CLIMATE_MAX_SCHEDULER_TIME,CLIMATE_MIN_SCHEDULER_TIME,CLIMATE_RELEVANT_SLOT_TYPESCLIMATE_SCHEDULE_SLOT_IN_RANGE,CLIMATE_SCHEDULE_SLOT_RANGE,CLIMATE_SCHEDULE_TIME_RANGE
Migration: Replace old TypedDict imports with Pydantic models from aiohomematic.model.schedule_models.
Changed¶
- ClimateWeekProfile: Simple schedule format now uses Pydantic models for automatic validation. The existing user-facing format remains unchanged (no breaking changes), but input validation is now more robust with clear error messages.
- DefaultWeekProfile: Refactored schedule cache to use human-readable Pydantic models (
SimpleSchedule,SimpleScheduleEntry) instead of complex dictionary format. The new format provides automatic validation, clear field names (e.g.,weekdays,time,level,duration), and better developer experience.
Added¶
- schedule_models: New Pydantic models for climate device schedules:
ClimateSchedulePeriod: Validates temperature periods with starttime, endtime, temperatureClimateWeekdaySchedule: Validates daily schedules with base_temperature and periodsClimateProfileSchedule: Validates weekly schedules (MONDAY-SUNDAY)ClimateSchedule: Validates complete profiles (P1-P6)- schedule_models: Pydantic models for non-climate device schedules:
SimpleScheduleEntry: Validated schedule entry with weekdays, time, condition, target_channels, level, duration, ramp_timeSimpleSchedule: Container for multiple schedule entries keyed by group number (1-24)
Validation Improvements¶
Climate simple schedule validation now checks:
- Time format (HH:MM, supports 24:00 for end-of-day)
- Required fields (starttime, endtime, temperature)
- Time sequence (start < end)
- No overlapping periods
- Valid weekdays (MONDAY-SUNDAY)
- Valid profiles (P1-P6)
Technical¶
- week_profile.py: Simplified implementation by using Pydantic models directly instead of manual conversion functions (~2300 lines removed)
- Added Pydantic mypy plugin to
pyproject.tomlfor improved type inference - Updated
WeekProfileProtocolto accept any schedule type (removeddict[Any, Any]constraint) - Updated type annotations in
Device,DeviceWeekProfileProtocol, andBaseCustomDataPoint - Added i18n keys for better error messages:
exception.model.schedule.invalid_weekday,exception.model.schedule.invalid_profile
Version 2026.2.0 (2026-02-01)¶
What's Changed¶
Fixed¶
-
EventBus: Fix subscription leak for
DeviceLifecycleEventwhen stopping CentralUnit. The event type was missing fromclear_external_subscriptions(), causing "LEAKED_SUBSCRIPTION" warnings during shutdown. -
DeviceCoordinator: Fix devices not appearing after factory reset and re-pairing. When a device was reset and re-paired with the same address, channel descriptions (e.g.,
HEQ0128279:0,HEQ0128279:1) were not added to cache because only the parent device address was checked. Added_identify_missing_device_descriptions()to detect and cache missing channel descriptions.
Version 2026.1.57 (2026-01-31)¶
What's Changed¶
Added¶
- JsonCcuBackend: Implemented
get_device_details()method via JSON-RPCDevice.listAllDetail. This enables proper device name and interface registration for CUxD/CCU-Jack backends, matching the functionality ofCcuBackend.
Fixed¶
-
CUxD/CCU-Jack: Fix interface registration for CUxD/CCU-Jack devices. Devices were incorrectly assigned
Interface.BIDCOS_RF(default) becauseJsonCcuBackend.get_device_details()returnedNone, causingget_data_points(interface=Interface.CUXD)to filter out all CUxD devices. Interface is now registered during_add_new_devices()when device descriptions are cached. -
InterfaceClient: Fix
fetch_device_details()to use interface from device data instead of client's interface. The legacy client usedInterface(device["interface"])but the new implementation incorrectly usedself.interface, which would register all devices with the calling client's interface whenDevice.listAllDetailreturns devices from multiple interfaces.
Version 2026.1.56 (2026-01-31)¶
What's Changed¶
Fixed¶
- CUxD/CCU-Jack: Fix data not updating after startup for polled interfaces. The
refresh_data_point_data()method was using hardcodedCallSource.HM_INITwhich caused data points withignore_on_initial_loadto be skipped during periodic polling. Changed default toCallSource.MANUAL_OR_SCHEDULEDso polling works correctly while preserving initialization behavior.
Version 2026.1.55 (2026-01-30)¶
What's Changed¶
Added¶
- Documentation: Added comparison table of Homematic integrations in FAQ (Homematic, HomematicIP Cloud, Homematic(IP) Local)
- Documentation: Added raw schedule operations documentation (
get_schedule_profile,get_schedule_weekday,set_schedule_profile,set_schedule_weekday) - Documentation: Added comprehensive
send_text_displayaction documentation with all parameters (icon, colors, alignment, sound, etc.) - Documentation: Added instructions for accessing optional settings in Home Assistant
Test Infrastructure¶
- OpenCCU: Added comprehensive test fixtures for VirtualCCU with BackendMode.OPENCCU support
- OpenCCU: Added
pydevccu_openccusession-scoped fixture running JSON-RPC server in separate thread - OpenCCU: Added
central_unit_openccufixture with proper device lifecycle event handling - OpenCCU: Added
test_backend_openccu.pywith backend detection, programs, sysvars, rooms/functions, and backup tests - OpenCCU: Added
test_central_pydev_openccu.pywith full 397-device central unit tests
Fixed¶
- OperatingVoltageLevel: Use user-configured
LOW_BAT_LIMITvalue instead of default for battery percentage calculation. This fixes incorrect battery readings when users have customized the low battery threshold (regression from #2281) - OperatingVoltageLevel: Return
Noneinstead of clamped value whenvoltage_max <= low_bat_limit(invalid configuration) - OperatingVoltageLevel: Ensure
calculate_operating_voltage_levelalways returnsfloat(0.0/100.0) instead ofint(0/100) - Documentation: Corrected client architecture references across all docs - replaced non-existent
ClientCCU/ClientJsonCCU/ClientHomegearclasses with correctInterfaceClient+ Backend Strategy pattern (CcuBackend,JsonCcuBackend,HomegearBackend) - Documentation: Fixed
HeartbeatTimerFiredEventkey frominterface_idtocentral_namein event reference - Documentation: Added missing
RecoveryAttemptedEventfield documentation (max_attempts,stage_reached,success,error_message) - Documentation: Removed references to non-existent
USE_INTERFACE_CLIENTfeature flag in ADR 0013 - Documentation: Fixed outdated file paths in CLAUDE.md (docstring docs moved to
docs/contributor/coding/) - Documentation: Updated sequence diagram participant names to
InterfaceClient - Documentation: Replaced non-existent Handler class hierarchy with correct Backend Strategy architecture in sequence diagrams
- Documentation: Fixed action name typo
homeassistant.update_device_firmware_data→homematicip_local.update_device_firmware_data - Documentation: Fixed
copy_scheduleandcopy_schedule_profileexamples (corrected source/target entity usage) - Documentation: Fixed broken links in troubleshooting docs (now point to Actions Reference)
- Documentation: Fixed GitHub issues URL in optional settings
Version 2026.1.54 (2026-01-29)¶
What's Changed¶
Changed¶
- Logging: Reduced log level for data point validation messages from WARNING to DEBUG (value range min/max, enum index/value validation)
Fixed¶
- Documentation: Fixed MkDocs abbreviations format (
*[...]instead of_[...]) - Documentation: Added
.prettierignoreto prevent prettier from breaking abbreviations syntax
Removed¶
- Documentation: Removed migration guides (obsolete after refactoring completion)
- Documentation: Removed community templates page
Version 2026.1.53 (2026-01-29)¶
What's Changed¶
Added¶
-
Device Support: Added HmIP-WRC6-230 (Wall-mount Remote Control 6-button 230V) as fixed color light
-
MkDocs Documentation: Replaced Sphinx with MkDocs Material theme for GitHub Pages documentation
-
Added
mkdocs.ymlwith full Material theme configuration - Added GitHub Actions workflow (
.github/workflows/docs.yml) for automatic deployment on push todevel/master - Added custom styling (
docs/stylesheets/extra.css) for tables, code blocks, and ADR formatting - Added abbreviation tooltips (
docs/includes/abbreviations.md) for common terms (CCU, HmIP, RF, etc.) -
Documentation available at https://sukramj.github.io/aiohomematic/
-
Home Assistant Integration Documentation: Added comprehensive user guide for the Homematic(IP) Local integration
-
docs/user/homeassistant_integration.md- Complete integration guide docs/user/features/homeassistant_actions.md- Full actions reference with examplesdocs/user/features/week_profile.md- Week profile/schedule managementdocs/user/troubleshooting/troubleshooting_flowchart.md- Visual diagnosis flowchartsdocs/user/advanced/cuxd_ccu_jack.md- CUxD and CCU-Jack setup guide-
docs/user/device_support.md- Device support overview -
Developer Documentation
docs/developer/error_handling.md- Exception hierarchy and circuit breakerdocs/architecture/caching.md- Cache architecture documentationdocs/contributor/release_process.md- Release workflow
Changed¶
-
Documentation Structure: Reorganized docs/ directory for better navigation
-
docs/user/- User documentation (features/, troubleshooting/, advanced/) docs/developer/- Library consumer documentationdocs/contributor/- Code contribution documentation (coding/, testing/)docs/architecture/- Technical deep-dives (events/)-
docs/reference/- Reference material (glossary, common operations) -
README.md: Simplified with links to GitHub Pages documentation
- Unignore Documentation: Revised to UI-only configuration (no file-based config)
- Pre-commit Config: Updated codespell excludes for new doc paths
- GitHub Issue Templates: Updated all documentation links to use GitHub Pages URLs
- GitHub Workflows: Updated close-insufficient-info workflow with GitHub Pages links
- Abbreviations: Fixed format from
_[...]to*[...]for proper MkDocs rendering
Removed¶
-
Sphinx Documentation: Removed unused Sphinx configuration and files
-
Removed
docs/conf.py,docs/index.rst,docs/Makefile,docs/__init__.py - Removed
docs/api/*.rst(5 files),docs/user/*.rst(4 files),docs/dev/*.rst(3 files) -
Simplified
requirements_docs.txtto MkDocs dependencies only -
Device-Specific Documentation: Removed obsolete pages (replaced by derived binary sensors)
- Removed
docs/user/devices/(hmip_srh_window_handle.md, hmip_swsd_smoke_detector.md) - Removed
docs/user/ccu_scripts/(rename_sysvar_marker.md)
Version 2026.1.52 (2026-01-28)¶
What's Changed¶
Added¶
- Derived Binary Sensors: Implemented registry-based system for creating binary sensors derived from enum data points (ADR 0019)
- Added
DerivedBinarySensorcalculated data point class - Added
DerivedBinarySensorRegistryfor declarative mapping definitions - Added
DerivedBinarySensorMappingdataclass for mapping rules - New calculated parameters:
INTRUSION_ALARM,SMOKE_ALARM,WINDOW_OPEN - Automatic creation of derived binary sensors during device initialization
- HmIP-SRH, HM-Sec-RHS: Window handle sensor now provides additional
WINDOW_OPENbinary sensor (ON when TILTED or OPEN) - HmIP-SWSD: Smoke detector now provides additional
INTRUSION_ALARMandSMOKE_ALARMbinary sensors (ON when alarm active)
Improvements¶
- Enhanced Data Point Validity: Implemented comprehensive validation for data points including type checking, range validation, and proper None handling
- Automatic STATUS Parameter Updates: STATUS parameters (e.g., LEVEL_STATUS) now automatically update the main parameter's validity state
- Type-Specific Validation: Each parameter type (FLOAT, INTEGER, BOOL, ENUM, etc.) now has appropriate validation rules
- None Value Semantics: Clarified when None is a valid value (ACTION types, optional parameters) vs invalid (numeric sensors)
Technical Details¶
- Added
has_valid_value_typeandis_value_in_rangeproperties to BaseParameterDataPoint - STATUS parameter events are now automatically subscribed and processed
- Warning logs for out-of-range values received from CCU
- Added
_OPTIONAL_PARAMETERSfrozenset (19 parameters) using Parameter enum values - excludes ACTION type parameters which are handled automatically - Added missing Parameter enum values: INHIBIT, INSTALL_TEST, ON_TIME_UNIT, ON_TIME_VALUE, PARTY_START_DAY, PARTY_START_TIME, PARTY_STOP_DAY, PARTY_STOP_TIME, PARTY_TEMPERATURE
- Optional parameters include: color controls (COLOR, HUE, SATURATION, COLOR*TEMPERATURE, EFFECT), timing unit selectors (ON_TIME_UNIT, RAMP_TIME_UNIT, RAMP_TIME_TO_OFF_UNIT, DURATION_UNIT), party mode (PARTY**), and special features (LEVEL_2, INHIBIT, INSTALL_TEST)
- Note: ACTION type parameters (*_VALUE like ON_TIME_VALUE, RAMP_TIME_VALUE) are automatically allowed to be None and don't need explicit listing
Version 2026.1.51 (2026-01-27)¶
What's Changed¶
Added¶
-
CUxD/CCU-Jack regression prevention contract tests: Added dedicated
test_cuxd_ccu_jack_contract.pywith 20 tests specifically designed to prevent regressions that have occurred during AI-assisted refactoring. Tests cover: -
Interface classification (JSON-RPC vs XML-RPC constants)
- Backend factory behavior (JsonCcuBackend creation)
- Capability flags (ping_pong=False, rpc_callback=False)
- Port configuration (HTTP 80 / HTTPS 443)
- Enum value stability
-
Backend behavior (init_proxy/deinit_proxy are no-ops)
-
Comprehensive contract tests for stability guarantees: Added contract tests that define the stable API contract for aiohomematic. These tests ensure that changes to core infrastructure require explicit consideration and MAJOR version bumps:
-
test_capability_contract.py: Backend capabilities (CUxD, CCU-Jack, CCU, Homegear) test_client_state_machine_contract.py: Client state machine transitions and propertiestest_central_state_machine_contract.py: Central state machine transitions and propertiestest_connection_recovery_contract.py: Connection recovery behavior (exponential backoff, max attempts, stage progression)test_event_system_contract.py: Event types, required fields, and immutabilitytest_client_lifecycle_contract.py: Client lifecycle methods (init, deinit, reconnect, stop)test_enum_constants_contract.py: Enum value stability (Interface, Backend, DataPointCategory, DeviceProfile, ParamsetKey, etc.)test_configuration_contract.py: Configuration class stability (CentralConfig, InterfaceConfig, TimeoutConfig)test_exception_hierarchy_contract.py: Exception hierarchy (BaseHomematicException and subclasses)test_protocol_interfaces_contract.py: Protocol interface definitions (runtime checkable, required members)test_hub_entities_contract.py: Hub entity classes (Program, Sysvar, Metrics, Inbox, Update)test_subscription_api_contract.py: EventBus subscription API stabilitytest_backend_week_profile_contract.py: BackendOperationsProtocol (47 tests) and WeekProfileProtocol (7 tests) API stabilitytest_client_protocol_contract.py: ClientProtocol and all 18 sub-protocols (124 tests covering identity, connection, lifecycle, operations, and method signatures)-
test_device_channel_protocol_contract.py: DeviceProtocol, ChannelProtocol and all sub-protocols (273 tests covering identity, channel access, state, operations, configuration, and providers) -
@unique decorator for all Enums: Added
@uniquedecorator to 70+ enum classes across 15+ files to prevent accidental duplicate enum values. Affected modules includeconst.py,climate.py,cover.py,light.py,lock.py,siren.py,mixins.py,events/types.py,events/integration.py,json_rpc.py,rpc_proxy.py,metrics/events.py,store/types.py, andproperty_decorators.py
Changed¶
-
TimeoutConfig converted to Pydantic:
TimeoutConfigis now a PydanticBaseModelwithfrozen=Truefor immutability. The API remains fully compatible with the previousNamedTupleimplementation. -
InterfaceConfig converted to Pydantic with CUxD validation:
InterfaceConfigis now a PydanticBaseModelwith proper validation: -
For standard interfaces (HmIP-RF, BidCos-RF, etc.): port must be > 0
- For CUxD/CCU-Jack: port is automatically set to
None(ignored, JSON-RPC uses HTTP/HTTPS) -
interface_idandrpc_serverare computed fields -
CentralConfig converted to Pydantic:
CentralConfigis now a PydanticBaseModelwith: -
Automatic collection normalization (set/tuple → frozenset)
- Computed private attributes for derived values (
requires_xml_rpc_server,session_recorder_*) - Factory methods (
for_ccu,for_homegear) preserved -
All 30+ configuration fields with proper type hints and defaults
-
DeviceConfig/ExtendedDeviceConfig converted to Pydantic:
DeviceConfigandExtendedDeviceConfiginmodel/custom/registry.pyare now PydanticBaseModelclasses withfrozen=Truefor immutability -
ProfileConfig classes converted to Pydantic:
ChannelGroupConfig,ProfileConfig, andRebasedChannelGroupConfiginmodel/custom/profile.pyare now PydanticBaseModelclasses withfrozen=True -
BackendCapabilities converted to Pydantic:
BackendCapabilitiesinclient/backends/capabilities.pyis now a PydanticBaseModelwithfrozen=True. Backend implementations now usemodel_copy(update={...})instead ofdataclasses.replace() -
@override decorators added: Added
@overridedecorator fromtypingmodule to explicitly mark overridden methods across the codebase for improved code clarity and type checking -
Final annotations for constants: Added
Finaltype annotations to key constants for improved type safety
Documentation¶
- CLAUDE.md: CUxD/CCU-Jack special handling section: Added prominent "⚠️ CRITICAL: CUxD/CCU-Jack Special Handling" section at the top of CLAUDE.md to prevent AI-assisted refactoring regressions. Includes:
- Comparison table (XML-RPC vs JSON-RPC differences)
- Key constants to check before refactoring
- Common regression patterns with ❌ WRONG / ✅ CORRECT examples
- Refactoring checklist with pytest commands
See ADR-0018 for architectural context.
Fixed¶
-
Client reconnect now works from INITIALIZED state: Fixed an issue where clients stuck in
INITIALIZEDstate (e.g., after a failed startup due to JSON parsing errors) couldn't be reconnected. The state machine didn't allowRECONNECTINGas a valid transition fromINITIALIZED. The fix transitions toDISCONNECTEDfirst (which is the documented recovery path), then proceeds with reconnection. This enables automatic recovery when the initial connection was never established. -
JSON parsing now handles unescaped control characters: Fixed
JSONDecodeError: unexpected control character in stringerrors that occurred when device names or descriptions on the CCU contained unescaped control characters (newline, tab, carriage return, etc.). TheDevice.listAllDetailJSON-RPC response is now sanitized by escaping control characters (U+0000 to U+001F) to proper\uXXXXsequences before parsing. This allows the central unit to start successfully even when the CCU returns malformed JSON.
Version 2026.1.50 (2026-01-25)¶
What's Changed¶
Changed¶
- Clean port handling for JSON-RPC-only interfaces: Refactored
InterfaceConfig.portfrominttoint | None. XML-RPC interfaces (HmIP-RF, BidCos-RF, BidCos-Wired, VirtualDevices) require a valid port > 0, while JSON-RPC-only interfaces (CUxD, CCU-Jack) now correctly useNoneinstead of the previous workaround value0. This provides cleaner semantics and proper validation: InterfaceConfignow enforces port validation based on interface typeCentralConfigBuilder.add_cuxd_interface()no longer passesport=0- TCP pre-flight checks correctly skip interfaces with
port=None - Connection recovery checks simplified from
port is None or port == 0toport is None
Version 2026.1.49 (2026-01-25)¶
What's Changed¶
Fixed¶
-
Hub data not refreshed after connection recovery: Fixed an issue where hub data (System Update, Programs, Sysvars) was not refreshed after a successful reconnect. This caused the System Update DataPoint in Home Assistant to show stale information (e.g., "Update available" even after the CCU had completed the firmware update during the disconnect). The
ConnectionRecoveryCoordinatornow accepts ahub_data_fetcherparameter and callsfetch_system_update_data(),fetch_program_data(), andfetch_sysvar_data()after successful data load. This ensures that hub state is synchronized immediately after recovery instead of waiting up to 4 hours for the next scheduled refresh. -
Recovery fails for individual clients when others exist: Fixed an issue where recovery for CUxD or CCU-Jack clients would fail with "Clients bereits erstellt" when other clients (HmIP-RF, BidCos-RF, etc.) were already created. The
ConnectionRecoveryCoordinator._stage_reconnect()now calls_create_client(interface_config=...)directly for the specific failing interface instead of_create_clients()which requires no existing clients. -
Client state machine blocks recovery from INITIALIZED state: Fixed an issue where clients stuck in
INITIALIZEDstate (initialized but never connected) could not be recovered. The state machine now allowsINITIALIZED → DISCONNECTEDtransitions, enablingdeinit_proxy()to reset the client state for reconnection attempts. This was causingInvalidStateTransitionError: Invalid state transition from initialized to disconnected. -
TCP check fails for JSON-RPC-only interfaces: Fixed an issue where CUxD and CCU-Jack client creation would always fail at startup because the TCP pre-flight check was attempted on port 0. These interfaces use JSON-RPC (via the central JSON port 443/80) and don't have individual XML-RPC ports. The TCP check is now skipped for interfaces with
port=0.
Added¶
- JSON-RPC port pre-flight check: Added a TCP pre-flight check for the JSON-RPC port (80/443) before creating any CCU clients. CCU uses JSON-RPC for hub operations (programs, sysvars, system updates, etc.) in addition to XML-RPC for device communication. This check happens once at startup and ensures the JSON-RPC service is available before attempting to create clients.
Version 2026.1.48 (2026-01-25)¶
What's Changed¶
Fixed¶
- XML-RPC authentication headers not sent with TLS: Fixed a critical bug where HTTP Basic Authentication headers were not being sent when TLS was enabled. The custom timeout transport classes (
_TimeoutTransport,_TimeoutSafeTransport) did not pass theheadersparameter to the base class__init__(). WhenServerProxyreceives a pre-built transport, it does not add headers to it - headers must be passed directly to the transport constructor. This caused all XML-RPC calls to fail withProtocolError: Unauthorizedwhen CCU authentication was enabled. The fix passes the authentication headers directly to the transport classes.
Version 2026.1.47 (2026-01-25)¶
What's Changed¶
Fixed¶
- Authentication check fails for non-admin users: Fixed a regression introduced in 2026.1.41 where users without ADMIN rights on the CCU would fail to connect via JSON-RPC. The
_get_auth_enabled()method injson_rpc.pynow catchesAuthFailureexceptions in addition toInternalBackendException. WhenCCU.getAuthEnabledfails with "access denied (ADMIN needed 2)", this actually proves that authentication is enabled on the CCU (otherwise no permission check would occur). The method now correctly returnsTruein this case instead of propagating the exception.
Version 2026.1.46 (2026-01-24)¶
What's Changed¶
Added¶
- HA-Addon detection: OpenCCU running as Home Assistant Add-on is now detected via
HM_RUNNING_IN_HAorSUPERVISOR_TOKENenvironment variables. The newis_ha_addonfield inSystemInformationindicates whether the backend runs as an HA-Addon.
Changed¶
- System update disabled for HA-Addons: The
has_system_updateproperty returnsFalsefor HA-Addons. The System Update entity is not created and thefirmware_update_triggercapability is set toFalse, as updates are managed by the HA Supervisor.
Breaking Changes¶
- System Update entity not created for HA-Addons: The System Update entity is no longer created when running as an HA-Addon. Existing orphaned entities can be manually deleted in Home Assistant.
Version 2026.1.45 (2026-01-23)¶
What's Changed¶
Added¶
-
Free-threaded Python 3.14t support: Added compatibility layer for Python 3.14 free-threaded builds (no GIL). The new
compatmodule (aiohomematic/compat.py) provides: -
is_free_threaded_build()andis_gil_enabled()detection functions - Conditional JSON backend: uses orjson on standard builds, falls back to stdlib
jsonon free-threaded builds dumps(),loads(), andJSONDecodeErrorwith unified API across backends-
Option flags (
OPT_INDENT_2,OPT_NON_STR_KEYS,OPT_SORT_KEYS) compatible with both backends -
CentralRegistry: New thread-safe registry (
aiohomematic/central/registry.py) for CentralUnit instances using copy-on-read pattern. Safe for both GIL-enabled and free-threaded Python builds. Replaces the module-levelCENTRAL_INSTANCESdict. -
Python 3.14t in CI: Added free-threaded Python 3.14t to the test matrix in GitHub Actions workflow.
-
Package classifiers: Added new classifiers to
pyproject.toml: -
Programming Language :: Python :: Free Threading :: 2 - Beta Natural Language :: English,Natural Language :: GermanEnvironment :: No Input/Output (Daemon)-
Topic :: Internet,Topic :: Software Development :: Libraries :: Python Modules -
Tests: Added comprehensive test suites:
tests/test_compat.py: Tests for free-threading detection, JSON serialization, and round-trip behaviortests/test_central_registry.py: Tests for CentralRegistry thread-safety and operations
Changed¶
-
orjson is now an optional dependency: orjson does not support free-threaded Python, so it has been moved to an optional extra. Install with
pip install aiohomematic[fast]for faster JSON serialization on standard builds. Thecompatmodule automatically falls back to stdlibjsonwhen orjson is unavailable. -
compat module functions use keyword-only arguments:
dumps(*, obj, option)andloads(*, data)require keyword arguments for consistency with project coding standards. -
Migrated JSON operations to compat module: All direct orjson usage replaced with
compat.dumps()andcompat.loads()in: -
aiohomematic/central/rpc_server.py aiohomematic/client/json_rpc.pyaiohomematic/model/device.pyaiohomematic/store/persistent/session.pyaiohomematic/store/storage.pyaiohomematic/support.py-
aiohomematic/i18n.py -
CENTRAL_INSTANCES replaced with CentralRegistry: The module-level
CENTRAL_INSTANCES: dict[str, CentralUnit]has been replaced with a thread-safeCentralRegistryinstance providing atomic operations. -
Version 2026.1.44 (2026-01-22)¶
What's Changed¶
Added¶
-
SensorValueMixin: New mixin class in
aiohomematic/model/mixins/sensor_value.pythat consolidates duplicated value transformation logic betweenDpSensor(generic) andSysvarDpSensor(hub). Provides standardized handling for value list lookup, converter functions, and string length validation. -
Priority 1 Unit Tests: Comprehensive unit tests for InterfaceClient, Coordinators, and Event System achieving 86%+ coverage:
test_central_event_types.py: Event type validation teststest_central_event_bus.py: EventBus priority, batch publishing, and handler stats teststest_interface_client_lifecycle.py: Client lifecycle and capability-gated operations teststest_interface_client_backends.py: Backend-specific capability teststest_central_client_coordinator.py: ClientCoordinator lifecycle and edge case teststest_central_event_coordinator.py: Event routing tests
Fixed¶
- Fixed
test_package_init.pyassertion to handle i18n fallback behavior when translation is not loaded duringrunpy.run_modulecontext
Changed¶
- Async RPC server is now the standard implementation: The async XML-RPC server (using aiohttp) is now the only RPC server implementation. The legacy thread-based XML-RPC server has been removed.
- Removed
OptionalSettings.ASYNC_RPC_SERVERfeature flag (no longer needed) - Removed legacy thread-based XML-RPC server implementation
- Removed
RpcServerTaskSchedulerProtocolfromaiohomematic/interfaces/central.py - Renamed
async_rpc_server.pytorpc_server.py(consistent naming, noasync_prefix) - Updated
CentralUnitto use the aiohttp-based server directly - InterfaceClient is now the only client implementation: The legacy client implementations (ClientCCU, ClientJsonCCU, ClientHomegear) and handler classes have been removed. InterfaceClient with the Backend Strategy Pattern is now the standard implementation.
- Removed
OptionalSettings.USE_INTERFACE_CLIENTfeature flag (no longer needed) - Removed legacy client classes:
ClientCCU,ClientJsonCCU,ClientHomegear - Removed handler classes:
DeviceHandler,LinkHandler,FirmwareHandler,SystemVariableHandler,ProgramHandler,BackupHandler,MetadataHandler,BaseHandler - Removed
aiohomematic/client/ccu.pyandaiohomematic/client/handlers/directory - Added
aiohomematic/client/state_change.pyfor state change tracking utilities - Added
aiohomematic/client/client_factory.pyforClientConfigclass ClientConfigis now imported fromaiohomematic.client.client_factoryinstead ofaiohomematic.client.ccu
Refactored¶
- DeviceProfileRegistry data-driven registrations: Consolidated repetitive device registration calls into data-driven tuples with loops, reducing boilerplate code:
switch.py: 11 separateregister()calls → single data tuple with loop (~56% reduction)light.py: 17 RF/IP Dimmer registrations → two data tuples with loops (~43% reduction)
Removed¶
OptionalSettings.ASYNC_RPC_SERVER- async server is now the defaultOptionalSettings.ENABLE_LINKED_ENTITY_CLIMATE_ACTIVITY- linked entity climate activity is now always enabled- Legacy thread-based XML-RPC server (replaced by aiohttp-based implementation)
RpcServerTaskSchedulerProtocol- only needed by removed sync servertests/test_rpc_server_compatibility.py- compatibility tests no longer neededOptionalSettings.USE_INTERFACE_CLIENT- InterfaceClient is now the default- Legacy client classes:
ClientCCU,ClientJsonCCU,ClientHomegear - Handler classes in
aiohomematic/client/handlers/ aiohomematic/client/ccu.py
Version 2026.1.43 (2026-01-21)¶
What's Changed¶
Added¶
- Pydantic integration for RPC response validation: Introduced
aiohomematic.schemaspackage with Pydantic models for validating and normalizing data from Homematic backends: DeviceDescriptionModel: Validates device descriptions fromlistDevices(),newDevices()callbacksParameterDataModel: Validates parameter metadata fromgetParamsetDescription()- Normalization functions:
normalize_device_description(),normalize_parameter_data(),normalize_paramset_description() - Validation occurs at all data ingestion points (RPC responses, cache loading)
Changed¶
- Removed voluptuous dependency: Replaced voluptuous with Pydantic for data validation. The
validator.pymodule now usesValidationExceptioninstead ofvol.Invalid. External consumers (e.g., Home Assistant integration) that used voluptuous-based validators (channel_no,wait_for,address,host) must implement their own validators.
Breaking Changes¶
- Removed from
aiohomematic.validator:channel_no,positive_int,wait_for,address,host(voluptuous schemas) - Removed from
aiohomematic.validator:channel_address,device_address,hostname,ipv4_address,password,paramset_key(validator functions)
Version 2026.1.42 (2026-01-19)¶
What's Changed¶
Fixed¶
- Device availability events for forced availability:
Device.set_forced_availability()now publishesDeviceLifecycleEventwithevent_type=AVAILABILITY_CHANGEDwhen the device availability actually changes. Previously, only UNREACH/STICKY_UNREACH parameter changes triggered this event, meaning forced availability changes were not observable via the EventBus.
Version 2026.1.41 (2026-01-19)¶
What's Changed¶
Added¶
- Startup resilience for authentication errors: Implemented defensive client initialization to prevent false re-authentication requests when CCU starts after Home Assistant. The new approach uses a 3-stage validation:
- Stage 1: TCP Pre-Flight Check - Wait for port availability before attempting initialization
- Stage 2: Client Creation & RPC Validation - Verify backend communication
- Stage 3: Retry with Exponential Backoff - Retry transient authentication errors before failing
- New TimeoutConfig parameters:
startup_max_init_attempts: Maximum initialization attempts during startup (default: 5)startup_init_retry_delay: Initial delay between retry attempts (default: 3s)startup_max_init_retry_delay: Maximum delay after backoff (default: 30s)
- Reuses existing parameters:
reconnect_tcp_check_timeout,reconnect_tcp_check_interval,reconnect_backoff_factor - Only triggers re-authentication if all retry attempts are exhausted
Fixed¶
- Automatic reconnection after startup failures: Fixed connection recovery coordinator to properly handle startup failures where backend (CCU/pydevccu) was not available during Home Assistant startup. Previously, the integration would remain in FAILED state indefinitely. Now:
- Heartbeat timer starts automatically when central transitions to FAILED state during startup
- Recovery attempts run every 60 seconds (configurable via
HEARTBEAT_RETRY_INTERVAL) - Two distinct recovery paths:
- Startup failures (client never created): TCP check → Client creation → Data loading
- Runtime failures (client exists): TCP check → RPC check → Warmup → Stability check → Reconnection → Data loading
- Port resolution for TCP checks now falls back to interface configuration when client doesn't exist
- Integration automatically reconnects within 60 seconds once backend becomes available
Version 2026.1.40 (2026-01-17)¶
What's Changed¶
Added¶
- translation_key for data points: Added
translation_keyproperty to enable translations for data points that previously lacked this feature. Now all data point types provide a consistenttranslation_key: GenericHubDataPointProtocolandCalculatedDataPointProtocolnow requiretranslation_keyBaseParameterDataPoint: Derived from parameter name (existing, e.g.,set_point_temperature)GenericHubDataPoint: Uses category value (e.g.,hub_sensor,hub_button)HmInboxSensor:"inbox"HmUpdate:"system_update"_BaseMetricsSensor: Derived from sensor name (e.g.,system_health,connection_latency,last_event_age)HmInterfaceConnectivitySensor:"interface_connectivity"_BaseInstallModeDataPoint:"install_mode"DpUpdate:"device_update"CalculatedDataPoint: Derived from calculated parameter name
Changed¶
- ChannelEventGroup as virtual data point: Refactored
ChannelEventGroupfrom a helper class to a virtual data point bound to the Channel. Event groups are now created duringChannel.finalize_init()for eachDeviceTriggerEventTypepresent in the channel. Key changes: ChannelEventGroupnow extendsCallbackDataPointand follows the standard subscription pattern- New
subscribe_to_data_point_updated()method replacessubscribe_to_events() - New
last_triggered_eventproperty tracks which event fired - New
device_trigger_event_typeproperty identifies the event type of the group - Event groups are accessible via
channel.event_groupsdict keyed byDeviceTriggerEventType - A channel can have multiple event groups (one per
DeviceTriggerEventType) central.get_event_groups()now returns channel-bound instances (reused, not created on-the-fly)- Added
subscribe_to_internal_data_point_updatedtoGenericEventProtocol DataPointsCreatedEventnow sendsChannelEventGroupProtocolforEVENTcategory instead of tuple of events- Migration guide:
docs/migrations/channel_event_group_migration_2026_01.md
Fixed¶
-
Legacy cache migration for climate schedules: Fixed
ValidationException: Time 360 is invaliderror that occurred when starting with aiohomematic 2026.1.39 if the paramset cache contained legacy schedule data. The issue was that old cached data storedendtimevalues as numeric strings (e.g.,"360") instead of integers (360) or time strings ("06:00"). Added a new helper function_endtime_to_minutes()that handles all three formats, ensuring smooth migration without requiring cache deletion. -
Coordinated cache clearing on version mismatch: Fixed an issue where only one cache (device or paramset descriptions) would be cleared when its schema version was incremented. Now when either
DeviceDescriptionRegistryorParamsetDescriptionRegistrydetects a version mismatch, both caches are cleared together viaCacheCoordinator.load_all(), which returnsFalseto signal that both caches need to be rebuilt from CCU. Additionally, both registries now overrideclear()to also clear their internal index structures (_addresses,_device_descriptions,_address_parameter_cache), ensuring complete cache invalidation. This prevents scenarios where one cache's index data could remain in memory after clearing, causing incomplete rebuilds. Added newDataOperationResult.VERSION_MISMATCHenum value to signal version mismatches for coordinated handling. -
Sound player soundfile default handling: Fixed
CustomDpSoundPlayer.turn_on()to use the entity's current value or default as fallback whensoundfileparameter is not explicitly provided, instead of always defaulting to"INTERNAL_SOUNDFILE". Also movedSOUNDFILEtovisible_fieldsinIP_SOUND_PLAYER_CONFIGprofile configuration. -
Backend detection timeout support: Fixed
TypeError: ServerProxy.__init__() got an unexpected keyword argument 'timeout'error in backend detection. Thexmlrpc.client.ServerProxyclass doesn't accept atimeoutparameter directly. Introduced custom_TimeoutTransportand_TimeoutSafeTransportclasses that properly set socket timeout on HTTP/HTTPS connections, fixing backend detection functionality.
Developer¶
- Parallel test execution with pytest-xdist: Added
pytest-xdistfor parallel test execution, providing ~3.5x speedup (from ~180s to ~51s). CI workflow updated to use-n auto --dist loadscope. Session-scopedSessionPlayerfixtures now load ZIP files once per test session and share across all tests.
Version 2026.1.39 (2026-01-15)¶
What's Changed¶
Added¶
-
Paramset description patching system: Added a generic mechanism to patch incorrect
paramset_descriptionsreturned by the CCU. Some devices return wrong parameter metadata (e.g., HM-CC-VG-1 with invalid MIN/MAX for SET_TEMPERATURE). The patching system: -
Applies device-specific corrections during data ingestion (not on cache load)
- Uses declarative patch definitions in
aiohomematic/store/patches/ - Matches patches by device_type, channel_no, paramset_key, and parameter
- Automatically rebuilds cache when schema version changes (bumped to v3)
New modules:
ParamsetPatch: Dataclass defining a patch (device_type, channel_no, paramset_key, parameter, patches, reason)ParamsetPatchMatcher: O(1) lookup matcher that applies patches to parameter dataPARAMSET_PATCHES: Registry of all defined patches
Initial patch:
- HM-CC-VG-1 channel 1
SET_TEMPERATURE: Fixes MIN/MAX from incorrect CCU values to 4.5/30.5
Fixed¶
- Paramset patching now works for channel paramsets: Fixed two issues that prevented patches from being applied to channel paramset descriptions:
- Device type comparison is now case-insensitive (consistent with rest of codebase)
- Channel paramsets now use
PARENT_TYPE(root device type) for patch matching instead of channel TYPE
Version 2026.1.38 (2026-01-14)¶
What's Changed¶
Added¶
-
Configurable backend detection timeouts via TimeoutConfig: Backend detection timeouts are now centrally managed through
TimeoutConfiginstead of hardcoded constants. Added two new fields toTimeoutConfig: -
backend_detection_request: float = 5.0- Timeout for individual XML-RPC/JSON-RPC requests (1s in test mode) backend_detection_total: float = 15.0- Total timeout for the complete detection process (3s in test mode)
The detect_backend() function now accepts an optional timeout_config: TimeoutConfig | None parameter to override the timeout values from DetectionConfig. This allows for consistent timeout configuration across the application and automatic TEST_SPEEDUP support. Timeouts can be configured in three ways:
- Use defaults from
DEFAULT_TIMEOUT_CONFIG - Set explicitly in
DetectionConfig(request_timeout=..., total_timeout=...) -
Pass a custom
TimeoutConfigtodetect_backend(timeout_config=...) -
Socket-level timeout for XML-RPC connections: Added
timeoutparameter toAioXmlRpcProxy.__init__()that sets socket-level timeouts for TCP connections. This prevents backend detection from hanging indefinitely when connecting to unreachable hosts. Therequest_timeoutis now passed as socket timeout during detection, ensuring TCP connection attempts fail quickly (default: 5s) instead of relying on OS-default timeouts (60-120s). Normal RPC operations continue to use no socket timeout (backward compatible). -
Smart early abort on fatal connection errors: Backend detection now intelligently distinguishes between transient and fatal network errors. When encountering fatal errors (ETIMEDOUT, EHOSTUNREACH, ENETUNREACH, or TimeoutError), detection immediately aborts instead of trying all remaining ports. For transient errors (ECONNREFUSED - port closed but host reachable), detection continues to the next port. This reduces detection time on unreachable hosts from ~30s (6 ports × 5s) to ~5s (1 port × 5s), a 6× performance improvement.
-
Service methods for manual configuration reload: Added
Device.reload_device_config()andChannel.reload_channel_config()service methods (decorated with@inspector) for external/manual calls to force a reload of device/channel configuration data. These methods are intended for use cases where CONFIG_PENDING events are unreliable (classic BidCos devices) or when manual cache updates are needed. They internally callon_config_changed()which remains a callback method for internal system use. The methods reload paramset descriptions, link peers, and all master parameter values from the backend.
Typical use cases:
- After changing master parameters on BidCos devices (CONFIG_PENDING unreliable)
- Manual refresh of device/channel configuration
- Forcing cache updates for debugging
Changed¶
- Removed hardcoded detection timeout constants: Removed
_DETECTION_TIMEOUTand_DETECTION_TOTAL_TIMEOUTconstants frombackend_detection.py. Default values are now provided byDEFAULT_TIMEOUT_CONFIG.backend_detection_requestandDEFAULT_TIMEOUT_CONFIG.backend_detection_total.
Tests¶
- New tests for timeout configuration: Added six new test cases in
TestDetectBackendTimeout: test_detect_backend_with_custom_timeout_config: Verifies that a customTimeoutConfigis correctly usedtest_detect_backend_timeout_config_overrides_detection_config: Verifies thattimeout_configparameter overridesDetectionConfigtimeoutstest_detect_backend_total_timeout_cancels_multiple_probes: Verifies thattotal_timeoutcancels detection even when multiple ports remain to be probed, ensuring detection is always aborted within the timeout periodtest_detect_backend_socket_timeout_on_unreachable_host: Verifies that socket-level timeout prevents hanging on unreachable hosts (marked as slow test)test_detect_backend_aborts_on_host_unreachable: Verifies that detection aborts after the first fatal error (EHOSTUNREACH) instead of trying all 6 portstest_detect_backend_tries_all_ports_on_connection_refused: Verifies that detection continues through all ports when encountering transient errors (ECONNREFUSED)
Documentation¶
- Updated backend_detection.md: Added section explaining timeout configuration options and usage examples with custom
TimeoutConfig.
Version 2026.1.37 (2026-01-13)¶
What's Changed¶
Added¶
- Type conversion for read operations (
convert_from_pd): Added optionalconvert_from_pd: bool = Falseparameter toget_paramset()andget_value()methods across all client implementations (InterfaceClient, ClientCCU, ClientJsonCCU, DeviceHandler). When enabled, values returned from the CCU are automatically converted to their correct types (INTEGER, FLOAT, BOOL, ENUM, STRING) based on the ParameterDescription. This mirrors the existingcheck_against_pdparameter for write operations but without MIN/MAX validation (backend already enforced bounds). New helper methods_convert_read_value()and_check_get_paramset()handle the conversion logic.
Changed¶
-
WeekProfile now uses automatic type conversion: Both
ClimateWeekProfileandDefaultWeekProfilenow callget_paramset()withconvert_from_pd=Truein their_get_raw_schedule()methods. This ensures ENDTIME values are returned as integers and TEMPERATURE values as floats directly from the client layer, eliminating the need for manual type handling in schedule parsing code. This is particularly important for HM-CC-VG-1 virtual heating groups where the CCU returns values as strings. -
Renamed write conversion methods for consistency: Renamed
_convert_value()to_convert_write_value()in InterfaceClient and DeviceHandler to clearly distinguish write operations from the new read conversion methods. The naming now follows a consistent pattern: -
Read:
_convert_read_value(),_check_get_paramset() -
Write:
_convert_write_value(),_check_put_paramset() -
Simplified type handling in week_profile.py: Removed redundant string fallback code in
ClimateWeekProfile.convert_raw_to_dict_schedule(). Withconvert_from_pd=True, ENDTIME values are now always integers from the client layer. Helper functionsidentify_base_temperature()and_validate_and_convert_weekday_to_simple()retain int/string dual support since they may receive raw CCU data directly.
Tests¶
- New tests for convert_from_pd functionality: Added
TestClientConvertFromPdtest class with 4 tests covering the HM-CC-VG-1 string-to-int conversion scenario: test_get_paramset_converts_string_to_int: Verifies ENDTIME "360" → 360 and TEMPERATURE "17.5" → 17.5test_get_value_converts_string_to_int: Verifies single value conversiontest_convert_from_pd_preserves_correct_types: Verifies already-correct types remain unchangedtest_convert_from_pd_unknown_parameter_unchanged: Verifies unknown parameters pass through unchanged
Version 2026.1.36 (2026-01-13)¶
What's Changed¶
Fixed¶
- Schedule validation error for HM-CC-VG-1 heating groups: Fixed
ValidationException: Time 360 is invaliderror when adding climate entities for virtual heating groups (HM-CC-VG-1). The CCU sometimes returns ENDTIME values as strings ("360") instead of integers (360) in the raw paramset. Theconvert_raw_to_dict_schedule()function inClimateWeekProfilenow handles both formats by checking if string values are numeric before conversion. This complements the fix in 2026.1.35 which addressed integer handling inidentify_base_temperature().
Version 2026.1.35 (2026-01-13)¶
What's Changed¶
Fixed¶
-
Schedule validation error on device initialization: Fixed
ValidationException: Time 360 is invaliderror occurring when heating group devices (VirtualDevices interface) are initialized. Theidentify_base_temperature()function inweek_profile.pyincorrectly assumed all endtime values in the schedule cache are formatted strings ("06:00"), but during initial cache loading they can be raw integers (360 minutes) directly from the CCU. The function now handles both integer and string formats by checking the type before conversion. This fixes climate entity creation failures and recurring errors on Home Assistant startup. (Fixes #2797) -
Type safety for ScheduleSlot: Updated
ScheduleSlotTypedDict to correctly declareendtime: str | intinstead ofendtime: str. This reflects the actual behavior where the CCU always returns integers (minutes since midnight) while internal conversion may use string format. Fixes mypy type checking errors inweek_profile.py.
Version 2026.1.34 (2026-01-13)¶
What's Changed¶
Fixed¶
-
CUxD/CCU-Jack unnecessary reconnects via MQTT: Fixed false positive connection loss detection for CUxD and CCU-Jack interfaces when used with Homematic(IP) Local MQTT bridge. These interfaces use JSON-RPC without ping/pong support and receive events via MQTT, causing
callback_warn_intervalchecks to incorrectly trigger reconnects every ~4 minutes. Bothis_callback_alive()andis_connected()now checkping_pongcapability to skip callback timeout validation for MQTT-based interfaces. -
Syntax error in device_ops.py: Fixed IndentationError in
_validate_and_convert_value()method that prevented module import. Restored missing value conversion and MIN/MAX validation code block.
Changed¶
-
Schedule cache now uses pessimistic update strategy: Climate schedule cache (
ClimateWeekProfileandDefaultWeekProfile) is no longer updated optimistically when callingset_schedule(),set_profile(), orset_weekday(). The cache is now updated only after receivingCONFIG_PENDING = Falsefrom the CCU viareload_and_cache_schedule(). This ensures the cache always reflects the actual CCU state, eliminating race conditions and inconsistencies. The cache remains essential for performance (avoiding RPC calls on reads) and event optimization (publishing events only when data changes). UI components like the Climate Schedule Card work seamlessly with this approach due to their built-in loading states and optimistic local updates. -
Enhanced schedule temperature tests: Extended tests for
set_simple_schedule_weekdayandset_simple_schedule_profileto verify correct behavior when integer temperatures are provided. Tests now explicitly verify that integer-to-float conversion happens in_convert_value(insideput_paramset) based on paramset descriptions, rather than inweek_profile.py. This ensures type conversion follows the established pattern where the client layer handles all type conversions based on CCU parameter definitions.
Documentation¶
-
CLAUDE.md - Schedule Cache Management: Added comprehensive section documenting the pessimistic schedule cache update strategy, including cache update flow diagram, implementation details, and integration guidelines for Home Assistant Climate Schedule Card. Includes timeline diagrams showing the ~0.5-2 second delay between
set_schedule()calls and cache updates viaCONFIG_PENDING. -
CLAUDE.md - Homematic(IP) Local Integration: Added comprehensive section on "Integration with Homematic(IP) Local" explaining MQTT-based event flow for CUxD/CCU-Jack, capability-based callback health checks, and debugging guidance for MQTT integration issues.
Version 2026.1.33 (2026-01-12)¶
What's Changed¶
Fixed¶
-
LINK paramsets causing false "incomplete device data" issues: LINK paramsets are now excluded from paramset fetch operations and completeness checks. LINK paramsets are only relevant for device linking (direct associations) and are fetched dynamically when links are configured. Previously, failed LINK fetches (which occur when no links exist) caused devices to be incorrectly flagged as having incomplete data, triggering unnecessary repair issues in Home Assistant.
-
Empty paramset descriptions not being cached: Fixed issue where paramset descriptions that return an empty dict
{}(valid response) were incorrectly treated as missing. HmIP base device addresses and some channel types return empty MASTER or VALUES paramsets which is valid behavior. The fix usesis not Nonecheck instead of truthy check in all paramset fetch code paths (get_paramset_descriptions,fetch_paramset_descriptions, andfetch_paramset_description), ensuring empty dicts are properly cached.
Changed¶
-
Skip LINK paramsets during device initialization: LINK paramset descriptions are no longer fetched during initial device creation or CONFIG_PENDING reload. This reduces startup time, eliminates spurious error messages for non-linked devices, and prevents false positive "incomplete device data" warnings. Link functionality remains fully supported - LINK paramsets are fetched on-demand when link operations are performed.
-
Improved log message clarity: Changed "devices" to "device/channel descriptions" in paramset fetch logging for accuracy, since the count includes both device and channel entries.
Version 2026.1.32 (2026-01-12)¶
What's Changed¶
Fixed¶
-
O(N²) performance issue during device creation: Fixed severe performance regression introduced in 2026.1.31 where
DataFetchCompletedEventwas published after each individual device's paramset fetch, causing N cache saves for N devices. The event is now published once after the entire batch completes, reducing startup time from ~210 seconds to ~17 seconds for 397 devices (13x improvement). -
put_paramset fails on HM-CC-VG-1: Fixed
TypeError: '<' not supported between instances of 'int' and 'str'when callingput_paramseton HM-CC-VG-1. This device returnsMIN/MAXvalues as strings instead of numbers in paramset descriptions. Now converts these values to the correct numeric type before comparison.
Changed¶
- Enable schedule for HM-CC-VG-1
Version 2026.1.31 (2026-01-12)¶
What's Changed¶
Fixed¶
-
Schedule temperature values not updating on HM-TC-IT-WM-W-EU: Fixed issue where temperature values in simple weekly schedules were sent as integers to the CCU, causing them to be silently ignored. The CCU requires temperature parameters as floats. Added explicit
float()conversions inconvert_dict_to_raw_schedule(),_validate_and_convert_simple_to_weekday(), and_fillup_weekday_data()to ensure all temperature values are sent as floats regardless of user input type. This fixes schedule temperature updates for HM-TC-IT-WM-W-EU and other Homematic RF thermostats when usingset_schedule_simple_weekday. -
Event-based cache persistence for paramset descriptions: Implemented automatic cache persistence using
DataFetchCompletedEventto prevent race conditions where paramsets were fetched but not saved before shutdown. TheCacheCoordinatornow subscribes to data fetch completion events and automatically persists caches when changes are detected. -
Paramset completeness validation before device creation: Added validation after paramset fetch operations to ensure all required paramsets are in cache before starting device creation. If paramsets are still missing after fetch attempts, creation of the new devices in this batch is aborted (existing devices remain unaffected), the partial cache is persisted for diagnostics, and an
INCOMPLETE_DEVICE_DATAintegration issue event is published to allow the Home Assistant integration to create a repair issue.
Changed¶
-
DataFetchCompletedEvent operation is now enum-based: Changed
DataFetchCompletedEvent.operationfromstrtoDataFetchOperationenum for type safety. UseDataFetchOperation.FETCH_PARAMSET_DESCRIPTIONSorDataFetchOperation.FETCH_DEVICE_DESCRIPTIONSinstead of string literals. -
Optimized cache save operations: Introduced
save_if_changed()method that only writes to disk whenhas_unsaved_changes=True, avoiding unnecessary disk I/O during shutdown when event-based auto-save has already persisted changes. -
Improved cache save logging: Added detailed debug logging for cache save operations showing content keys and sizes to aid in troubleshooting cache-related issues.
Added¶
-
Test for integer temperature conversion in schedules: Added
test_rf_thermostat_simple_schedule_integer_temperature_conversionto verify that integer temperatures in YAML are correctly converted to floats before being sent to the CCU. This test ensures the fix for issue #2789 and prevents regression. -
Integration issue for incomplete device data: Added new
IntegrationIssueType.INCOMPLETE_DEVICE_DATAthat is published viaSystemStatusChangedEventwhen devices cannot be created due to missing paramset descriptions after fetch attempts. The issue includes the affected device addresses and can be used by the Home Assistant integration to create repair issues alerting users to potential CCU data corruption or communication problems. -
Schedule test for HM-TC-IT-WM-W-EU (#2785): Added test coverage for weekly program schedule operations on RF thermostats.
Version 2026.1.30 (2026-01-11)¶
What's Changed¶
Fixed¶
-
Device availability not reset after CCU restart: The state transition sequence during reconnect is
reconnecting → disconnected → connecting → connected. The availability reset only triggered whenold_statewas in(DISCONNECTED, FAILED, RECONNECTING), but the final transition hasold_state=CONNECTING. AddedCONNECTINGto the list of states that trigger availability reset. -
Race condition in client state event processing: Events from the EventBus may be processed out of order (e.g.,
disconnectedevent processed afterconnectedevent). Now checks the current client state before marking devices unavailable, preventing incorrect availability changes when the client has already recovered.
Version 2026.1.29 (2026-01-11)¶
What's Changed¶
Fixed¶
-
Connectivity sensors not updating during CCU restart: Interface connectivity binary sensors now subscribe to
ClientStateChangedEventfor immediate reactive updates instead of only updating during scheduled refresh cycles. -
CuXD devices not created when paramset_descriptions missing: When device_descriptions were already cached but paramset_descriptions were missing (e.g., from a previous interrupted run), devices were skipped with "Nothing to add/update". Now properly detects missing paramset_descriptions by comparing expected PARAMSETS from device_description against cached paramsets, ensuring both caches stay synchronized.
Version 2026.1.28 (2026-01-10)¶
What's Changed¶
Breaking Changes¶
-
Comprehensive Capabilities Pattern Migration: All
supports_*properties have been migrated to a unified Capabilities pattern. See Migration Guide for details. -
Entity Capabilities (frozen dataclasses):
LightCapabilities:brightness,transition,color_temperature,hs_color,effectsSirenCapabilities:duration,lights,tones,soundfilesLockCapabilities:openClimateCapabilities:profiles
-
Static capabilities now accessed via
entity.capabilities.<name>:light.supports_brightness→light.capabilities.brightnesssiren.supports_duration→siren.capabilities.durationlock.supports_open→lock.capabilities.openclimate.supports_profiles→climate.capabilities.profiles
-
Dynamic properties renamed to
has_*:light.supports_color_temperature→light.has_color_temperaturelight.supports_effects→light.has_effectslight.supports_hs_color→light.has_hs_colordisplay.supports_icons→display.has_iconsdisplay.supports_sounds→display.has_soundsdevice.supports_week_profile→device.has_week_profiledata_point.supports_events→data_point.has_eventsdata_point.supports_schedule→data_point.has_schedulecentral.supports_ping_pong→central.has_ping_pong
-
BackendCapabilities: Removed
supports_*prefix from all 19 fields:capabilities.supports_ping_pong→capabilities.ping_pongcapabilities.supports_backup→capabilities.backup- (and all other fields)
-
Handler classes: All
supports_*→has_*:handler.supports_linking→handler.has_linkinghandler.supports_programs→handler.has_programs- (and all other handlers)
-
ClientConfig: All
supports_*→has_*:config.supports_linking→config.has_linkingconfig.supports_ping_pong→config.has_ping_pong
Added¶
-
Faster Connectivity Detection (#2767): Improved connection loss detection from ~240s to ~20s:
-
Added
ping_timeout(10s) for ping/connectivity check operations - Added
connectivity_error_threshold(1) - single failure marks interface as disconnected - Reduced
callback_warn_intervalfrom 10 minutes to 3 minutes - Immediate device unavailability marking when client state changes to DISCONNECTED/FAILED
-
Fixed system health score defaulting to 100% before connections established (now shows 0%)
-
Interface Connectivity Binary Sensors: New hub-level binary sensors showing per-interface connectivity status:
-
HmInterfaceConnectivitySensorclass for each interface (HmIP-RF, BidCos-RF, etc.) - Shows ON when interface is connected and operational
- Shows OFF when interface is disconnected, failed, or degraded
- Always available (never shows unavailable since its purpose is to show connection state)
-
Refreshed automatically via scheduler at the same interval as metrics
-
New protocol:
HubBinarySensorDataPointProtocolfor hub-level binary sensor data points -
New Capabilities Dataclasses in
aiohomematic/model/custom/capabilities/: -
LightCapabilities,SirenCapabilities,LockCapabilities,ClimateCapabilities - All use
@dataclass(frozen=True, slots=True)for immutability and performance -
Predefined constants for common capability sets
-
Comprehensive test coverage for ConnectionRecoveryCoordinator (90+ tests):
- Unit tests for
InterfaceRecoveryStatedataclass (retry logic, exponential backoff, state transitions) - Tests for all recovery stages (TCP check, RPC check, stability check, reconnect, data load)
- Tests for event handlers (
_on_connection_lost,_on_circuit_breaker_tripped,_on_circuit_breaker_state_changed) - Tests for state machine transitions (RECOVERING, RUNNING, DEGRADED, FAILED)
- Tests for heartbeat timer and incident recording
- Tests for exception handling (CancelledError, generic exceptions)
- Tests for edge cases (shutdown during recovery, max retries, JSON-RPC port fallback)
Version 2026.1.27 (2026-01-09)¶
What's Changed¶
Fixed¶
- Fix recovery stuck in infinite retry loop after CCU restart (follow-up to GitHub #2757):
- Reset XML-RPC proxy transport before RPC availability check during recovery. After CCU restart, the proxy's HTTP connection enters an inconsistent state (ResponseNotReady) which caused
system.listMethodscalls to fail silently - Fix proxy lookup to handle both direct client proxy (
client._proxy) and backend proxy (client._backend._proxy) for InterfaceClient architecture - Add logging when RPC check fails during recovery for better debugging
Version 2026.1.25 (2026-01-09)¶
What's Changed¶
Fixed¶
- Fix persistent ping_pong_mismatch repair issues after CCU restart (GitHub #2757):
- Fix central state stuck at "recovering" after successful recovery by correcting the order of operations in
ConnectionRecoveryCoordinator._start_recovery()- now removes interface from active_recoveries before checking transition state - Add immediate connection repair notification when recovery starts - emits
SystemStatusChangedEvent(connection_state=(interface_id, False))so users see feedback immediately instead of waiting for recovery to fail - Emit connection restored event when recovery succeeds to clear the repair notification
Version 2026.1.24 (2026-01-09)¶
What's Changed¶
Breaking Changes¶
-
Strongly typed events and IntegrationIssue: Multiple event classes now use typed enums instead of string comparisons. This prevents consumer errors from incorrect string matching and provides better IDE support:
-
IntegrationIssue:
issue.severityis nowIntegrationIssueSeverityenum- New
issue.issue_typefield asIntegrationIssueTypeenum issue.mismatch_countis nowint | Noneissue.mismatch_typeis nowPingPongMismatchType | None
-
ClientStateChangedEvent:
old_stateandnew_stateare nowClientStateenum (previouslystr) -
CentralStateChangedEvent:
old_stateandnew_stateare nowCentralStateenum (previouslystr) -
DataRefreshTriggeredEvent / DataRefreshCompletedEvent:
refresh_typeis nowDataRefreshTypeenum (previouslystr) -
ProgramExecutedEvent:
triggered_byis nowProgramTriggerenum (previouslystr) -
See migration guide:
docs/migrations/strongly_typed_events_2026_01.md
Added¶
- New enums:
DataRefreshTypeandProgramTriggerfor strongly typed event fields
Version 2026.1.23 (2026-01-09)¶
What's Changed¶
Fixed¶
- Fix list_device() returning empty list treated as error: The
init_proxy()method now correctly handles empty device lists from interfaces that don't support RPC callbacks. Previously, an empty device list was incorrectly treated as a connection failure because the code used a truthy check (if device_descriptions :=) instead of a None check. Now usesis not Noneto properly distinguish between "no devices" (success) and "list_devices failed" (failure).
Version 2026.1.22 (2026-01-09)¶
What's Changed¶
Fixed¶
-
Fix leaked EventBus subscriptions on central stop: Six internal subscription leaks have been fixed:
-
SysvarStateChangedEventsubscriptions inHubCoordinatorwere not being cleaned up (72 subscriptions per central) HealthRecordedEventsubscription inClientCoordinatorwas stored but never unsubscribedDeviceRemovedEventsubscription inCacheCoordinator- the existingstop()method was not being calledDataPointValueReceivedEventsubscriptions inEventCoordinatorwere not being cleaned upDataPointStatusReceivedEventsubscriptions inEventCoordinatorwere not being cleaned upSystemStatusChangedEventsubscriptions inCentralUnit,InterfaceClient, andClientCCUwere not being cleaned up
The HubCoordinator and EventCoordinator now have clear() methods, CacheCoordinator.stop() is called during central shutdown, and client stop() methods now properly unsubscribe from system status events.
Added¶
- New
EventBus.clear_external_subscriptions()method: Clears subscriptions for event types that are subscribed to by external consumers (like Home Assistant integration). This includesDataPointStateChangedEvent,DeviceRemovedEvent,DeviceStateChangedEvent,FirmwareStateChangedEvent, andLinkPeerChangedEvent. The method is called during central shutdown as a fallback cleanup for external subscriptions that were not properly unsubscribed.
Version 2026.1.21 (2026-01-09)¶
What's Changed¶
Fixed¶
- Fix state machine transition error on unload: Allow transition from
FAILEDtoDISCONNECTEDstate. This fixesInvalidStateTransitionErrorwhen unloading the Home Assistant integration while a client is in failed state. Previously,deinit_proxy()could not cleanly shut down a failed client.
Version 2026.1.20 (2026-01-08)¶
What's Changed¶
Changed¶
-
Eliminate dynamic import in
CentralConfig.create_central(): The circular import betweenconfig.pyandcentral_unit.pyhas been resolved using Dependency Inversion with a newCentralConfigProtocol. This eliminates the Home Assistant warning:Detected blocking call to import_module with args ('aiohomematic.central.central_unit',). -
Eliminate all remaining lazy imports: All
noqa: PLC0415markers have been removed from production code. Circular imports have been resolved through module restructuring: - Event types (
Event,EventPriority, state change events) moved tocentral/events/types.py LogContextProtocolmoved to_log_context_protocol.pyin root package- Handler utilities now imported at top-level
- Metrics imports now at top-level in
circuit_breaker.py
Added¶
-
New
CentralConfigProtocol: A protocol interface ininterfaces/central.pythat defines the configuration contract, enablingCentralUnitto depend on the protocol rather than the concreteCentralConfigclass. -
New
central/events/types.pymodule: Contains foundational event types to break circular import chains: -
Eventbase class EventPriorityenumCircuitBreakerStateChangedEvent,CircuitBreakerTrippedEvent-
ClientStateChangedEvent,CentralStateChangedEvent,HealthRecordedEvent -
New
_log_context_protocol.pymodule: Minimal leaf module containingLogContextProtocolto avoid triggering package initialization chains.
Removed¶
CentralConfig.create_json_rpc_client()method removed: This method was moved inline intoCentralUnit.json_rpc_clientproperty. External consumers should not have been using this method as it required aCentralUnitinstance as parameter.
Internal¶
CentralUnit.__init__now acceptsCentralConfigProtocolinstead ofCentralConfigConfigProviderProtocol.confignow returnsCentralConfigProtocolClientDependenciesProtocol.confignow returnsCentralConfigProtocol- Event consumer modules now import from
central/events/types.pydirectly property_decorators.pyimportsLogContextProtocolfrom root package module
Version 2026.1.19 (2026-01-08)¶
What's Changed¶
Breaking Changes¶
CentralConfig.create_central()is now async: Prevents "Detected blocking call" warnings in Home Assistant 2026.1.0+ by running all blocking I/O operations (os.path.exists,os.makedirs) in a thread pool executor.
-
CentralConfig.check_config()is now async: Configuration validation now runs in executor to avoid blocking. -
check_config()function is now async: Module-level config validation function now returnsAwaitable[list[str]]. -
check_or_create_directory()is now async: Directory creation utility now returnsAwaitable[bool].
Version 2026.1.18 (2026-01-08)¶
What's Changed¶
Added¶
-
Add
old_valueandnew_valuefields toDataPointStateChangedEvent: External consumers can now track what changed without maintaining their own previous state. The fields are populated when values change and may beNoneduring initial load or for non-value updates. -
Add
AvailabilityInfodataclass: New unified view of device availability bundling reachability, battery, and signal information: -
is_reachable: Device reachability status (inverse of UNREACH) last_updated: Most recent data point modification timebattery_level: Battery percentage (0-100) from OperatingVoltageLevel or BATTERY_STATElow_battery: LOW_BAT indicatorsignal_strength: RSSI in dBm from RSSI_DEVICE-
Helper properties:
has_battery,has_signal_info -
Add
Device.availabilityproperty: ReturnsAvailabilityInfoproviding a unified view of device connectivity and health status. -
Add Consumer API documentation: New
docs/consumer_api.mdguide explaining the three API layers (HomematicAPI, CentralUnit, Protocols), event subscription patterns, and common operations for external consumers like Matter bridges.
Internal¶
- Update
DeviceAvailabilityProtocol: Addedavailabilityproperty to the protocol interface - Update
CalculatedDataPointProtocol: Added missingvalueproperty to the protocol interface - Update
CallbackDataPointProtocol: Addedold_valueandnew_valueparameters topublish_data_point_updated_event() - Remove unnecessary delayed imports: Moved
store.typesimports to top-level in 7 files andmetrics/central.eventsimports inrequest_coalescer.py. These imports had# noqa: PLC0415markers but no actual circular dependency. Remaining delayed imports incircuit_breaker.pyare necessary due to genuine circular dependency chains.
Version 2026.1.17 (2026-01-07)¶
What's Changed¶
Internal¶
-
Extend DeviceDescription TypedDict to cover full API specification: Activated all optional fields from HM_XmlRpc_API.pdf V2.16 and HMIP_XmlRpc_API_Addendum.pdf V2.10
-
Added fields:
PARENT_TYPE,RF_ADDRESS,INDEX,AES_ACTIVE,VERSION,FLAGS,DIRECTION,GROUP,TEAM,TEAM_TAG,TEAM_CHANNELS,ROAMING - Improved documentation: Grouped fields by category (Common, Firmware, Interface/Connectivity, Links, Device metadata, Groups/Teams)
-
Type safety: Full type coverage for all fields defined in API specification
-
Improve ParameterData validation and type safety:
-
VALUE_LIST: Changed from
Iterable[Any]toIterable[str]with validation ensuring all elements are converted to strings - SPECIAL: Documented actual usage pattern - API spec defines
Array<Struct>, but CCU/pydevccu/Homegear returnMapping[str, Any]with special value IDs as keys (e.g.,{"NOT_USED": 111600.0, "PERMANENT": 255}) -
Debug logging: All validation failures now logged at DEBUG level with context (address, parameter name, validation error) for easier troubleshooting and backend compatibility monitoring
-
Implement ADR 0015: Description Data Normalization and Validation: Establish comprehensive data normalization layer using voluptuous for device and parameter descriptions
- Problem: Device descriptions and paramset descriptions were normalized at output points (e.g.,
listDevices()XML-RPC response), addressing symptoms rather than root causes. This violated DRY principle and created multiple validation points. - Solution: Normalize data at all ingestion points following "Parse, don't validate" pattern
- Benefits: Single source of truth for data correctness, defense in depth with multiple validation points, cache efficiency through schema versioning, reduced complexity by eliminating output normalization
Bug Fixes¶
- Fix Homegear device details fetching in InterfaceClient: The new
InterfaceClientbackend architecture was missing theget_device_details()implementation for Homegear - Fix excessive getValue calls during startup: Fixed a bug where the data cache was expiring during device creation, causing hundreds of unnecessary getValue RPC calls
Version 2026.1.16 (2026-01-06)¶
What's Changed¶
Bug Fixes¶
-
Fix VirtualDevices init() Timeout (#2731): Fixed a bug where VirtualDevices init() times out even though the CCU successfully processed the request
-
Root cause: The VirtualDevices service on some CCU backends (OpenCCU, RaspberryMatic) processes the init() request correctly, calls back listDevices/newDevices, but fails to send the init() response. This causes a 3-second timeout even though the initialization was successful.
-
Symptom:
PROXY_INIT failed: NoConnectionException [OSError: timed out]for VirtualDevices while BidCos-RF and HmIP-RF work fine. The CCU does call backlistDevicessuccessfully, but init() still times out. -
Fix: Added detection of successful callback during init() timeout. If init() times out but a listDevices callback was received (indicated by
modified_attimestamp update), the init() is treated as successful. -
Affected files:
aiohomematic/client/ccu.py: Added callback detection ininit_proxy()aiohomematic/client/interface_client.py: Added callback detection ininit_proxy()
-
Impact: VirtualDevices (heating groups) should now initialize reliably on OpenCCU/RaspberryMatic systems
Version 2026.1.15 (2026-01-06)¶
What's Changed¶
Bug Fixes¶
-
Fix VirtualDevices Connection Failure (#2731): Fixed a critical bug where VirtualDevices connections would fail with a 3-second timeout
-
Root cause: The CCU's Java
DeviceDescription.childrenfield expectsString[](array), but some backends (notably VirtualDevices) sendCHILDRENas an empty string or omit it, causing the CCU's XML-RPC parser to crash withIllegalArgumentException: Can not set String[] field to String -
Fix: Added
_normalize_device_description()function that ensuresCHILDRENis always a list before sending to the CCU vialistDevicescallback -
Affected files:
aiohomematic/central/rpc_server.py: Added normalization for legacy XML-RPC serveraiohomematic/central/async_rpc_server.py: Added normalization for async XML-RPC server
-
Impact: VirtualDevices (heating groups) should now connect reliably on OpenCCU/RaspberryMatic systems
Version 2026.1.14 (2026-01-06)¶
What's Changed¶
Breaking Changes¶
-
Remove Retry Logic for RPC Operations (#2731): Completely removed the
@with_retrydecorator andRetryStrategyclass from the codebase -
Rationale: The retry mechanism (added in 2025.12.8) conflicted with the CircuitBreaker pattern, causing cascading failures. Each retry counted as a separate failure toward the circuit breaker threshold. On slow backends like VirtualDevices on Pi4/OpenCCU, this caused the circuit breaker to trip during initialization.
-
What was removed:
aiohomematic/retry.pymodule (RetryStrategy, with_retry, is_retryable_exception)@with_retrydecorator fromAioXmlRpcProxy,AioJsonRpcAioHttpClient, andHomematicAPIRETRY_*constants fromconst.py_RETRY_BYPASS_METHODSconstant fromrpc_proxy.py
-
Error handling preserved: The existing mechanisms are sufficient:
CircuitBreaker: Fast-fail on backend outage (per-proxy)CentralConnectionState: Aggregate health tracking (central)ClientStateMachine: Connection lifecycle (per-client)ConnectionRecoveryCoordinator: Automatic reconnection (central)
-
Impact: Network errors now fail immediately instead of retrying. This provides more predictable behavior and prevents retry-induced failures. The ConnectionRecoveryCoordinator handles reconnection at the appropriate connection level.
-
ADR: See ADR 0014 for detailed rationale
Version 2026.1.13 (2026-01-06)¶
What's Changed¶
Improvements¶
-
Add TypedDict for Device Details: Introduced
DeviceDetailandChannelDetailTypedDicts for type-safe handling of JSON-RPC device details response -
Provides static type checking via mypy
- Better IDE autocomplete support
-
Documents the data structure in code
-
Rename Backend Methods for Consistency: Renamed backend methods to follow consistent naming convention
fetch_device_details()→get_device_details()(returns data)fetch_all_device_data()→get_all_device_data()(returns data)- Convention:
get_*in BackendOperationsProtocol returns data,fetch_*in ClientProtocol fetches AND caches
Bug Fixes¶
- Fix InterfaceClient Not Loading Channel Names: The
fetch_device_details()method in InterfaceClient was not processing the nestedchannelsarray from the JSON-RPC response, causing channel names to be missing when using InterfaceClient instead of the legacy client
Version 2026.1.12 (2026-01-06)¶
What's Changed¶
Bug Fixes¶
-
Fix Device Cache Not Reloading After Firmware Update: The
updateDevicecallback now properly handles both firmware updates (hint=0) and link partner changes (hint=1) -
Root Cause: The
updateDevicecallback was a NO-OP that only logged the event. Thehintparameter (which indicates the type of update) was completely ignored - Problem: After a firmware update that changed a device's channel structure (e.g., HmIP-BRC2 removing channel 3), the cached descriptions still contained the old channel structure, causing errors like "Non-existent Channel 3". Link partner changes were also not propagated to the device model
- Fix:
- When
hint=0(firmware update), the handler now: - Removes cached device and paramset descriptions for the device
- Removes the Device object from the registry
- Fetches fresh device descriptions from the CCU
- Recreates the Device object with the new structure
- When
hint=1(link partner change), the handler now: - Refreshes link peer information for all channels of the device
- Triggers
LinkPeerChangedEventif link peers have changed
- When
- New Constant: Added
UpdateDeviceHintenum withFIRMWARE=0andLINKS=1values -
New Methods:
DeviceCoordinator.update_device(): Handles firmware update cache invalidationDeviceCoordinator.refresh_device_link_peers(): Handles link partner refresh
-
Implement Device Replacement Handler: The
replaceDevicecallback now properly handles CCU device replacement -
Use Case: When a broken device is replaced using the CCU's "Replace device" function, the CCU transfers configuration from the old to the new device and notifies listeners
- Previous Behavior: Was a NO-OP that only logged the event
- New Behavior:
- Removes the old device from registry and caches
- Fetches fresh device descriptions for the new device
- Creates the new Device object with all data points
-
New Method:
DeviceCoordinator.replace_device() -
Implement Re-Added Device Handler: The
readdedDevicecallback now properly handles device re-pairing -
Use Case: When a known device is put into learn-mode while installation mode is active (re-pairing), device parameters may have changed
- Previous Behavior: Was a NO-OP that only logged the event
- New Behavior:
- Removes cached descriptions to force refresh
- Fetches fresh device descriptions from the CCU
- Recreates the Device object with updated parameters
-
New Method:
DeviceCoordinator.readd_device() -
Fix Hub Entities Not Created When Secondary Clients Fail (#2718): System variables, programs, and other hub entities are now created even when secondary clients (e.g., CUxD) fail to initialize
-
Root Cause: The
fetch_program_data()andfetch_sysvar_data()methods checkedcentral.available, which returnsFalseif any client is unavailable - Symptom: When CUxD fails to connect, no programs or system variables appear in Home Assistant, showing "Entity no longer provided by integration"
- Fix: Changed availability checks to use
primary_client.availableinstead ofcentral.available, since hub data is only fetched from the primary client (HmIP-RF/BidCoS-RF) -
Affected files:
aiohomematic/model/hub/hub.py,aiohomematic/central/scheduler.py -
Fix Connection Recovery Port Detection for InterfaceClient: The
_get_client_port()method now correctly retrieves the port for both client implementations - Root Cause: The method only checked
client._config.interface_config.port(ClientCCU path), but InterfaceClient stores config directly inclient._interface_config.port - Symptom: Warning logged:
CONNECTION_RECOVERY: No port configured for <interface>, skipping TCP check - Fix: Added check for
_interface_configattribute first (InterfaceClient), then falls back to_config.interface_config(ClientCCU)
Version 2026.1.11 (2026-01-05)¶
What's Changed¶
New Features¶
-
New InterfaceClient with Backend Strategy Pattern: Introduced a unified client implementation that replaces the three legacy clients (ClientCCU, ClientJsonCCU, ClientHomegear)
-
Architecture: Single
InterfaceClientclass delegates transport operations to backend strategies (CcuBackend, JsonCcuBackend, HomegearBackend) - Benefits: Cleaner separation of concerns, easier maintenance, consistent behavior across all backend types
- Feature Flag: Enable via
OptionalSettings.USE_INTERFACE_CLIENTor environment variableAIOHOMEMATIC_USE_INTERFACE_CLIENT=1 - Status: Phase 2 complete - all business logic migrated, 24 comparison tests verify identical behavior to legacy clients
-
Documentation: See
docs/adr/0013-implementation-status.mdfor implementation details -
CI Tests Both Client Implementations: The CI pipeline now runs the full test suite (1640 tests) with both legacy client and InterfaceClient implementations
- Test infrastructure updated to support InterfaceClient's
__slots__architecture - Coverage threshold temporarily lowered to 80% (will be restored to 85% after legacy client cleanup)
Bug Fixes¶
-
Fix VirtualDevices Init Timeout Causing Client Failure: The
init()RPC method is now excluded from automatic retry logic -
Root Cause: In version 2025.12.8,
@with_retrywas added to XML-RPC requests, causinginit()failures to trigger 3 retry attempts before marking the client as FAILED - Problem: VirtualDevices interface on some CCUs doesn't respond to
init()within the timeout, but sends thelistDevicescallback correctly. The retry mechanism amplified single timeouts into complete client failure - Fix: Added
_RETRY_BYPASS_METHODSconstant excludinginitfrom retry logic. The client state machine handlesinitfailures via its own reconnection logic -
Impact: VirtualDevices (heating groups) connections are more resilient on slow-responding CCUs
-
Fix HmIP-MP3P LED Auto-Off After 10 Seconds: The sound player LED (
light.turn_on) now stays on permanently by default instead of turning off after 10 seconds -
Changed the default
on_timefrom10.0to0.0(permanently on) -
Previously, calling
light.turn_onwithout expliciton_timewould sendDURATION_VALUE: 10, causing the LED to turn off after 10 seconds even thoughON_TIME_LIST: PERMANENTLY_ONwas also sent -
Fix Device Availability Not Updating in Home Assistant: Entities on channels other than
:0now properly update their availability state whenUN_REACHorSTICKY_UN_REACHchanges -
Root Cause: When
UN_REACHchanged on channel:0, onlypublish_device_updated_event()was called. Entities subscribe to their own data point'ssubscribe_to_data_point_updated, not to device events - Problem: Entities on channels
:1,:2, etc. never received notification of availability changes and continued showing cached "available" state -
Fix: Now notifies all data points on the device via
publish_data_point_updated_event()when availability changes, similar toset_forced_availability() -
Fix InterfaceClient Ping-Pong Token Handling: The new InterfaceClient now correctly passes the ping-pong token through backend strategies
- Token is now passed from
InterfaceClient.ping()to the backend'sping()method - Ensures proper connection health monitoring with the new client implementation
Internal¶
-
Replace
supports_*Methods withcapabilitiesObject: Consolidated 10 booleansupports_*properties into a singleClientCapabilitiesdataclass -
Before:
client.supports_ping,client.supports_programs,client.supports_install_mode, etc. - After:
client.capabilities.supports_ping,client.capabilities.supports_programs, etc. - Capabilities are determined once at client creation based on backend type
- Removes ~300 lines of redundant property definitions across client classes
-
Both legacy clients and InterfaceClient now use the same capabilities system
-
InterfaceClient Feature Parity: Added missing methods to achieve full feature parity with legacy clients
- Added
is_callback_alive(),check_connection_availability(),execute_program(),set_system_variable(),get_system_variable(), and 8 other methods - InterfaceClient now implements all 45+ methods from the client protocol
Version 2026.1.10 (2026-01-04)¶
What's Changed¶
Bug Fixes¶
- Fix CUxD/CCU-Jack Recovery for JSON-RPC-only Interfaces: Connection recovery now properly handles JSON-RPC-only interfaces (CUxD, CCU-Jack)
- TCP Check: For interfaces without an XML-RPC port (port=0), the recovery now checks the JSON-RPC port (80/443) instead of failing immediately
- RPC Availability Check: JSON-RPC-only interfaces now use
check_connection_availability()(which callsInterface.isPresentvia JSON-RPC) instead of attempting XML-RPCsystem.listMethods - Previously, CUxD recovery would always fail at the TCP check stage because
_get_client_portreturnedNone - This caused the central to enter FAILED state after max retries even when the CUxD service was available
Version 2026.1.9 (2026-01-04)¶
What's Changed¶
Bug Fixes¶
-
Backend Detection Validates Interface Availability: The backend detection now verifies that each interface process is actually running via
is_present()check, not just installed -
Previously, interfaces like CUxD would be reported as "available" even when the daemon wasn't running
- This caused connection recovery loops and eventual "central failed" state when the integration tried to connect to non-running interfaces
- Now only interfaces that pass the
is_present()check are included in the detection result -
Added warning logs when installed interfaces are not running
-
Fix CUxD/CCU-Jack JSON-RPC Method Overrides:
ClientJsonCCUnow properly uses JSON-RPC for all device operations - Fixed
UnsupportedExceptionerrors forgetParamsetDescriptionand related methods - Added missing method overrides:
fetch_paramset_description,fetch_paramset_descriptions,get_paramset_descriptions,get_all_paramset_descriptions,get_all_device_descriptions,update_paramset_descriptions - These methods were previously delegating to the handler which used XML-RPC (not available for CUxD/CCU-Jack interfaces)
Improvements¶
- Dynamic Version Detection in Issue Analyzer: The GitHub Issue Analyzer bot now fetches current integration versions dynamically from GitHub Releases instead of using outdated hardcoded values
- Fixes incorrect "outdated version" warnings when users report issues with the latest version
- Supports automatic version detection for stable and pre-release versions
- No longer requires manual updates to the analyzer script when new versions are released
- If version information cannot be retrieved, no version-related comments are made
Version 2026.1.8 (2026-01-03)¶
What's Changed¶
Improvements¶
-
Reduce RPC Error Log Noise: Expected RPC errors during initial data loading no longer clutter the logs
-
Added
_XmlRpcFaultCodeenum documenting all Homematic XML-RPC error codes (-1 to -10) - Expected errors (Unknown Parameter, UNREACH, Unknown Device, etc.) now recorded with WARNING severity
- Incident Store always logs at DEBUG level - its purpose is recording, not active logging
- Active logging remains at the source (
log_boundary_error,@inspectordecorator) -
Eliminates duplicate logging between Incident Store and boundary error handlers
-
Increase Incident Store Capacity: Raised
INCIDENT_STORE_MAX_PER_TYPEfrom 20 to 50 for better diagnostics
Version 2026.1.7 (2026-01-03)¶
What's Changed¶
Bug Fixes¶
- Fix Runtime Device Addition: Fixed
KeyErrorwhen adding new devices during runtime after cache was loaded - Root cause:
ParamsetDescriptionRegistrylost its nesteddefaultdictstructure after loading from JSON - When a new device was added, accessing non-existent keys raised
KeyErrorinstead of creating empty dicts - Error manifested as:
UPDATE_CACHES_WITH_NEW_DEVICES failed: KeyError [device_address] - Fix rebuilds proper
defaultdictstructure in_process_loaded_content() - Added regression test for the scenario
Internal¶
-
Remove asyncio Fallbacks: Made
task_schedulera required parameter in core infrastructure classes -
EventBus,CircuitBreaker, andStoragenow require explicitTaskSchedulerProtocolinjection - Removes runtime asyncio event loop fallback code that was only used in tests
- Improves code clarity and ensures consistent dependency injection patterns
-
Test infrastructure updated with
_NoOpTaskSchedulerfor synchronous tests -
Remove Legacy Code: Removed
regular_to_default_dict_hookfromsupport.py - This function was used with
json.loads(object_hook=...)before Storage Abstraction Layer - No longer needed since
orjsondoesn't support object_hook parameter
Version 2026.1.6 (2026-01-03)¶
What's Changed¶
Bug Fixes¶
-
Fix CuXD/CCU-Jack Device Control:
ClientJsonCCUnow properly overridesset_valueandput_paramsetto use JSON-RPC -
Root cause: After handler refactoring (#2554),
DeviceHandlerused XML-RPC proxy for all value operations ClientJsonCCUusedNullRpcProxywhich threwUnsupportedExceptionfor all RPC calls- CuXD and CCU-Jack devices could not be controlled (set_value failed silently)
- Fix restores the JSON-RPC based value operations that worked in version 2025.11.7
-
Added tests to verify
ClientJsonCCUuses JSON-RPC forset_valueandput_paramset -
Fix Sysvar-to-Device Association: System variables with device references are now correctly associated with their devices/channels
- Root cause: After coordinator refactoring, hub initialization happened BEFORE device creation
identify_channel()found no channels because devices didn't exist yet during sysvar creation- Fix: Device creation now happens BEFORE hub initialization in
start_clients() - Sysvars containing channel/device rega_ids are now properly linked to their devices in Home Assistant
New Features¶
-
Circuit Breaker Incident Recording: Circuit breaker state changes are now recorded as incidents
-
CIRCUIT_BREAKER_TRIPPED(ERROR): When circuit breaker opens due to excessive failures CIRCUIT_BREAKER_RECOVERED(INFO): When circuit breaker recovers after successful test requests-
Incidents include comprehensive context: failure/success counts, thresholds, timestamps, total requests
-
CONNECTION_LOST Incident Recording: Connection loss events are now recorded as incidents
-
CONNECTION_LOST(ERROR): When connection to backend is lost - Recorded by
ConnectionRecoveryCoordinatorwhen handling connection loss events -
Context includes: reason, client state, circuit breaker state, recovery attempt count, active recoveries
-
CONNECTION_RESTORED Incident Recording: Connection restoration events are now recorded as incidents
-
CONNECTION_RESTORED(INFO): When connection to backend is successfully restored - Recorded by
ConnectionRecoveryCoordinatorafter successful recovery completion -
Context includes: total attempts, duration, stages completed, client state, circuit breaker state
-
RPC_ERROR Incident Recording: RPC call failures are now recorded as incidents
-
RPC_ERROR(ERROR): When an RPC call fails (SSL, OS, protocol, or general errors) - Recorded by both
AioXmlRpcProxy(XML-RPC) andAioJsonRpcAioHttpClient(JSON-RPC) - Context includes: protocol, method, error type, sanitized error message, TLS status
-
Supports all error types: SSLError, OSError, XMLRPCFault, ProtocolError, JSONRPCError, etc.
-
CALLBACK_TIMEOUT Incident Recording: Callback timeout events are now recorded as incidents
-
CALLBACK_TIMEOUT(WARNING): When no callback is received from backend within configured interval - Recorded by
ClientCCUwhen callback staleness is detected inis_callback_alive() -
Context includes: seconds since last event, configured threshold, last event time, client/circuit breaker state
-
Per-Type Incident Storage: IncidentStore now uses per-IncidentType storage limits
- Each incident type maintains its own history (max 20 per type, 7-day retention)
- Prevents high-frequency incidents from crowding out rare but important events
- Renamed
max_incidentstomax_per_typeparameter
Version 2026.1.5 (2026-01-02)¶
What's Changed¶
-
Add IncidentStore for Persistent Diagnostic Incidents: New storage system for tracking and persisting diagnostic incidents
-
Introduces
IncidentStoreinaiohomematic/store/persistent/incident.py - Implements save-on-incident, load-on-demand persistence strategy
- Stores incidents in
{storage_path}/cache/{central_name}_hm_incidents.json - Automatic cleanup of old incidents (default: 7 days retention)
-
Incidents are deleted when integration is removed via
cleanup_files() -
PingPong Tracker Incident Recording: Connection health issues are now recorded as incidents
-
PING_PONG_MISMATCH_HIGH(ERROR): When pending PONG count exceeds threshold PING_PONG_UNKNOWN_HIGH(WARNING): When unknown PONG count exceeds threshold- Incidents include context (counts, thresholds) and journal excerpts for debugging
-
Added
IncidentRecorderProtocolfor decoupled incident recording -
PingPong Diagnostics Journal: Enhanced diagnostic capabilities for connection monitoring
PingPongJournalring buffer tracks PING/PONG events with timestamps- RTT (round-trip time) statistics available via
get_rtt_statistics() - Journal excerpts attached to incidents for post-mortem analysis
Bug Fixes¶
-
Fix KeyError for PARENT in Device Descriptions: Use
.get()to safely access optionalPARENTfield -
Some device descriptions may not include the
PARENTkey -
Fixes
KeyError: 'PARENT'during device discovery -
Fix KeyError for CHILDREN in Device Descriptions: Use
.get()to safely access optionalCHILDRENfield - Affected files:
model/device.py,client/handlers/device_ops.py,store/persistent/device.py - Prevents
KeyError: 'CHILDREN'for devices without channel children
Version 2026.1.4 (2026-01-02)¶
What's Changed¶
Bug Fixes¶
-
Fix PingPong Unknown Issue Not Cleared: Unknown PONG mismatch issues are now properly cleared when conditions normalize
-
Previously, when unknown PONGs exceeded the threshold (15), a repair issue was created but never removed
- Now a reset event (
mismatch_count=0) is published when the count drops below the threshold -
Matches the existing behavior for pending PING mismatches
-
Fix OperatingVoltageLevel Shows Unknown After Restart (Issue #2674): Battery parameters now load from cache on startup
- Previously, parameters with
ignore_on_initial_load=True(e.g.,OPERATING_VOLTAGE,LOW_BAT) would remain "Unknown" after HA restart until the device was triggered - Now these parameters load from the persistent data cache while still skipping RPC calls to avoid waking battery devices
- Calculated data points like
OperatingVoltageLevelnow show their cached values immediately after restart
Version 2026.1.3 (2026-01-02)¶
What's Changed¶
Bug Fixes¶
-
Fix PingPong Race Condition: Register ping token in tracker before sending the ping request
-
Previously, the CCU could respond with PONG before the token was registered, causing false "unknown PONG" counts
-
Now the token is tracked before
await proxy.ping(), eliminating the race condition -
Fix Week Profile ScheduleCondition: Extended
ScheduleConditionenum with all 8 valid values -
Added:
FIXED_IF_BEFORE_ASTRO,ASTRO_IF_BEFORE_FIXED,FIXED_IF_AFTER_ASTRO,ASTRO_IF_AFTER_FIXED,EARLIEST_OF_FIXED_AND_ASTRO,LATEST_OF_FIXED_AND_ASTRO - Fixes
ValueError: 7 is not a valid ScheduleConditionon HmIP-BROLL blinds with astro-based schedules -
Added graceful fallback for unknown enum values in
AstroType,TimeBase, andScheduleCondition -
Fix ClientJsonCCU Handler Initialization:
ClientJsonCCU(used for CCU-Jack) now properly initializes handlers - Root cause:
init_client()only initialized handlers whensupports_rpc_callback=True, but CCU-Jack uses JSON-RPC exclusively - Added
NullRpcProxyclass - a lightweight proxy placeholder that doesn't create XML-RPC connections ClientJsonCCU.init_client()now usesNullRpcProxyto satisfy handler initialization without wasting resources- Fixes
AttributeError: 'ClientJsonCCU' object has no attribute '_device_ops_handler'
Version 2026.1.2 (2026-01-01)¶
What's Changed¶
Refactoring¶
-
Async DNS Resolution:
get_ip_addr()now uses asyncloop.getaddrinfo()instead of blockingsocket.gethostbyname() -
Eliminates need for executor thread pool for DNS lookups
-
Direct
awaitinstead ofasync_add_executor_job()wrapper -
Removed Dead Code: Removed unused
shrink_json_file()function fromsupport.py
Version 2026.1.1 (2026-01-01)¶
What's Changed¶
New Features¶
-
RPC Server Metrics: New
rpc_serversection in metrics aggregation -
Tracks incoming requests from CCU to the XML-RPC callback server
RpcServerMetricsdataclass with:total_requests,total_errors,active_tasks,avg_latency_ms,max_latency_ms- Computed properties:
error_rate,success_rate -
Available via
MetricsAggregator.rpc_serverand included inMetricsSnapshot -
Generic Metrics Serialization:
MetricsSnapshot.to_dict()method for JSON-serializable output -
Automatically converts all fields and computed
@propertyvalues - Handles datetime → ISO format, float → rounded to 2 decimals, nested dataclasses → recursive conversion
-
Eliminates manual field mapping in diagnostics code
-
Generic Health Serialization:
CentralHealth.to_dict()andConnectionHealth.to_dict()methods -
Same generic conversion as metrics: fields, properties, datetime, Enum → name
- Nested
client_healthdict with per-client status automatically converted -
Simplifies diagnostics and monitoring integration
-
Data Points by Category: New
ModelMetrics.data_points_by_categoryfield -
Counts all data points grouped by
DataPointCategory(SWITCH, SENSOR, CLIMATE, etc.) - Includes device data points, program data points, and sysvar data points
- Available via
MetricsAggregator.model.data_points_by_categoryand inMetricsSnapshot -
Replaces manual counting logic in diagnostics code
-
Complete Cache Metrics: Full cache statistics in
CacheMetrics - New
SizeOnlyStatsfor registries/trackers (size only, no hit/miss semantics) CacheStatsreserved for true caches with hit/miss/eviction tracking- Registries:
device_descriptions,paramset_descriptions,visibility_registry(size only) - Trackers:
ping_pong_tracker,command_tracker(size and evictions only) - True caches:
data_cache(size, hits, misses, evictions) - New
CacheProviderForMetricsProtocolfor centralized cache access
Bug Fixes¶
-
Race Condition in Device Creation: Fixed race condition between newDevices callback and startup code
-
Root cause: Startup code called
check_for_new_device_addresses()while callback was still populating cache - Device creation now happens inside semaphore in
_add_new_devices()to ensure all descriptions are cached first - New
check_and_create_devices_from_cache()method for atomic check-and-create with semaphore protection -
Startup code now uses atomic method to prevent racing with callbacks
-
Resilient Device Creation: Device creation no longer crashes when channel descriptions are missing
- New
DescriptionNotFoundExceptionfor specific error handling Device.__init__gracefully skips channels with missing descriptions and logs a warning- Device remains functional with available channels
Refactoring¶
- Semantic Class Naming: Renamed classes to better reflect their actual purpose
CommandCache→CommandTracker(tracks sent commands, no hit/miss semantics)PingPongCache→PingPongTracker(tracks connection health, not a cache)DeviceDescriptionCache→DeviceDescriptionRegistry(authoritative store, not a cache)ParamsetDescriptionCache→ParamsetDescriptionRegistry(authoritative store, not a cache)ParameterVisibilityCache→ParameterVisibilityRegistry(defines rules, memoization is implementation detail)last_value_send_cache→last_value_send_trackerproperty on clientsCacheNameenum reduced toDATAonly (the actual cache with hit/miss semantics)- New
TrackerStatisticsfor tracker-specific stats (evictions only, no hits/misses) - Removed
CacheStatisticsfromParameterVisibilityRegistry(deterministic rules don't need hit/miss tracking)
Version 2026.1.0 (2026-01-01)¶
What's Changed¶
New Features¶
-
Async XML-RPC Server (Experimental): New asyncio-native XML-RPC server using aiohttp
-
Enable via
OptionalSettings.ASYNC_RPC_SERVERinCentralConfig.optional_settings - Alternative to the thread-based XML-RPC server for receiving callbacks from Homematic backend
- Full support for
system.multicall(batched events from CCU) - Fire-and-forget pattern for event processing (immediate response to backend)
- Graceful shutdown with background task cancellation and 5s timeout
- Health-check endpoint (
GET /health) returning JSON with server status, request/error counts, active tasks - Metrics integration:
rpc_server.request,rpc_server.error,rpc_server.latency,rpc_server.active_tasks - Singleton pattern per (ip_addr, port) combination
- Comprehensive test coverage: 48 tests (41 unit, 4 integration, 3 stress)
- Performance validated: >1,000 req/s throughput, <500ms average multicall response
-
See ADR 0012 for design rationale and performance benchmarks
-
Storage Abstraction Layer: New unified storage system for all persistent data
-
StorageProtocolandStorageFactoryProtocolinterfaces for DuckTyping compatibility Storageclass with orjson serialization, atomic writes, ZIP loading, version migrations, delayed/debounced savesLocalStorageFactoryas default implementation for standalone usage- Enables Home Assistant to substitute its native Store via factory pattern
- All persistent caches (
DeviceDescriptionCache,ParamsetDescriptionCache,SessionRecorder) refactored to use Storage CentralConfig.storage_factoryfield for dependency injectioncleanup_files()method for deleting all storage files-
Configurable storage options:
raw_mode(no metadata wrapper),formatted(indented JSON),as_zip(ZIP compression) -
Device Definition Export: Single ZIP file export for device definitions
_DefinitionExporternow creates{model}.zipcontaining subdirectoriesdevice_descriptions/{model}.jsonandparamset_descriptions/{model}.jsoninside ZIP- Formatted JSON output with indentation for readability
Code Quality¶
- BasePersistentCache: New base class replacing
BasePersistentFilewith cleaner separation of concerns
Version 2025.12.55 (2025-12-30)¶
What's Changed¶
New Features¶
- Fixed Color Light API: Expose fixed color utilities as public API for Home Assistant integration
FixedColorenum (previously_FixedColor) - available color names (WHITE, RED, YELLOW, etc.)FIXED_COLOR_TO_HSmapping (previously_FIXED_COLOR_SWITCHER) - converts fixed colors to HS valueshs_color_to_fixed_converter()function (previously_convert_color()) - converts HS color to nearest fixed color
Code Quality¶
-
Package Structure Refactoring: Improved maintainability by splitting large
__init__.pyfiles -
client/__init__.py(1793 → 105 lines): Moved client classes to dedicated modulesclient/ccu.py:ClientCCU,ClientJsonCCU,ClientHomegear,ClientConfigclient/config.py:InterfaceConfig
model/hub/__init__.py(803 → 123 lines): Moved Hub class to dedicated modulemodel/hub/hub.py:Hub,ProgramDpType,MetricsDpType
- All public APIs remain unchanged (re-exported from
__init__.py) -
Fixed circular imports by using direct submodule imports in
metrics/aggregator.pyandclient/rpc_proxy.py -
Export Validation: New linter script for validating
__all__exports -
script/lint_all_exports.py: Validates exports are imported, grouped, and sorted -
Ensures consistency across all package
__init__.pyfiles -
Import Standardization: Enforce consistent package import conventions across the codebase
- External consumers (tests,
aiohomematic_test_support) must import public symbols from package__init__.pyfacades, not directly from submodules - Example:
from aiohomematic.interfaces import ChannelProtocolinstead offrom aiohomematic.interfaces.model import ChannelProtocol - Added
callback_backend_systemandcallback_eventdecorators toaiohomematic.centralpublic API - New pre-commit hook
lint-package-importsenforces these conventions - New linter script
script/lint_package_imports.pywith--allflag for checking internal imports
Version 2025.12.54 (2025-12-29)¶
What's Changed¶
Bug Fixes¶
-
ConnectionRecoveryCoordinator: Fixed JSON-RPC authentication failures during connection recovery
-
Added
clear_json_rpc_session()method toClientclass - Session is now cleared at recovery start to force re-authentication
-
Prevents "access denied" errors when CCU restarts and invalidates existing sessions
-
HubCoordinator: Fixed inbox data not being fetched during initialization
-
init_hub()now callsfetch_inbox_data(scheduled=False)alongside program/sysvar data - This ensures the inbox sensor is created at startup and HA receives the
HUB_REFRESHEDevent -
Previously, inbox data was only fetched by the scheduler after
sys_scan_interval -
EventCoordinator: Fixed
DEVICES_DELAYEDevent not being forwarded to integrations - Added
DeviceLifecycleEventType.DELAYEDto the enum - Added
interface_idfield toDeviceLifecycleEventfor repair issue context - Added handler in
publish_system_event()to emitDeviceLifecycleEventwithDELAYEDtype - This restores the repair issue flow for delayed device creation (broken since event migration in 2025.12.27)
New Features¶
- Unified Connection Recovery Coordinator: New event-driven coordinator handling all connection recovery
- Located in
aiohomematic/central/connection_recovery.py - Replaces
SelfHealingCoordinator,RecoveryCoordinator, andBackgroundSchedulerrecovery logic - Event-Driven Architecture: Subscribes to
ConnectionLostEventandCircuitBreakerTrippedEvent - Staged Recovery Process: TCP check → RPC check → Warmup → Stability check → Reconnect → Data load
- Retry Management: Exponential backoff with max 8 attempts, heartbeat retry in FAILED state
- Parallel Recovery: Throttled parallel recovery with semaphore (max 2 concurrent)
- New Recovery Events:
ConnectionLostEvent: Emitted when connection is lostRecoveryStageChangedEvent: Tracks recovery stage transitionsRecoveryAttemptedEvent: Records each recovery attemptRecoveryCompletedEvent: Emitted on successful recoveryRecoveryFailedEvent: Emitted when max retries reachedHeartbeatTimerFiredEvent: Triggers heartbeat retries in FAILED state
- New Enum:
RecoveryStagewith 12 stages (IDLE, DETECTING, COOLDOWN, TCP_CHECKING, etc.)
Internal Changes¶
- CentralUnit: Removed old
RecoveryCoordinator, added newConnectionRecoveryCoordinator - MetricsAggregator: Removed unused
recovery_coordinatorparameter - BackgroundScheduler: Refactored to detection-only architecture
_check_connectionnow only detects connection issues and emitsConnectionLostEvent- Removed
_handle_staged_reconnection,_load_data_with_retry, and related recovery methods (~350 LOC) - Removed
json_rpc_client_providerparameter (no longer needed) - All recovery logic now handled by
ConnectionRecoveryCoordinator - Removed deprecated files:
aiohomematic/central/self_healing.pyaiohomematic/central/recovery.pyaiohomematic/metrics/service.py- Removed deprecated exports from
aiohomematic.metrics:record_service_call,get_service_stats,clear_service_stats - BaseParameterDataPoint: Renamed
previous_valuetolast_non_default_valuewith changed semantics - Now stores only meaningful (non-default) values instead of the immediate previous value
- Enables "restore last brightness" feature for dimmers - stores last non-zero level
- Hub data points (sysvar, metrics, inbox) use separate caching for refresh/modify detection
- Event Naming Improvements: Renamed events for better clarity and self-documentation
BackendParameterEvent→RpcParameterReceivedEvent(raw parameter from RPC callback)DataPointUpdatedEvent→DataPointValueReceivedEvent(data point value received from backend)DataPointStatusUpdatedEvent→DataPointStatusReceivedEvent(status parameter received from backend)DataPointUpdatedCallbackEvent→DataPointStateChangedEvent(callback for state changes)SysvarUpdatedEvent→SysvarStateChangedEvent(system variable state changed)DeviceUpdatedEvent→DeviceStateChangedEvent(device state changed)FirmwareUpdatedEvent→FirmwareStateChangedEvent(firmware state changed)ConnectionStageEvent→ConnectionStageChangedEvent(connection stage changed)ConnectionHealthEvent→ConnectionHealthChangedEvent(connection health changed)HealthRecordEvent→HealthRecordedEvent(health status recorded)RecoveryAttemptEvent→RecoveryAttemptedEvent(recovery attempt completed)SystemStatusEvent→SystemStatusChangedEvent(system status changed)
Version 2025.12.53 (2025-12-28)¶
What's Changed¶
New Features¶
-
Event-Driven System Events: New events for comprehensive system observability
-
Connection Stage Events:
ConnectionStageChangedEventtracks reconnection progress through 5 stages (LOST → TCP_AVAILABLE → RPC_AVAILABLE → WARMUP → ESTABLISHED) - Connection Health Events:
ConnectionHealthChangedEventreports interface health status changes - Cache Invalidation Events:
CacheInvalidatedEventwithCacheTypeandCacheInvalidationReasonenums - Circuit Breaker Events:
CircuitBreakerStateChangedEventandCircuitBreakerTrippedEventfor state transitions - State Machine Events:
ClientStateChangedEventandCentralStateChangedEventfor state transitions - Data Refresh Events:
DataRefreshTriggeredEventandDataRefreshCompletedEventfor scheduler refresh operations - Program Events:
ProgramExecutedEventwhen programs are executed - Request Coalescer Events:
RequestCoalescedEventwhen requests are coalesced - Health Record Events:
HealthRecordedEventemitted by CircuitBreaker for success/failure tracking -
New Enums in
const.py:ConnectionStage,CacheType,CacheInvalidationReason -
Complete Event-Driven Metrics Architecture: Full migration to event-based metrics collection
-
New
aiohomematic/metrics/Module: Independent metrics module (moved fromcentral/)keys.py: Type-safe metric keys withMetricKeydataclass andMetricKeysfactoryevents.py: MetricEvent hierarchy (LatencyMetricEvent, CounterMetricEvent, GaugeMetricEvent, HealthMetricEvent)observer.py: MetricsObserver for event-driven aggregation with query APIemitter.py: Emission utilities (emit_latency, emit_counter, emit_gauge, emit_health)stats.py: Consolidated stats classes (CacheStats, LatencyStats, ServiceStats)
- Type-Safe Metric Keys: New
MetricKeydataclass withMetricKeysfactory for all known metrics- Pattern:
{component}.{metric}.{identifier}(e.g.,ping_pong.rtt.hmip_rf) - Factory methods:
MetricKeys.ping_pong_rtt(),cache_hit(),cache_miss(),client_health(),self_healing_*(), etc.
- Pattern:
- Component Migration to Emit-Only Pattern:
PingPongCache: Removed local_latency_stats, now emits viaMetricKeys.ping_pong_rtt()CentralDataCache: Removed local_stats, now emits viaMetricKeys.cache_hit/miss()CircuitBreaker: Emits counters viaMetricKeys.circuit_success/failure/rejection()@inspector: Emits latency/errors viaMetricKeys.service_call/error()(no more global registry)HealthTracker: Emits HealthMetricEvent viaMetricKeys.client_health()SelfHealingCoordinator: Emits counters viaMetricKeys.self_healing_trip/recovery/refresh_success/refresh_failure()
- MetricsAggregator Integration: Now queries MetricsObserver for latency and cache metrics
- Latency: Aggregates from
ping_pong.rtt.*pattern - Cache: Gets hit/miss counters from observer
- Latency: Aggregates from
-
EventMetrics.health_records: New counter tracking
HealthRecordedEventemissions from CircuitBreaker -
SelfHealingCoordinator: New coordinator for automatic recovery based on circuit breaker events
-
Located in
aiohomematic/central/self_healing.py - Subscribes to
CircuitBreakerTrippedEventandCircuitBreakerStateChangedEvent - Triggers data refresh when circuit breaker recovers (HALF_OPEN → CLOSED)
- Emits
SelfHealingTriggeredEventandSelfHealingDataRefreshEventfor observability -
New Metric Emissions: Emits counter metrics via
emit_counter():MetricKeys.self_healing_trip(): When circuit breaker tripsMetricKeys.self_healing_recovery(): When circuit breaker recoversMetricKeys.self_healing_refresh_success(): When data refresh succeedsMetricKeys.self_healing_refresh_failure(): When data refresh fails
-
Self-Healing Events: New events in
aiohomematic/metrics/events.py -
SelfHealingTriggeredEvent: Emitted when self-healing reacts to circuit breaker events (actions: "trip_logged", "recovery_initiated") SelfHealingDataRefreshEvent: Emitted after data refresh completes with success/failure status-
SELF_HEALING_EVENT_TYPEStuple for subscription convenience -
EventDrivenMockServer: New test infrastructure for event-driven test orchestration
-
Located in
aiohomematic_test_support/event_mock.py - Provides fluent API for configuring responses to events:
mock_server.when(event_type=SomeEvent).then_call(handler=...) - Supports filtering with
.matching(filter_fn=...)and one-shot responses with.once() - Supports chained event publishing with
.then_publish(event_factory=...) -
Tracks invocation counts for verification
-
Event-Driven Cache Invalidation: Decoupled device removal from cache management
-
DeviceRemovedEventnow includesdevice_address,interface_id, andchannel_addressesfor device-level removal CacheCoordinatorsubscribes toDeviceRemovedEventand invalidates caches automaticallyDeviceCoordinator.remove_device()no longer callsCacheCoordinator.remove_device_from_caches()directly-
Improved architecture: device lifecycle and cache management are now decoupled via EventBus
-
Event-Driven Test Verification Patterns: New test infrastructure demonstrating event-based testing
- Located in
tests/test_event_driven_verification.py - Section 3.1: Circuit breaker tests using events instead of internal state inspection
test_circuit_breaker_trips_emits_event: Verify trip viaCircuitBreakerTrippedEventtest_circuit_breaker_recovery_emits_state_change: Verify full recovery cycle via state change eventstest_half_open_failure_reopens_circuit_via_events: Verify re-trip behavior via events
- Section 3.2: Integration test patterns using events
test_event_sequence_verification: Verify event ordering withEventSequenceAssertiontest_data_refresh_events_integration: Verify refresh cycle viaDataRefreshTriggeredEvent/DataRefreshCompletedEventtest_no_events_assertion: Verify no events emitted usingassert_no_event()
- Section 3.3: Performance and timing tests using events
test_coalescing_effectiveness: Verify request coalescing viaRequestCoalescedEventtest_coalescing_with_different_keys: Verify no coalescing for different keystest_coalescing_reports_correct_interface: Verify correctinterface_idin events
Breaking Changes¶
CentralUnit.metricsnow returnsMetricsObserver(event-driven) instead ofMetricsAggregator(polling-based)- Use
central.metrics_aggregatorfor polling-based detailed diagnostics - Hub sensors parameter changed: Use
metrics_observer=instead ofmetrics_aggregator= - Import paths changed:
from aiohomematic.metrics import MetricsObserver, emit_latency, MetricKeys CentralDataCacherequiresevent_bus_provider: New mandatory parameter for event emissionCacheCoordinatorrequiresevent_bus_provider: New mandatory parameter passed to CentralDataCache- Removed
PingPongCache.latency_stats: Use MetricsObserver instead - Removed
CentralDataCache.stats: Use MetricsObserver counters instead (new.sizeproperty for entry count) CircuitBreakernow accepts optionalevent_bus: New optional parameter for metric event emission- Service registry removed:
record_service_call,get_service_stats,clear_service_stats(deprecated in 2025.12.53) removed; use MetricsObserver instead ClientStateMachinenow accepts optionalevent_bus: New optional parameter forClientStateChangedEventemissionRequestCoalescernow accepts optionalevent_busandinterface_id: New optional parameters forRequestCoalescedEventemissionClientCoordinatornow requiresevent_bus_provider: New mandatory parameter for subscribing toHealthRecordedEvent- Removed
HealthRecordCallbackProtocol: The callback-based health recording pattern is replaced by EventBus - Removed
health_record_callbackparameter: Removed fromClientConfig,ClientFactoryProtocol.create_client_instance(),BaseRpcProxy,AioXmlRpcProxy, andAioJsonRpcAioHttpClient CircuitBreakeremitsHealthRecordedEvent: Now publishes health status via EventBus instead of invoking a callback- Removed
CentralStateMachine.on_state_changecallback: Use EventBus subscription toCentralStateChangedEventinstead - Removed
ClientStateMachine.on_state_changecallback: Use EventBus subscription toClientStateChangedEventinstead - Removed
StateChangeCallbackProtocol: The callback protocol is no longer needed; use EventBus subscriptions DeviceRemovedEventsignature changed: Now includesdevice_address,interface_id,channel_addresseswith defaults for backward compatibilityCacheCoordinatornow subscribes toDeviceRemovedEvent: Callcache_coordinator.stop()to unsubscribe on shutdown
Test Improvements¶
- Migrate tests to use public API instead of internal state: Tests now use public properties and event-based verification
- Circuit Breaker: Using
event_capturefixture withCircuitBreakerStateChangedEventandCircuitBreakerTrippedEvent - Request Coalescer: Using
event_capturefixture withRequestCoalescedEventfor coalescing verification - Central Caches: Using
event_capturefixture withCacheInvalidatedEventfor cache clear verification - Client Coordinator: Using
has_clients,clients_started,primary_clientproperties - Event Coordinator: Using
event_busproperty andget_last_event_seen_for_interface()method - Background Scheduler: Using
is_active,devices_createdproperties - Cover Models: Removed redundant
_group_levelchecks wherecurrent_positionverifies the same behavior
Version 2025.12.52 (2025-12-27)¶
What's Changed¶
Bug Fixes¶
- Fix health score not reaching 100%: JSON-RPC client was using URL instead of interface_id for health tracking, causing
last_successful_requestto never be recorded. Now uses primary client's interface_id for proper health attribution. - Fix
HealthMetrics.last_event_timealways showing epoch: Thelast_event_timefield was never populated inMetricsAggregator.health. Now correctly aggregates the most recent event time across all clients. - Fix connection latency always showing 0.0 ms:
latency_trackeronly tracked paramset description requests which rarely executed. Now uses ping/pong round-trip time for accurate latency measurement viaPingPongCache.latency_stats. - Fix test mock returning
_Methodinstead ofCircuitBreakerMetrics: Added propercircuit_breakerproperty to_AioXmlRpcProxyFromSessionmock to return realCircuitBreakerinstance.
Version 2025.12.51 (2025-12-27)¶
What's Changed¶
New Features¶
- Add metrics hub sensors for Home Assistant: Three new hub sensors exposing key system metrics
- System Health (
HmSystemHealthSensor): Overall system health score (0-100%) - Connection Latency (
HmConnectionLatencySensor): Average RPC connection latency in ms - Last Event Age (
HmLastEventAgeSensor): Seconds since last backend event - Sensors are accessible via
hub.metrics_dps(returnsMetricsDpType) - Automatically initialized during
init_hub()and published viaHUB_REFRESHEDevent - Scheduled refresh every 60 seconds (configurable via
ScheduleTimerConfig.metrics_refresh_interval)
API Changes¶
- Added
MetricsProviderProtocolinterface for accessing theMetricsAggregator HubCoordinatornow requiresmetrics_providerparameter- New
Hubmethods:create_metrics_dps(),fetch_metrics_data(),init_metrics(),publish_metrics_refreshed()
Version 2025.12.50 (2025-12-27)¶
What's Changed¶
Code Quality¶
- Enforce keyword-only parameters for module-level functions: Extended
lint_kwonly.pyto enforce keyword-only parameters consistently across the codebase - Class methods:
*must come afterself/cls - Module-level functions:
*must come before the first argument - Fixed 109+ function signatures to comply with the new rules
- Added
# kwonly: disableannotations for callbacks, decorators, and voluptuous validators where positional args are required
Version 2025.12.49 (2025-12-27)¶
What's Changed¶
New Features¶
- Add MetricsAggregator for unified observability: New centralized metrics system providing a single access point for all runtime statistics
- Access via
CentralUnit.metricsproperty (DelegatedProperty pattern) snapshot()method returns immutableMetricsSnapshotwith all metrics at a point in time- 7 metric categories: RPC, Events, Cache, Health, Recovery, Model, Services
Metrics Categories¶
-
RPC Metrics (
RpcMetrics): -
success_rate,failure_rate,coalesce_rate,rejection_rate(percentages) avg_latency_ms,max_latency_msfrom RequestCoalescer-
Aggregated from all clients' circuit breakers and coalescers
-
Event Metrics (
EventMetrics): -
events_published,handlers_executed,handler_errors avg_handler_duration_ms,max_handler_duration_ms-
Handler duration tracking via
time.perf_counter()for high precision -
Cache Metrics (
CacheMetrics): -
overall_hit_rateacross all caches total_entriescount-
Per-cache
CacheStats: device_descriptions, paramset_descriptions, data_cache, command_cache, ping_pong_cache, visibility_cache -
Health Metrics (
HealthMetrics): -
clients_total,clients_healthy,clients_unhealthy availability_ratepercentage-
overall_health_scorefrom CentralHealthTracker -
Recovery Metrics (
RecoveryMetrics): -
attempts_total,successes,failures success_ratepercentage-
Placeholder for future RecoveryCoordinator integration
-
Model Metrics (
ModelMetrics): -
devices_count,channels_count,data_points_count -
hub_programs_count,hub_sysvars_count -
Service Metrics (
ServiceMetrics): total_calls,total_errors,avg_duration_ms,max_duration_msby_method: Per-method breakdown withServiceStats- Multi-Central isolation via global registry keyed by
(central_name, method_name) - Integrated with
@inspector(measure_performance=True)decorator
Internal¶
- EventBus: Add
HandlerStatsdataclass andget_handler_stats()method for handler execution tracking - EventBus: Track handler duration, execution count, and error count in
_safe_call_handler() - RequestCoalescer: Add
LatencyStatsdataclass withrecord()andreset()methods - RequestCoalescer: Track latency (min, max, avg, count, total) during request execution
- CentralDataCache: Add
CacheStatstracking (hits, misses, size) viastatsproperty - DeviceHandler: Expose
paramset_description_coalescerproperty for metrics access - @inspector decorator: Record service call metrics when
measure_performance=True - Extracts
central_namefromcontext_obj._central_info.name - Records duration and error status to global registry
- Thread-safe via
threading.Lock - Documentation: Update architecture review with metrics implementation status
Tests¶
- Add
tests/test_metrics.pywith 38 tests covering all metric dataclasses, service stats, and integration
Version 2025.12.48 (2025-12-26)¶
What's Changed¶
Bug Fixes¶
- Fix HmIP-WRCD display not updating: Replace poorly documented COMBINED_PARAMETER with individual data point calls for reliable display updates
- Fix HmIP-WRCD sound not playing: Sound parameters (INTERVAL, REPETITIONS) now correctly sent via put_paramset
- Fix conversion error for empty numeric values: Handle empty strings from CCU for FLOAT/INTEGER parameters gracefully (e.g., LEVEL_2 for devices without slats)
- Fix
CustomDpCover.is_closedreturn type: Change frombool | Nonetobool(method always returns bool) - Fix cover/dimmer
is_validreturning False after restart: TreatUNKNOWNstatus as valid foris_validcheck (GitHub Issue #2630) - When CCU sends
*_STATUS = UNKNOWNduring startup, entities now correctly report valid state - Previously,
is_validreturned False, causing Home Assistant to use stale cached values
Improvements¶
- HmIP-WRCD: Rewrite
send_text()to use individual data points instead of COMBINED_PARAMETER - Uses put_paramset with all display parameters for atomic updates
- DISPLAY_DATA_COMMIT=True triggers the display update at the end
- More reliable and easier to debug
- HmIP-WRCD: Extend
display_idrange from 1-3 to 1-5 (device supports 5 display lines) - HmIP-WRCD: Add
intervalparameter toTextDisplayArgsfor controlling sound tone intervals (1-15) - HmIP-WRCD: Expose
burst_limit_warningproperty and log warning insend_text()when active - HmIP-WRCD: Support
repeat=-1for INFINITE_REPETITIONS - HmIP-MP3P: Change
repetitionsparameter from string to int for simpler API 0= no repetition,1-14= repetition count,-1= infinite- Automatic conversion to device VALUE_LIST strings (REPETITIONS_XXX format)
- HmIP-MP3P: Remove
available_repetitionsproperty (no longer needed with int-based API)
Internal¶
- ProfileConfig: Add
fixed_channel_fields/visible_fixed_channel_fieldstoChannelGroupConfig - Allows defining fields with absolute channel numbers (not rebased relative to group_no)
- Useful for device-wide parameters on channel 0
- ProfileConfig: Rename
repeating_fields→fields,visible_repeating_fields→visible_fieldsfor clarity - ProfileConfig: Rename
RebasedChannelGroup→RebasedChannelGroupConfigfor consistency - ProfileConfig: Add comprehensive documentation for relative vs absolute channel numbers
- IP_TEXT_DISPLAY: Add new fields to profile config (DISPLAY_DATA_COMMIT, DISPLAY_DATA_ID, DISPLAY_DATA_STRING, INTERVAL)
- Visibility Rules: Un-ignore DISPLAY_DATA_COMMIT, DISPLAY_DATA_ID, DISPLAY_DATA_STRING, INTERVAL for HmIP-WRCD
Version 2025.12.47 (2025-12-25)¶
What's Changed¶
New Features¶
- Add HmIP-MP3P (Combined signal generator) support: Implement sound player and LED control for combination signaling devices
- Sound Player (
CustomDpSoundPlayerin siren.py, channel 2):- Inherits from
BaseCustomDpSirenfor siren integration play_sound()method with volume, soundfile, duration, repetitions, ramp time parametersstop_sound()method to stop playback_convert_soundfile_index()helper for integer-to-soundfile-name conversion (1-189)- Exposes available options via
DelegatedPropertyfrom ActionSelect VALUE_LISTs
- Inherits from
- LED Control (
CustomDpSoundPlayerLedin light.py, channel 6):- Inherits from
CustomDpDimmerfor dimmer integration set_led()method with color, brightness, on_time, duration, repetitions parametersturn_off()method to turn off LED- Exposes available colors, on times, repetitions via
DelegatedProperty
- Inherits from
- New
DeviceProfile.IP_SOUND_PLAYERandDeviceProfile.IP_SOUND_PLAYER_LEDprofiles - Category-specific translation keys for validation messages
Version 2025.12.46 (2025-12-25)¶
What's Changed¶
New Features¶
- Add HmIP-WRCD (Wall-mount Remote Control with Display) support: Implement
CustomDpTextDisplaycustom data point for devices with LCD displays - New
DataPointCategory.TEXT_DISPLAYandDeviceProfile.IP_TEXT_DISPLAY send_text()method to display text with configurable icon, colors, alignment, and optional sound- Expose display parameters as ActionSelects:
DISPLAY_DATA_ICON,DISPLAY_DATA_BACKGROUND_COLOR,DISPLAY_DATA_TEXT_COLOR,DISPLAY_DATA_ALIGNMENT,ACOUSTIC_NOTIFICATION_SELECTION - Uses
COMBINED_PARAMETERformat for efficient multi-parameter updates
Version 2025.12.45 (2025-12-24)¶
What's Changed¶
Improvements¶
-
Restructure store package into organized sub-packages: Split monolithic cache files into focused modules
-
New
store/persistent/package: Base class, device cache, paramset cache, session recorder - New
store/dynamic/package: Command cache, device details, central data, ping-pong cache - New
store/visibility/package: Visibility rules, parser, and cache - New
store/types.py: Shared type definitions (CachedCommand,PongTracker, type aliases) -
New
store/serialization.py:freeze_params/unfreeze_paramsutilities for session recording -
Add typed cache entries for better type safety:
-
CachedCommanddataclass replacestuple[Any, datetime]inCommandCache PongTrackerdataclass withtokens,seen_at,loggedfields forPingPongCache-
Type aliases:
InterfaceParamsetMap,ChannelParamsetMap,ParamsetMap,ParameterMap -
Reduce code duplication in
PingPongCache: -
Single
_cleanup_tracker()method replaces duplicate_cleanup_pending_pongs()and_cleanup_unknown_pongs() -
PongTracker.contains()method for token membership checks -
Refactor
ParameterVisibilityCachefor improved clarity and maintainability: Major restructuring of the visibility module -
Extract static visibility rules to new
visibility_rules.pymodule (~300 lines of constants) - Add typed cache keys using
NamedTuple(IgnoreCacheKey,UnIgnoreCacheKey) for better type safety - Add
UnIgnoreEntrydataclass for parsed configuration entries - Replace nested
defaultdictstructures with dedicatedChannelParamsetRulesandModelRulesclasses - Refactor
_get_un_ignore_line_detailsfrom 75+ lines of string splits to regex-basedparse_un_ignore_linefunction withParsedUnIgnoreLineresult type - Add
invalidate_all_caches()method for complete cache reset -
Improve code organization with clear section separators and better method grouping
-
Enhance
sort_class_members.pyfor property assignments: Improved handling of property-like class attributes -
Support
DelegatedPropertywithast.AnnAssign(annotated assignments likename: Final = DelegatedProperty[...]()) - Sort
_GenericPropertyassignments to the end of classes (ensures referenced methods are already defined) -
Added
GENERIC_PROPERTYgroup constant for proper ordering -
Add DP006 validation to lint-delegated-property: Reports when
DelegatedProperty(cached=True)is used without the required_cached_{property_name}slot
Version 2025.12.44 (2025-12-23)¶
What's Changed¶
Improvements¶
-
Add Context Variables pattern for request tracking and tracing: Implement
contextvars-based context propagation for async call chains -
RequestContextdataclass with request ID, operation, device address, and timing request_contextcontext manager for scoped context settingContextualLoggerAdapterfor automatic request ID prefixing in log messagesRequestContextFilterfor structured logging with context fieldsSpanandspancontext manager for performance tracing with parent-child relationships- Automatic context propagation through async call chains
-
42 tests covering all context functionality
-
Add DP004/DP005 validation to lint-delegated-property: The linter now validates property paths and cache slots
-
DP004 error: Reports when
DelegatedPropertypath references an attribute not defined in__slots__,__init__, class-level assignments, or@property - DP005 error: Reports when
@hm_property(cached=True)is used on a slotted class without the required_cached_{property_name}slot - Enhanced AST visitor to detect
DelegatedPropertyin annotated assignments (e.g.,name: Final = DelegatedProperty[...]) - Enhanced AST visitor to detect
@hm_property(cached=True)and similar decorators - Tracks class-level plain assignments (e.g.,
_enabled_default = True) -
Validates path resolution and cache slots across class inheritance hierarchy
-
Replace
IN_SERVICE_VARwithRequestContext: Unified service call tracking through the new context variables pattern -
Removed standalone
IN_SERVICE_VAR: ContextVar[bool]in favor ofRequestContext - Added
is_in_service()helper that checks foroperation.startswith("service:") @inspectordecorator now createsRequestContext(operation="service:{func_name}")for service calls@bind_collectordecorator uses the same pattern for consistent context propagation-
Breaking:
IN_SERVICE_VARis no longer exported fromaiohomematic.context -
Add
CentralConfigBuilderfor fluent configuration: Implement Builder Pattern forCentralConfigwith step-by-step configuration and validation -
CentralConfigBuilderclass with fluent method chaining (.with_name(),.with_host(),.add_hmip_interface(), etc.) - Factory presets:
CentralConfigBuilder.for_ccu()andCentralConfigBuilder.for_homegear() - Early validation via
.validate()method returning list ofValidationError - Automatic interface port resolution based on TLS settings
-
36 tests covering all builder functionality
-
Introduce singledispatch pattern for type converters: Added extensible type conversion using Python's
functools.singledispatch -
New
to_homematic_value()converter: Python types → Homematic-compatible values (bool→int, float→rounded, datetime→ISO, timedelta→seconds, Enum→value, list/dict→recursive) - New
from_homematic_value()converter: Homematic values → Python types with optional target_type hints - Refactored
_get_text_value()in property_decorators.py to use singledispatch -
Both converters are extensible via
@converter.register(YourType) -
Make data point protocols generic for improved type safety: Protocols now preserve generic type information for mypy
-
BaseParameterDataPointProtocol[ParameterT]- properties likedefault,max,min,previous_value,valuenow returnParameterTinstead ofAny GenericDataPointProtocol[ParameterT]- extends base protocol with typed value handling-
Added type aliases for heterogeneous collections:
BaseParameterDataPointProtocolAny,GenericDataPointProtocolAny,GenericEventProtocolAny -
Fix property decorators to preserve generic type information for mypy: The
valueproperty on data points now correctly infers types (e.g.,DpSwitch.value→bool | None,DpSensor[float].value→float | None) -
Changed
BaseParameterDataPoint.valuefrom@state_propertydecorator to explicit_GenericPropertyconstruction withkind=Kind.STATE - Added
__get__overloads to_GenericPropertyfor proper type inference - Exported
Kindand_GenericPropertyfromproperty_decorators.py -
Subclasses override
_get_value()method for custom value reading logic -
Refactor
CustomDataPointto useDataPointFielddescriptor: Declarative field definitions replace imperative_init_data_point_fields() -
DataPointFieldnow uses keyword-only__init__parameters - Eliminated
_init_data_point_fields()method fromCustomDataPointbase class - Applied
DataPointFieldpattern to all custom data point classes (climate, cover, light, lock, siren, switch, valve) -
Subclasses use
_post_init()for additional initialization after field resolution -
Add
CalculatedDataPointFielddescriptor for calculated data points: Mirrors theDataPointFielddescriptor pattern from custom data points -
New file
aiohomematic/model/calculated/field.pywithCalculatedDataPointFielddescriptor - Changed
CalculatedDataPoint._data_pointsfromlisttodictfor O(1) lookup by(parameter, paramset_key)key - Added
_resolve_data_point()method for lazy data point resolution with subscription handling - Added
fallback_parameterssupport for trying alternative parameters (e.g.,TEMPERATURE→ACTUAL_TEMPERATURE) - Added
use_device_fallbacksupport for trying device address (channel 0) if not found on current channel -
Refactored
BaseClimateSensor,ApparentTemperature, andOperatingVoltageLevelto use declarative field descriptors -
Optimize field descriptors: Removed unused
_attr_nameslot and__set_name__method fromDataPointFieldandCalculatedDataPointField -
Require explicit cache slots for cached properties: Removed
WeakKeyDictionaryfallback from both@hm_property(cached=True)andDelegatedProperty(cached=True)in favor of explicit slot definitions -
Both decorators now validate at class-definition time that
_cached_{property_name}exists in__slots__ TypeErroris raised immediately when class is defined if cache slot is missing (not at runtime)- Added cache slots to
Channel(_cached_group_master,_cached_group_no,_cached_is_in_multi_group) - Added cache slot to
CalculatedDataPoint(_cached_dpk) - DP005 linter rule validates cache slots exist (see lint-delegated-property changes above)
-
Breaking: Classes that previously relied on
WeakKeyDictionaryfallback must add explicit slots -
Add
DelegatedPropertydescriptor: New descriptor for delegating property access to nested attribute paths - Supports
kind(config/info/state/simple) for categorization viaget_hm_property_by_kind() - Supports
cached=Truefor per-instance caching of delegated values (requires explicit_cached_{name}slot) - Supports
log_context=Truefor structured logging - Migrated 266 simple delegation properties across the codebase to use
DelegatedProperty - Note: Cannot be used when subclasses override with
@propertydue to mypy limitations
Version 2025.12.43 (2025-12-22)¶
What's Changed¶
Improvements¶
- Make
ACOUSTIC_ALARM_SELECTIONandOPTICAL_ALARM_SELECTIONvisible: These siren parameters are now exposed as entities - Enhance
siren.turn_onservice: Now uses values fromACOUSTIC_ALARM_SELECTIONandOPTICAL_ALARM_SELECTIONentities as fallback when not provided in service call DpActionSelectvalue setter useswrite_value: Keeps history clean and fires update events when value is set
Version 2025.12.42 (2025-12-21)¶
What's Changed¶
New Features¶
- Introduce
DpActionSelectdata point type: New category for write-only ENUM parameters with VALUE_LIST - Provides a
valuegetter to read the current selection (unlikeDpActionwhich is write-only) - Automatically created by factory for write-only parameters with VALUE_LIST
- New category:
DataPointCategory.ACTION_SELECT - Located in
aiohomematic/model/generic/action_select.py
Bug Fixes¶
-
Fix custom data point type annotations: Verified all custom data point types against pydevccu paramset descriptions
-
cover.py: Changed
_dp_sectionfromDpSensor[str | None]toDpSensor[int | None](SECTION is INTEGER 0-15, not STRING) -
Update custom data points to use
DpActionSelect: Parameters with VALUE_LIST now correctly useDpActionSelectinstead ofDpAction - siren.py:
ACOUSTIC_ALARM_SELECTION,OPTICAL_ALARM_SELECTION,DURATION_UNIT,SMOKE_DETECTOR_COMMAND - lock.py:
LOCK_TARGET_LEVEL - light.py:
ON_TIME_UNIT,EFFECT,RAMP_TIME_TO_OFF_UNIT,RAMP_TIME_UNIT - cover.py:
DOOR_COMMAND
Documentation¶
- Fix documentation accuracy across all
docs/*.mdfiles: Updated stale references after recent refactoring - Fixed directory references:
caches/→store/ - Fixed file references:
xml_rpc_server.py→rpc_server.py,xml_rpc.py→rpc_proxy.py - Fixed class names:
XmlRpcProxy→AioXmlRpcProxy - Removed non-existent event types:
BackendSystemEventData,HomematicEvent,InterfaceEvent,CentralStateChangedEvent,ClientStateChangedEvent - Added correct event types from
event_bus.pyandintegration_events.py - Fixed method signatures in examples to use keyword-only arguments
- Updated
docs/unignore.mdpath reference - Updated
docs/homematicip_local_api_usage.mdevent references - Add documentation maintenance instructions to CLAUDE.md: New section for verifying
docs/*.mdaccuracy after refactoring
Version 2025.12.41 (2025-12-20)¶
What's Changed¶
Breaking Changes¶
- Rename
EventTypetoDeviceTriggerEventType: Clearer naming for device trigger events EventType→DeviceTriggerEventTypeinaiohomematic.const- Affects:
DEVICE_ERROR,IMPULSE,KEYPRESSevent types - Update imports:
from aiohomematic.const import DeviceTriggerEventType
Bug Fixes¶
- Fix
update_statusto accept integer values from backend: Backend sends integer indices for STATUS parameters update_statusnow accepts bothint(backend index) andstr(enum value)- Integer indices are converted to strings using the cached VALUE_LIST from the status parameter's paramset description
- This ensures correct mapping regardless of
ParameterStatusenum order DataPointStatusReceivedEvent.status_valuetype isint | str
Version 2025.12.40 (2025-12-20)¶
What's Changed¶
Bug Fixes¶
- Change
ParameterStatusfromIntEnumtoStrEnum: Align enum with actual HmIP parameter values - All
*_STATUSENUM parameters (LEVEL_STATUS, ACTUAL_TEMPERATURE_STATUS, etc.) use string-based VALUE_LISTs - Values:
NORMAL,UNKNOWN,OVERFLOW,UNDERFLOW,ERROR,INVALID,UNUSED DataPointStatusReceivedEvent.status_valuetype changed tostr
Version 2025.12.38 (2025-12-20)¶
What's Changed¶
Bug Fixes¶
- Fix ENUM parameter handling for HmIP devices: Properly detect and handle string-based ENUMs vs index-based ENUMs
- Root cause: HM devices use integer MIN/MAX/DEFAULT for ENUMs (send as index), while HmIP devices use string MIN/MAX/DEFAULT (send as string value)
- Added
_enum_value_is_indexdetection based onisinstance(MIN, int)inBaseParameterDataPoint - Updated
DpActionandDpSelectto send string values for HmIP devices - Affects all ENUM parameters on HmIP devices including:
- Time units:
RAMP_TIME_UNIT,DURATION_UNIT,ON_TIME_UNIT(now "S", "M", "H" instead of 0, 1, 2) - Lock commands:
LOCK_TARGET_LEVEL(now "LOCKED", "UNLOCKED", "OPEN") - Garage commands:
DOOR_COMMAND(now "OPEN", "CLOSE", "STOP", "PARTIAL_OPEN") - Siren alarms:
ACOUSTIC_ALARM_SELECTION,OPTICAL_ALARM_SELECTION,SMOKE_DETECTOR_COMMAND - Light effects:
COLOR,COLOR_BEHAVIOUR
- Time units:
- Resolves issues with HmIP-RGBW, HmIP-LSC, HmIP-BSL, HmIP-DRG-DALI, HmIPW-WRC6, and other HmIP devices
Version 2025.12.37 (2025-12-19)¶
What's Changed¶
Improvements¶
- Recovery now uses actual client failure reasons:
RecoveryCoordinatornow queries client state machines for actual failure reasons instead of usingFailureReason.UNKNOWNfor all degraded interfaces - XML-RPC server binding failure now includes failure reason: OSError during XML-RPC server startup now passes
FailureReason.INTERNAL
Version 2025.12.36 (2025-12-19)¶
What's Changed¶
New Features¶
- Add
degraded_interfacestracking for DEGRADED state: Show which interfaces are degraded and why - New
degraded_interfacesproperty onCentralStateMachine:Mapping[str, FailureReason] - New
degraded_interfacesfield onSystemStatusChangedEventfor integration consumption - Updated
transition_to()method withdegraded_interfacesparameter - Log output now shows interface-specific failure reasons:
[interfaces: HmIP-RF=network, BidCos-RF=auth] - Integration benefit: Home Assistant can now show detailed status per interface in DEGRADED state
- See
docs/migrations/failure_reason_migration_2025_12.mdfor usage examples
Improvements¶
- Recovery max-retries now propagates failure info: When recovery fails after max retries, the FAILED transition now includes
failure_reasonandfailure_interface_id
Version 2025.12.35 (2025-12-19)¶
What's Changed¶
Improvements¶
- Complete
FailureReasonpropagation from client to central: Fix failure reason not being propagated when client creation fails ClientCoordinatornow trackslast_failure_reasonandlast_failure_interface_idfrom failed client creation attempts- Central state machine now receives failure info when transitioning to FAILED state
- Added
ClientStateMachineProtocolfor type-safe access to client state machine properties - Added
state_machineproperty toClientProtocolfor accessing client state machine - Before: Log showed
[reason=none]even for authentication failures - After: Log correctly shows
[reason=auth]for authentication failures,[reason=network]for network issues, etc. - Updated migration documentation with full propagation path
Version 2025.12.34 (2025-12-19)¶
What's Changed¶
New Features¶
- Add
FailureReasonsupport for state machines: Enable differentiation between failure types when Central or Client enters FAILED state - New
FailureReasonenum with values:NONE,AUTH,NETWORK,INTERNAL,TIMEOUT,CIRCUIT_BREAKER,UNKNOWN - Extended
ClientStateMachinewithfailure_reason,failure_messageproperties - Extended
CentralStateMachinewithfailure_reason,failure_message,failure_interface_idproperties - Extended
SystemStatusChangedEventwithfailure_reasonandfailure_interface_idfields - New helper function
exception_to_failure_reason()for mapping exceptions to failure reasons - Integration benefit: Home Assistant can now show specific error messages (e.g., "Check your credentials" for auth failures vs "Check network connection" for network errors)
- See
docs/migrations/failure_reason_migration_2025_12.mdfor migration guide
Version 2025.12.33 (2025-12-17)¶
What's Changed¶
Breaking Changes¶
- Consolidate scheduler intervals in
ScheduleTimerConfig: Centralized all scheduler-related intervals and timeouts - Introduced new
ScheduleTimerConfigclass (similar toTimeoutConfig) - Moved from
CentralConfig:periodic_refresh_interval(default: 15s)sys_scan_interval(default: 30s)
- Moved from
TimeoutConfig:connection_checker_interval(default: 15s)
- Added to
ScheduleTimerConfig:device_firmware_check_interval(default: 6h)device_firmware_delivering_check_interval(default: 1h)device_firmware_updating_check_interval(default: 5m)system_update_check_interval(default: 4h)system_update_progress_check_interval(default: 30s)system_update_progress_timeout(default: 30min)
Improvements¶
- Refactor
get_system_update_info.fnscript: Simplified and optimized firmware update check script - Simplified version parsing using shell pipeline (
grep | tr | cut) - Streamlined exit code handling (exit codes: 0 = no update, 1 = update available, >4 = error/script unavailable)
- Simplified available version extraction from checkFirmwareUpdate.sh output
- Removed complex validation logic while maintaining functionality
- Co-Authored-By: @Baxxy13
Version 2025.12.32 (2025-12-16)¶
What's Changed¶
Breaking Changes¶
- Refactor Simple Schedule Format: Complete overhaul of simple schedule data structures used by climate thermostats
- Old format: Tuple-based
(base_temperature, [periods])withScheduleSlotTypeenum keys - New format: TypedDict-based with lowercase string keys (e.g.,
"starttime","endtime","temperature") - Replaces:
CLIMATE_SIMPLE_WEEKDAY_DATA→SimpleWeekdayScheduleTypedDictCLIMATE_SIMPLE_PROFILE_DICT→SimpleProfileScheduletype aliasCLIMATE_SIMPLE_SCHEDULE_DICT→SimpleScheduleDicttype alias
- New TypedDict class:
SimpleSchedulePeriodfor individual schedule periods - Benefits:
- ✅ Full JSON serialization support (enables Home Assistant custom cards)
- ✅ Better type safety with TypedDict
- ✅ Cleaner, more intuitive API with string keys
- ✅ Reduced memory overhead (no enum objects)
- Migration required: See
docs/migrations/simple_schedule_migration_2025_12.mdfor step-by-step guide - Updated method signatures:
ClimateWeekProfile.get_schedule_simple_weekday()returnsSimpleWeekdayScheduleClimateWeekProfile.set_simple_weekday()acceptsSimpleWeekdayScheduleClimateWeekProfile.get_schedule_simple_profile()returnsSimpleProfileScheduleCustomDpClimate.set_simple_schedule_weekday()acceptsSimpleWeekdaySchedule
Improvements¶
-
Add
ScheduleSlotTypedDict: Improve type safety for normal schedule format -
New TypedDict class with
endtime: strandtemperature: floatfields -
Provides IDE autocomplete and better type checking for schedule slot access
-
Rename schedule type aliases: Consistent naming with Simple Schedule types
CLIMATE_WEEKDAY_DICT→ClimateWeekdaySchedule(nowdict[int, ScheduleSlot])CLIMATE_PROFILE_DICT→ClimateProfileScheduleCLIMATE_SCHEDULE_DICT→ClimateScheduleDict- Breaking change: Downstream code using these type aliases must update imports
Documentation¶
- Create comprehensive migration guide:
docs/migrations/simple_schedule_migration_2025_12.md - Includes before/after code examples
- Search-and-replace patterns for automated migration
- JSON serialization examples
- Detailed API change documentation
Version 2025.12.31 (2025-12-16)¶
What's Changed¶
Improvements (aiohomematic_test_support)¶
- Fix patch cleanup in test factories: Patches created in
FactoryWithClient.get_default_central()are now explicitly stored and stopped during cleanup instead of relying onpatch.stopall(). Ensures proper resource cleanup and prevents patch state leakage between tests. - Improve exception handling in mock creation: Replace bare
except Exception: passwith specific exception handling and debug logging inget_mock(). Now logsAttributeErrorandTypeErrorwhen methods cannot be copied to mock instances, improving debuggability. - Add cleanup methods to SessionPlayer: New class methods for session data management:
clear_all()- Clear all cached session dataclear_file(file_id)- Clear data for specific file IDget_loaded_file_ids()- List currently loaded file IDsget_memory_usage()- Return approximate memory usage of cached data- Extract ADDRESS_DEVICE_TRANSLATION to JSON: Device address-to-filename mappings (362 entries) now loaded from
data/device_translation.jsoninstead of hardcoded dict. Reduces maintenance burden and allows easy updates without code changes. Fallback to hardcoded dict maintained for backwards compatibility.
Documentation (aiohomematic_test_support)¶
- Create detailed improvement analysis:
docs/test_support_improvements.md- Comprehensive review of test support package identifying 10 issues and optimization opportunities with priority matrix - Create executable implementation plan:
docs/test_support_implementation_plan.md- Step-by-step guide with exact file paths and code blocks for implementing high-priority fixes
Version 2025.12.30 (2025-12-16)¶
What's Changed¶
Breaking Changes¶
- Rename Protocol classes to follow
-Protocolsuffix convention: StateChangeCallback→StateChangeCallbackProtocolHealthRecordCallback→HealthRecordCallbackProtocolSyncEventHandler→SyncEventHandlerProtocolAsyncEventHandler→AsyncEventHandlerProtocol- Refactor
is_validproperty on data points: is_validnow combines temporal and status validity (is_refreshed and is_status_valid)- Previous
is_validbehavior (temporal check only) moved to newis_refreshedproperty - Consumers relying on
is_validfor temporal-only check should migrate tois_refreshed
New Features¶
- Add STATUS parameter support for data points:
- New
ParameterStatusenum with values:NORMAL,UNKNOWN,OVERFLOW,UNDERFLOW,ERROR,INVALID,UNUSED - New
DataPointStatusReceivedEventfor STATUS parameter events BaseParameterDataPointnow automatically detects paired*_STATUSparameters (e.g.,LEVEL_STATUSforLEVEL)- New properties on data points:
status,status_dpk,status_parameter,has_status_parameter - New
is_refreshedproperty: Returns if data point has received a value - New
is_status_validproperty: Returns if STATUS is NORMAL or no STATUS parameter exists - Updated
is_validproperty: Combined check (is_refreshed and is_status_valid) - STATUS events are automatically routed to the main parameter's data point
- Callbacks are only triggered when status actually changes (not on refresh)
- Add
has_parameter()method toParamsetDescriptionProviderProtocolandParamsetDescriptionCache
Bug Fixes¶
- Fix typo in enum name:
CalulatedParameter→CalculatedParameter
Improvements¶
- Document intentional camelCase exceptions for RPC callbacks in CLAUDE.md
- Improve type safety by replacing
*argsand**kwargswith TypedDict: - Create
StateChangeArgsTypedDict with all entity-specific parameters (on/off, brightness, position, climate-specific, cover-specific) - Create
SystemEventArgsTypedDict for flexible system event argument handling - Replace
**kwargs: Anywith**kwargs: Unpack[StateChangeArgs]in allis_state_change()methods across custom data point classes - Remove
**kwargsfrompublish_data_point_updated_event()- now accepts no arguments for cleaner event handling - Replace climate callback
**kwargs: Anywith explicitcustom_id: str | None = Noneparameter
Version 2025.12.29 (2025-12-15)¶
What's Changed¶
Bug Fixes¶
- Fix event publication
Version 2025.12.28 (2025-12-14)¶
What's Changed¶
Bug Fixes¶
- Fix central incorrectly transitioning to RUNNING during startup with empty client list:
all()returns True for empty iterables, causing premature RUNNING state before clients are registered - Fix central incorrectly transitioning to DEGRADED when all clients are connected: Missing
not all_connectedcheck instart()method allowed transition to DEGRADED even when all clients were CONNECTED - Fix scheduler not starting when central is in DEGRADED state: Now starts when central is operational (RUNNING or DEGRADED)
- Fix HealthTracker not tracking clients: Clients were never registered with the health tracker after creation, causing
update_client_health()to be a no-op. Now clients are properly registered duringstart()and unregistered duringstop()
Improvements¶
-
Enhance state transition logging:
-
DEGRADED state now shows which clients are not connected (e.g., "clients not connected: Otto-Dev-929-BidCos-RF")
- Client state machine now includes reason in log messages (e.g., "proxy initialized", "connection check failed")
- Important client transitions (CONNECTED, DISCONNECTED, FAILED) now log at INFO level
-
Scheduler waiting message now shows current state
-
Automatic health data updates:
- Events received from backend now automatically update
last_event_receivedin health tracker - RPC request success/failure automatically tracked via circuit breaker callbacks
- Health tracker now provides accurate
can_receive_events,consecutive_failures,last_successful_request,last_failed_requestmetrics
Version 2025.12.27 (2025-12-14)¶
What's Changed¶
Bug Fixes¶
- Fix firmware data not updating after refresh: Device descriptions cache was not being updated for existing devices during
refresh_firmware_data()calls (both ad-hoc service calls and periodic checks). The cache update was skipped because the code incorrectly returned early when no "new" devices were found, even though existing device descriptions needed updating.
Version 2025.12.26 (2025-12-14)¶
What's Changed¶
Breaking Changes¶
- Replace 9 legacy events with 4 focused integration events:
- Remove
SystemEventTypeData- replaced byDeviceLifecycleEventandDataPointsCreatedEvent - Remove
CallbackStateChangedEvent- replaced bySystemStatusChangedEvent.callback_state - Remove
CentralStateChangedEvent- replaced bySystemStatusChangedEvent.central_state - Remove
ClientStateChangedEvent- replaced bySystemStatusChangedEvent.client_state - Remove
ConnectionStateChangedEvent- replaced bySystemStatusChangedEvent.connection_state - Remove
DeviceAvailabilityChangedEvent- replaced byDeviceLifecycleEvent.availability_changes - Remove
FetchDataFailedEvent- replaced bySystemStatusChangedEvent.issues - Remove
HomematicEvent- replaced byDeviceTriggerEvent - Remove
PingPongMismatchEvent- replaced bySystemStatusChangedEvent.issues
New Features¶
- Add
SystemStatusChangedEvent- aggregated event for all infrastructure and lifecycle state changes central_state: CentralState | None- central unit state changesconnection_state: tuple[str, bool] | None- connection state (interface_id, connected)client_state: tuple[str, ClientState, ClientState] | None- client state (interface_id, old, new)callback_state: tuple[str, bool] | None- callback server state (interface_id, alive)issues: tuple[IntegrationIssue, ...]- issues for user notification- Add
DeviceLifecycleEvent- aggregated event for device lifecycle and availability event_type: DeviceLifecycleEventType- CREATED, UPDATED, REMOVED, AVAILABILITY_CHANGEDdevice_addresses: tuple[str, ...]- affected device addressesavailability_changes: tuple[tuple[str, bool], ...]- availability changesincludes_virtual_remotes: bool- whether virtual remotes are included- Add
DataPointsCreatedEvent- event for new data points (entity discovery) new_data_points: tuple[tuple[DataPointCategory, tuple[BaseDataPoint, ...]], ...]- Add
DeviceTriggerEvent- event for device triggers (button press, sensor trigger) interface_id: str- interface identifierchannel_address: str- device address (not channel address)parameter: str- parameter name (e.g., PRESS_SHORT)value: str | int | float | bool- event value- Add
IntegrationIssuedataclass for user-facing issues with severity, issue_id, translation_key - Add
DeviceLifecycleEventTypeenum with CREATED, UPDATED, REMOVED, AVAILABILITY_CHANGED values
Migration Guide¶
See docs/migrations/event_migration_2025_12.md for detailed migration instructions.
Version 2025.12.25 (2025-12-13)¶
What's Changed¶
Breaking Changes¶
- Remove
InterfaceEventclass andInterfaceEventTypeenum - replaced with typed events - Remove
EventType.INTERFACEandEventType.DEVICE_AVAILABILITYenum values - Remove
publish_interface_eventmethod fromCentralUnitandEventCoordinator - Remove
InterfaceEventPublisherprotocol from interfaces - Remove
INTERFACE_EVENT_SCHEMAfrom schemas - Remove delegation methods from
CentralUnit- use coordinators directly: - Remove
get_device()- usecentral.device_coordinator.get_device()instead - Remove
get_channel()- usecentral.device_coordinator.get_channel()instead - Remove
get_virtual_remotes()- usecentral.device_coordinator.get_virtual_remotes()instead - Remove
remove_device()- useawait central.device_coordinator.remove_device()instead - Remove
CentralUnitStateenum - useCentralStateinstead: - Removed legacy
_stateattribute fromCentralUnit- all state now managed by state machine - Removed
central_stateproperty - usestateproperty instead (returnsCentralStatefrom state machine) CentralUnitState.NEW→CentralState.STARTINGCentralUnitState.INITIALIZING→CentralState.INITIALIZINGCentralUnitState.RUNNING→CentralState.RUNNINGCentralUnitState.STOPPED→CentralState.STOPPEDCentralUnitState.STOPPED_BY_ERROR→CentralState.FAILEDCentralUnitState.STOPPINGstate removed (no intermediate stopping state)- Change
BackgroundScheduler.__init__()signature - now requiresfirmware_data_refresherparameter - Change
CentralUnitStateProvider.stateproperty type fromCentralUnitStatetoCentralState - Change
CentralInfoprotocol - renamedcentral_stateproperty tostate(returnsCentralState) - Change
CentralHealthProtocol- renamedcentral_stateproperty tostate(returnsCentralState) - Change
ClientDependenciesprotocol - renamedcentral_stateproperty tostate(returnsCentralState)
New Features¶
- Add
FetchDataFailedEvent- typed event for data fetch failures (replacesInterfaceEventType.FETCH_DATA) - Add
PingPongMismatchEvent- typed event for ping/pong mismatches withPingPongMismatchTypeenum (PENDING,UNKNOWN) - Add
DeviceAvailabilityChangedEvent- typed event for device availability changes (replacesEventType.DEVICE_AVAILABILITY) - Add
PingPongMismatchTypeenum withPENDINGandUNKNOWNvalues
Enhancements¶
- Consolidate state management in
CentralUnit-stateproperty now directly delegates to state machine - Separate
FirmwareDataRefresherprotocol fromDeviceDataRefresherprotocol for clearer separation of concerns - Implement
FirmwareDataRefresherinDeviceCoordinatorinstead ofCentralUnit - Direct coordinator access pattern improves code clarity and reduces unnecessary delegation
-
Unified protocol property naming - all protocols now use
stateinstead of mixedcentral_state/state -
Replace fixed cool-down with staged reconnection for faster recovery after CCU restart:
- Stage 0: Initial cool-down (
reconnect_initial_cooldown, default 10s) - Stage 1: Non-invasive TCP port check (no CCU load, bypasses firewall ICMP blocks)
- Stage 2: First
system.listMethodscheck (verify RPC is responding) - Stage 3: Warmup delay (
reconnect_warmup_delay, default 10s) - Stage 4: Second
system.listMethodscheck (confirm services stable) - Stage 5: Full reconnection with proxy recreation
- New
TimeoutConfigoptions: reconnect_initial_cooldown: Initial wait before checks (default 10s)reconnect_tcp_check_timeout: Max time for TCP checks (default 60s)reconnect_tcp_check_interval: TCP check interval (default 5s)reconnect_warmup_delay: Warmup delay after first RPC check (default 10s)
Version 2025.12.24 (2025-12-12)¶
What's Changed¶
Bug Fixes¶
- Fix "ResponseNotReady" errors after CCU reconnection by recreating proxy objects with fresh HTTP transport after successful PROXY_INIT
- Add configurable cool-down period (
reconnect_cooldown_delay, default 60s) after connection loss - all communication including pings is suspended during cool-down to allow CCU time to fully restart
Version 2025.12.23 (2025-12-12)¶
What's Changed¶
Breaking Changes¶
- New Central State Machine architecture for improved reconnection reliability
- Introduces
CentralStateenum with states: STARTING, INITIALIZING, RUNNING, DEGRADED, RECOVERING, FAILED, STOPPED - Central is RUNNING only when ALL clients are CONNECTED
- DEGRADED state when at least one client is not connected
- FAILED state after max retries (8 attempts) with heartbeat retry every 60 seconds
- New protocol interfaces:
CentralStateMachineProtocol,CentralHealthProtocol,HealthTrackerProtocol
New Features¶
- Add
CentralStateMachineclass for orchestrating overall system state (central/state_machine.py) - Add
ConnectionHealthandCentralHealthclasses for unified health tracking (central/health.py) - Add
RecoveryCoordinatorfor coordinated client recovery with max retry tracking (central/recovery.py) - Add
CentralStateChangedEventto EventBus for monitoring state transitions - Add
ClientStateChangedEventto EventBus for monitoring client state changes - Add
stateproperty toClientConnectionProtocolprotocol for accessing current client state - Add health score calculation (0.0-1.0) based on state machine, circuit breakers, and activity
- Add exponential backoff for recovery retries (5s base, up to 60s max)
- Add multi-stage data load verification in recovery process
- New test suite for central state machine architecture (33 tests)
Bug Fixes¶
- Fix entities not marked unavailable after failed proxy initialization - devices now correctly show unavailable during CCU restart/recovery
Version 2025.12.22 (2025-12-12)¶
What's Changed¶
Enhancements¶
- Improve CCU reconnection behavior with exponential backoff (2s initial, doubles up to 120s max)
- Add configurable
TimeoutConfiginCentralConfigfor connection/reconnect timing settings
Bug Fixes¶
- Fix data loading after partial reconnect - load data for available interfaces immediately instead of waiting for all
- Fix premature data loading - verify both state machine and actual connection before loading; retry up to 8 times with circuit breaker reset between attempts
- Fix client reconnect logic - use state machine check to prevent skipping reconnect when connection is lost
- Fix state machine allowing recovery from
FAILEDstate via reconnect attempts - Fix JSON-RPC session renewal after CCU restart -
AuthFailurenow triggers fresh login - Fix race condition in scheduler client iteration with snapshot
Version 2025.12.21 (2025-12-11)¶
What's Changed¶
Enhancements¶
- Circuit breakers automatically reset after successful reconnect to allow immediate data refresh
- Add
reset_circuit_breakers()method toClientConnectionProtocolprotocol
Bug Fixes¶
- Fix entities remaining unavailable after CCU reconnect - circuit breakers now reset automatically, allowing immediate data refresh instead of waiting for slow recovery
Version 2025.12.20 (2025-12-11)¶
What's Changed¶
Enhancements¶
- Add BackupData dataclass with filename and content for backup downloads
- Backup filename now includes hostname and CCU version (e.g.,
Otto-3.83.6.20251025-2025-12-10-1937.sbk) create_backup_and_download()now returnsBackupData | Noneinstead ofbytes | None- Add firmware update support for OpenCCU via
checkFirmwareUpdate.sh - Add
HmUpdatehub entity for system firmware updates (OpenCCU only) - Add
get_system_update_info()method to check for available firmware updates - Add
trigger_firmware_update()method to initiate firmware update with automatic reboot (runs with nohup) - Add
SystemUpdateDatadataclass withcheck_script_availablefield to verify script availability - Add progress tracking for hub firmware updates:
- New
in_progressproperty onHmUpdateto track update status - Automatic polling every 30 seconds during update to detect completion
- Progress detection via firmware version change
- 30-minute timeout with graceful cleanup
- Events published on progress state changes for Home Assistant integration
Architecture¶
- Migrate
CentralConnectionStatecallbacks to unified EventBus pattern: - Add
ConnectionStateChangedEventfor connection state changes (connected/disconnected) - Add
EventBus.publish_sync()method for synchronous event publishing from non-async code - Rename
StateChangeCallbacktoStateChangeCallbackProtocoland removeregister_state_change_callback()method - Add
event_busproperty toClientDependenciesprotocol - All connection state notifications now use the same EventBus as other events
- EventBus now uses TaskScheduler (Looper) for proper task lifecycle management:
publish_sync()uses TaskScheduler when available for task tracking, shutdown handling, and exception logging- Falls back to raw asyncio when no TaskScheduler is provided (e.g., in tests)
Developer Tools¶
- Enhance
check_i18n_catalogs.pyto detect unused translation keys: - Add detection of translation keys in
strings.jsonthat are not used in the codebase - Add
--remove-unusedflag to automatically remove unused keys from all catalog files - Unused keys are reported as warnings (non-blocking) to avoid disrupting commits
- Current statistics: 185 total keys, 181 used (97.8%), 4 unused (2.2%)
- Add comprehensive i18n management documentation at
docs/i18n_management.md
Bug Fixes¶
- Fix excessive ERROR logging during CCU restart/reconnect - connection errors now log ERROR only on first occurrence, DEBUG for subsequent failures (fixes inverted logic in
CentralConnectionState.add_issue()usage) - Fix PING_PONG false alarm mismatch events during CCU restart - PINGs sent during downtime are no longer tracked when connection is known to be down, and cache is cleared on reconnect
- Scheduler now pauses non-essential jobs during connection issues - only
_check_connectioncontinues to run during CCU downtime, preventing unnecessary RPC calls and log spam - Reduce INFO-level log noise during reconnection - circuit breaker successful recovery transitions (half_open → closed) now log at DEBUG level instead of INFO
Notes¶
- Firmware update features are only available on OpenCCU systems where
/bin/checkFirmwareUpdate.shis present - Backup before firmware update should be done via
create_backup_and_download()in Home Assistant before triggering the update
Version 2025.12.19 (2025-12-10)¶
What's Changed¶
Architecture¶
- Add combined sub-protocol interfaces to reduce coupling:
- Client Combined Protocols (3): ValueAndParamsetOperations, DeviceDiscoveryWithIdentityProtocol, DeviceDiscoveryAndMetadataProtocol
- Device Combined Protocols (1): DeviceRemovalInfo
- Components now depend on minimal protocol combinations instead of full composite protocols
- Refactor components to use combined sub-protocols:
- CacheCoordinator.remove_device_from_caches uses DeviceRemovalInfo instead of DeviceProtocol
- DeviceCoordinator.refresh_device_descriptions_and_create_missing_devices uses DeviceDiscoveryWithIdentityProtocol
- DeviceCoordinator._rename_new_device uses DeviceDiscoveryAndMetadataProtocol
- CallParameterCollector uses ValueAndParamsetOperations instead of ClientProtocol
- DeviceDetailsCache.remove_device uses DeviceRemovalInfo instead of DeviceProtocol
- DeviceDescriptionCache.remove_device uses DeviceRemovalInfo instead of DeviceProtocol
- ParamsetDescriptionCache.remove_device uses DeviceRemovalInfo instead of DeviceProtocol
- Split ClientProtocol (85 members) into 14 focused sub-protocols following Interface Segregation Principle:
- Core Protocols (4): ClientIdentityProtocol, ClientConnectionProtocol, ClientLifecycleProtocol, ClientCapabilitiesProtocol
- Handler-Based Protocols (9): DeviceDiscoveryOperationsProtocol, ParamsetOperationsProtocol, ValueOperationsProtocol, LinkOperationsProtocol, FirmwareOperationsProtocol, SystemVariableOperationsProtocol, ProgramOperationsProtocol, BackupOperationsProtocol, MetadataOperationsProtocol
- Support Protocol (1): ClientSupportProtocol (utility methods and caches)
- Handler classes explicitly inherit their sub-protocols for compile-time type checking
- Add CentralProtocol composite protocol combining 29 sub-protocols:
- CentralUnit now inherits from CentralProtocol (+ PayloadMixin, LogContextMixin)
- Provides single protocol for complete central unit access
- Maintains ability to depend on specific sub-protocols for better decoupling
- Add CircuitBreaker integration to JSON-RPC client (AioJsonRpcAioHttpClient):
- Prevents retry-storms during backend outages for JSON-RPC calls
- Consistent resilience pattern across both XML-RPC and JSON-RPC clients
- Session management methods (login/logout/renew) bypass circuit breaker
- Add RequestCoalescer for get_device_description in DeviceOperationsHandler:
- Deduplicates concurrent requests for the same device address
- Reduces backend load during device discovery
- Add explicit protocol inheritance to coordinators:
- EventCoordinator now inherits from EventBusProvider, EventPublisher, LastEventTrackerProtocol, InterfaceEventPublisher
- HubCoordinator now inherits from HubDataFetcher, HubDataPointManager
- Improves type safety and removes type: ignore comments
Documentation¶
- Update architecture_analysis.md with comprehensive evaluation:
- Accurate metrics: 43,218 LOC across 102 files, 63 protocol interfaces
- Detailed module breakdown (central, client, model, interfaces, store)
- New sections for CircuitBreaker, RequestCoalescer, and Handler patterns
- Architecture maturity assessment with ratings
- ADR reference table with all 8 decisions
Version 2025.12.18 (2025-12-10)¶
What's Changed¶
Architecture¶
- Refactor ClientCCU into specialized handler classes (BackupHandler, DeviceOpsHandler, FirmwareHandler, LinkManagementHandler, MetadataHandler, ProgramsHandler, SysvarsHandler)
- Add ClientStateMachine for managing client connection lifecycle with validated state transitions
- Add ClientState enum for client connection states (CREATED, INITIALIZING, INITIALIZED, CONNECTING, CONNECTED, DISCONNECTED, RECONNECTING, STOPPING, STOPPED, FAILED)
- Split DeviceProtocol (72 members) into 10 focused sub-protocols following Interface Segregation Principle:
- DeviceIdentityProtocol, DeviceChannelAccessProtocol, DeviceAvailabilityProtocol, DeviceFirmwareProtocol
- DeviceLinkManagementProtocol, DeviceGroupManagementProtocol, DeviceConfigurationProtocol
- DeviceWeekProfileProtocol, DeviceProvidersProtocol, DeviceLifecycleProtocol
- Split ChannelProtocol (39 members) into 6 focused sub-protocols:
- ChannelIdentityProtocol, ChannelDataPointAccessProtocol, ChannelGroupingProtocol
- ChannelMetadataProtocol, ChannelLinkManagementProtocol, ChannelLifecycleProtocol
- Add EventPriority enum with four priority levels (CRITICAL, HIGH, NORMAL, LOW) for handler ordering
- Add EventBatch context manager for efficient batch event publishing
- Add publish_batch() method to EventBus for optimized bulk event publishing
- Add CircuitBreaker for preventing retry-storms during backend outages:
- Three-state machine (CLOSED → OPEN → HALF_OPEN → CLOSED)
- Configurable failure threshold, recovery timeout, and success threshold
- Integrated with CentralConnectionState for coordinated health tracking
- Metrics tracking for failures, successes, and rejections
- Add RequestCoalescer for efficient RPC call deduplication:
- Merges identical concurrent requests into a single backend call
- Particularly beneficial during device discovery (getParamsetDescription calls)
- Includes metrics for monitoring coalesce rate effectiveness
Bug Fixes¶
- Fix hub data points initialization by ensuring clients are connected before init_hub() is called
- Fix mock property delegation to support dynamic property value updates in tests
- Add __slots__ support to get_mock() in test support module
Documentation¶
- Add comprehensive inline comments for complex algorithms across the codebase:
- State machine valid transitions diagram and state descriptions
- Event publishing batching and subscription reference counting
- bind_collector decorator context variable pattern
- Cache eviction strategies (LRU, TTL, lazy cleanup)
- SessionRecorder nested dict structure and purge algorithm
- freeze/unfreeze parameter transformation for cache keys
- EventBus dual-key handler lookup and polymorphic handler detection
- Device discovery set difference algorithm and PARENT address fallback
- DeviceProfileRegistry hierarchical model matching (exact → prefix)
- Add migration guide for protocol sub-protocols (docs/migrations/protocol_subprotocols_2025_12.md)
- Refactor architecture.md: Move inline decisions to ADRs, reduce from ~450 to ~245 lines
- Add ADR 0007: Device Slots Reduction via Composition (Rejected)
- Add ADR 0008: TaskGroup Migration (Deferred)
Version 2025.12.17 (2025-12-09)¶
What's Changed¶
- Fix return types
Version 2025.12.16 (2025-12-09)¶
What's Changed¶
Concurrency and Thread-Safety¶
- Add asyncio.Lock for thread-safe task management in InstallModeDpSensor
- Replace bool state flags with asyncio.Event in BackgroundScheduler for thread-safety
- Fix list-modification-during-iteration bug in climate.py subscription cleanup
- Add asyncio.Lock to DeviceRegistry for thread-safe device operations
Memory Leak Prevention¶
- Add auto-cleanup of EventBus subscriptions when devices/data points are removed
- Add clear_subscriptions_by_key() method to EventBus for key-based cleanup
Error Handling¶
- Add exception logging for scheduler jobs, background tasks, and install mode loops
Architecture and Dependency Injection¶
- Add RpcServerCentralProtocol and RpcServerTaskSchedulerProtocol protocols
- Refactor RpcServer to use protocol interfaces instead of direct CentralUnit dependency
- Introduce _CentralEntry container class for decoupled central/looper storage
- Add HubFetchOperations base protocol for consolidated hub data fetching
- Consolidate UnsubscribeCallback definition in type_aliases.py
- Add ClientDependencies composite protocol for decoupled client architecture
- Refactor ClientConfig and ClientCCU to use ClientDependencies instead of CentralUnit
Other changes¶
- Add basic rega script linter to ensure support for session recorder
- Add architecture analysis
- Cleanup scripts for recorder
- Improve backend detection
Version 2025.12.15 (2025-12-08)¶
What's Changed¶
- Revert get_serial.fn &error removal
Version 2025.12.14 (2025-12-08)¶
What's Changed¶
- Cleanup ReGa scripts
- Eliminate CDPD dictionary format with pure ProfileConfig implementation
- Refactor CCU backup
Version 2025.12.13 (2025-12-07)¶
What's Changed¶
- Add is_service param to inspector
- Add inspector to load_data_point_value
- Mark service methods with external/internal scope usage
- Add scan_aiohomematic_calls.py script to find external method calls
Version 2025.12.12 (2025-12-07)¶
What's Changed¶
- Fix retry
Version 2025.12.11 (2025-12-07)¶
What's Changed¶
- Cleanup of legacy code in custom entity definition
Version 2025.12.10 (2025-12-07)¶
What's Changed¶
- Add DeviceProfileRegistry as central registry for device-to-profile mappings
- Add type-safe DeviceConfig and ExtendedDeviceConfig dataclasses
- Add ProfileConfig and ChannelGroupConfig dataclasses for profile definitions
- Migrate all 117 device models to DeviceProfileRegistry
- Remove legacy ALL_DEVICES and ALL_BLACKLISTED_DEVICES dictionaries
- Remove make_* factory functions from entity modules
- Simplify get_custom_configs() to use only DeviceProfileRegistry
- Move schemas to schemas.py
Version 2025.12.9 (2025-12-06)¶
What's Changed¶
- Add TimerUnitMixin for light timer unit conversion
- Refactor valve.py to use StateChangeTimerMixin and GroupStateMixin
- Refactor light.py to use TimerUnitMixin for IP light classes
- Remove unused DirectionStateMixin from mixins.py
- Update imports to use specific protocol submodules
Version 2025.12.8 (2025-12-06)¶
What's Changed¶
Architecture and Internals¶
- Split interfaces.py into interfaces/ package for better maintainability
- Add DataPointTypeResolver class for extensible data point type mapping
- Add shared mixins for custom entities (model/custom/mixins.py)
- Refactor switch.py to use StateChangeTimerMixin and GroupStateMixin
- Refactor cover.py to use PositionMixin for position calculations
- Refactor light.py to use StateChangeTimerMixin and BrightnessMixin
Reliability and Error Handling¶
- Add login rate limiting with exponential backoff for JSON-RPC client
- Add error message sanitization helpers (sanitize_error_message, RpcContext.fmt_sanitized)
- Add retry module with RetryStrategy class for transient network errors
- Improve CentralConnectionState
- Add resource limits for internal collections
High-Level API (HomematicAPI)¶
- Add HomematicAPI facade class with simplified high-level interface
- Add CentralConfig.for_ccu() and CentralConfig.for_homegear() factory methods
- Add async context manager support for HomematicAPI
- Add
@with_retrydecorator to HomematicAPI operations for automatic retry
CLI Enhancements (hmcli)¶
- Add subcommand-based CLI structure with device discovery commands
- Add
list-devicescommand to list all devices - Add
list-channels <device>command to list channels of a device - Add
list-parameters <channel>command to list parameters of a channel - Add
device-info <address>command to show detailed device information - Add
getandsetsubcommands for parameter operations - Add
interactivesubcommand for REPL mode with command history and tab completion - Add shell completion script generation for bash, zsh, and fish shells
- Add
--generate-completion <shell>option to generate completion scripts
Documentation¶
- Add getting_started.md documentation with quick start examples
- Add common_operations.md documenting top 15 most-used operations
Version 2025.12.7 (2025-12-05)¶
What's Changed¶
- Add helper for config support
Version 2025.12.6 (2025-12-04)¶
What's Changed¶
- Add ENERGY_COUNTER_FEED_IN
- Fix backend detection
- Fix install mode for HmIP
- Improved delayed device handling
- Refactor add_new_devices_manually to address names
Version 2025.12.5 (2025-12-03)¶
What's Changed¶
- Add install mode virtual data points with countdown timer (HUB_BUTTON + HUB_SENSOR)
- Support separate install mode data points per interface (HmIP-RF and BidCos-RF)
- Add JSON-RPC methods for HmIP install mode (getInstallMode, setInstallModeHmIP)
- Add init_install_mode, fetch_install_mode_data, publish_install_mode_refreshed to Hub/HubCoordinator/CentralUnit
- Add mandatory interface parameter to get_install_mode/set_install_mode on CentralUnit
- Extend ClientCoordinator.get_client to accept optional interface parameter
- Add ClientProvider to Hub for multi-interface install mode support
- Fix install mode data point creation to check for client availability per interface
- Fix install mode unique_id generation to avoid duplicate prefix
- Mark setInstallMode/setInstallModeHmIP as optional JSON-RPC methods
Version 2025.12.4 (2025-12-02)¶
What's Changed¶
- Add rename for new devices
Version 2025.12.3 (2025-12-02)¶
What's Changed¶
- Add create_backup_and_download to BackupProvider/CentralUnit
- Add dedicated inbox devices code
- Add rename_device / accept_device_in_inbox to Central/DeviceManagement
- Refactor Client
Version 2025.12.2 (2025-12-01)¶
What's Changed¶
- Add HubProtocol and WeekProfileProtocol to interfaces
- Cleanup client api
- Rename regaid to rega_id
- Update documentation
Version 2025.12.1 (2025-12-01)¶
What's Changed¶
- Migrate to Protocol based model
Version 2025.12.0 (2025-12-01)¶
What's Changed¶
- Added get_install_mode() and set_install_mode() methods
- Added rename_device and rename_channel methods
- Method accept_device_in_inbox to accept new devices
- New hub entity for device inbox (devices pending pairing)
- New hub entity for system update status
- New method create_backup() for creating CCU system backups
- New method download_backup() for downloading backup files
- New method download_firmware() for downloading firmware to CCU
- New method get_service_messages to fetch CCU service messages
- New method get_system_update_info for firmware update status
- Extended SystemInformation with CCU type identification (CCU vs OpenCCU)
- New CCUType enum for backend identification
- New protocols for model data points for better decoupling
- New script trigger_firmware_update.fn to trigger firmware updates
- New script create_backup.fn to create system backups
- New script get_backend_info.fn to retrieve backend information
- Extended get_system_update_info.fn to support OpenCCU online version check
Version 2025.11.30 (2025-11-26)¶
What's Changed¶
- Use AioXmlRpcProxy for backend detection
Version 2025.11.29 (2025-11-26)¶
What's Changed¶
- Extend backend detection
Version 2025.11.28 (2025-11-26)¶
What's Changed¶
- Avoid potential memory leaks
- Clear in-memory caches on stop
Version 2025.11.27 (2025-11-25)¶
What's Changed¶
- Add backend detection
- Use CentralConnectionState in AioJsonRpcAioHttpClient
Version 2025.11.26 (2025-11-25)¶
What's Changed¶
- Improve event processing
Version 2025.11.25 (2025-11-24)¶
What's Changed¶
- Cleanup after event bus migration
- Switch from legacy wrapper to event bus naming
Version 2025.11.24 (2025-11-24)¶
What's Changed¶
- Add ClientFactoryProtocol for DI
- Improve documentation
Version 2025.11.23 (2025-11-21)¶
What's Changed¶
- Clean up event bus implementation and remove legacy code
- Extend API to re-add support for mqtt client
Version 2025.11.22 (2025-11-20)¶
What's Changed¶
- Add data_point_provider to DeviceCoordinator
Version 2025.11.21 (2025-11-20)¶
What's Changed¶
- De-couple from central unit pt2
- Improve typing in protocols/interfaces
Version 2025.11.20 (2025-11-19)¶
What's Changed¶
- De-couple from central unit
- Extract coordinators from central unit
- Extract device registry from central
- Extract scheduler from central
- Refactor event handling to event bus
- Rename writeable to writable
Version 2025.11.19 (2025-11-17)¶
What's Changed¶
- Fix service naming
Version 2025.11.18 (2025-11-17)¶
What's Changed¶
- Add more simple services and converters to week profile
- Add base_temperature to CLIMATE_SIMPLE_WEEKDAY_DATA
- Filter entries in validate_and_convert_weekday_to_simple
- Refactor simple schedule
Version 2025.11.17 (2025-11-16)¶
What's Changed¶
- Fix week profile filtering
- Improve test coverage,
- Reorganize test files
Version 2025.11.16 (2025-11-16)¶
What's Changed¶
- Add schedule support to custom data point
- Improve the test coverage of week_profile
- Optimize climate get/set_schedule
- Return filtered climate schedule data on get_schedule / Accept filtered data in climate set_schedule
Version 2025.11.15 (2025-11-13)¶
What's Changed¶
- Move reload_and_cache_schedule to load_data_point_value
Version 2025.11.14 (2025-11-13)¶
What's Changed¶
- Add input converter to climate scheduler setter
Version 2025.11.13 (2025-11-13)¶
What's Changed¶
- Use schedule cache for climate get/set schedule operations
Version 2025.11.12 (2025-11-12)¶
What's Changed¶
- Add climate schedule cache
Version 2025.11.11 (2025-11-09)¶
What's Changed¶
- Add translations for log messages with level >= INFO or translation exclusions
- Move strings.json to root
Version 2025.11.10 (2025-11-08)¶
What's Changed¶
- Make exceptions translatable
Version 2025.11.9 (2025-11-07)¶
What's Changed¶
- Do not normalize homematic event data
Version 2025.11.8 (2025-11-07)¶
What's Changed¶
- Remove need for empty parentheses for bind_collector
- Switch mypy to strict
- Use Protocol for callback with parameters
Version 2025.11.7 (2025-11-05)¶
What's Changed¶
- Handle early arrival of pong events
Version 2025.11.6 (2025-11-05)¶
What's Changed¶
- Add code member sorter to pre-commit
- Add post_init_data_point_fields
- Make ping pong handling more robust
- Move on_link_peer_changed and refresh_link_peer_activity_sources to BaseCustomDpClimate
Version 2025.11.5 (2025-11-04)¶
What's Changed¶
- Remove link support for not linkable interfaces
Version 2025.11.4 (2025-11-04)¶
What's Changed¶
- Fix issue with linked channels for climate activity
- Store data_point_updated_callbacks by custom_id
Version 2025.11.3 (2025-11-03)¶
What's Changed¶
- Add fallback to climate.activity to use linked channels, if own dps don't exist
Version 2025.11.2 (2025-11-02)¶
What's Changed¶
- Add link peer channel to channel
- Add link_peer channels to device
Version 2025.11.0 (2025-11-01)¶
What's Changed¶
- Fix issue after reconnect
- Use generic DP DpDummy instead of NoneTypeDataPoint replacement
Version 2025.10.26 (2025-10-30)¶
What's Changed¶
- Run delete_file task in executor
Version 2025.10.25 (2025-10-30)¶
What's Changed¶
- Handle ping after ping success
Version 2025.10.24 (2025-10-30)¶
What's Changed¶
- Fix custom HmIP-WGTC definition
- Test support: Improve central unit code/test coverage
Version 2025.10.22 (2025-10-26)¶
What's Changed¶
- Refactor PingPongCache
Version 2025.10.21 (2025-10-26)¶
What's Changed¶
- Add pong_mismatch_allowed to ping pong event
- Revert: Improve call back alive check
Version 2025.10.20 (2025-10-26)¶
What's Changed¶
- Test support: Improve code/test coverage
- Improve call back alive check
- Improve version creation for aiohomematic_test_support
Version 2025.10.18 (2025-10-24)¶
What's Changed¶
- Test support: Search in secondary sessions if primary session has no results
Version 2025.10.17 (2025-10-23)¶
What's Changed¶
- Test support: Remove ClientLocal
Version 2025.10.16 (2025-10-23)¶
What's Changed¶
- Test support: Add option to start central in get_default_central (tests)
Version 2025.10.15 (2025-10-23)¶
What's Changed¶
- Test support: Refactor tests to use central*client_factory_with****ccu_client
Version 2025.10.14 (2025-10-22)¶
What's Changed¶
- Test support: Add separate deployment for aiohomematic_test_support
- Test support: Refactor tests to use SessionPlayer instead of ClientLocal
- Test support: Use recorded session for testing
Version 2025.10.10 (2025-10-19)¶
What's Changed¶
- Add file_path to BasePersitentFile load
- Add get_latest_response_by_params to session recorder
- Add 'optional settings' config option
- Remove individual ttl for session recorder entry
- Rename filename to file_name
- Use enum for internal custom ids
Version 2025.10.9 (2025-10-18)¶
What's Changed¶
- Add session recorder
- Ensure custom_ids are only used for external registrations
- Fix rpc auth
Version 2025.10.8 (2025-10-14)¶
What's Changed¶
- Add dew point spread and enthalpy to calculated sensors
Version 2025.10.7 (2025-10-13)¶
What's Changed¶
- Fix issue with RPC-Server setup
Version 2025.10.6 (2025-10-13)¶
What's Changed¶
- Add ELV-SH-PSMCI
- Refactor rpc handling
Version 2025.10.5 (2025-10-10)¶
What's Changed¶
- Fix issue with non existing PARENT in device description
Version 2025.10.4 (2025-10-07)¶
What's Changed¶
- Add delayed device creation
- Add source of device creation to callback
- Improve test setup and cleanup
- Minimize decorator overhead
Version 2025.10.3 (2025-10-06)¶
What's Changed¶
- Add Keyword-only method linter (mypy-style)
Version 2025.10.2 (2025-10-05)¶
What's Changed¶
- API cleanup: ensure that kw arguments are passed to the underlying function
Version 2025.10.1 (2025-10-01)¶
What's Changed¶
- Add option to cover entities that the current default behaviour can be disabled:
- The default behaviour is, that the primary cover entity of a group uses the level of the state channel and no its own level to display a correct level.
- Only HM experts should disable this option, that like to control all three writeable channels of a cover group.
Version 2025.10.0 (2025-10-01)¶
What's Changed¶
- Improve error message if service is not available
- Make default_callback_port, storage_folder optional
- Re-/Store last manual temperature of climate entity
Version 2025.9.8 (2025-09-29)¶
What's Changed¶
- Add CuXD parameters CMD_RETL and CMD_RETS to ignore list, to avoid warnings when reading the value without an appropriate configuration.
- CMD_RETL warning: use CUX28010xx:16.CMD_QUERY_RET=1 to activate CUX28010xx:16.CMD_RETL command!
- CMD_RETS warning: use CUX28010xx:16.CMD_QUERY_RET=1 to activate CUX28010xx:16.CMD_RETS command!
- Add them to unignore if you are able to handle the warnings.
Version 2025.9.7 (2025-09-28)¶
What's Changed¶
-
Fix device has_sub_devices pt2
-
Version 2025.9.6 (2025-09-28)¶
-
Fix device has_sub_devices
Version 2025.9.5 (2025-09-25)¶
What's Changed¶
- Fix magic method issue with log_context in xml_rpc client
Version 2025.9.4 (2025-09-24)¶
What's Changed¶
- Remove dedicated @cached_property -> use @hm_property(cached=True) instead
Version 2025.9.3 (2025-09-14)¶
What's Changed¶
- Remove test-only-relevant code from _get_attributes_by_decorator
- Further decorator refactoring
Version 2025.9.2 (2025-09-12)¶
What's Changed¶
- Refactor CDP OperatingVoltageLevel
- Refactor event method handling
- Refactor decorators
- Add log_context to @*_property
- Add overloads to @*_property
- Add overloads to @inspector
Version 2025.9.1 (2025-09-06)¶
What's Changed¶
- Document how device, channel and data point names are created (docs/naming.md)
- Add worked examples to naming documentation
- Use dedicated loggers for event and performance logging
Version 2025.8.10 (2025-08-29)¶
What's Changed¶
- Improve documentation
- Added docs/architecture.md describing high-level components (central, client, model, caches, support) and their interactions
- Added data flow for XML-RPC/JSON-RPC, event handling, and data point updates
- Added sequence diagrams for connect, device discovery, state change propagation
- Add troubleshouting docs
- Add customization for HmIP-LSC
- Avoid deadlocks within locks (cover)
- Detailing the central status
- Improve boundary logging und exception handling
- Improve decorators
- Improve lock handling
- Shield network I/O against cancellation
- Validate custom datapoint definition on startup
Version 2025.8.9 (2025-08-23)¶
What's Changed¶
- Add signature to model
- Improve immutability
- Improve readability of visibility cache
Version 2025.8.8 (2025-08-23)¶
What's Changed¶
- Extend DataPointKey usage
- Improve fetch_all_device_data
Version 2025.8.7 (2025-08-17)¶
What's Changed¶
- Use room from channel 0 for device, if multiple set on channels
- Use room from master channel, if multiple set on channel group
Version 2025.8.6 (2025-08-14)¶
What's Changed¶
- Do not send additional parameter in kwargs for events
- Fix unique_id_prefix usage
- Rename hahomematic to aiohomematic
Version 2025.8.5 (2025-08-11¶
What's Changed¶
- Improve module documentation
- Small performance improvements
Version 2025.8.4 (2025-08-10)¶
What's Changed¶
- Small performance improvements
Version 2025.8.3 (2025-08-07)¶
What's Changed¶
- Fix refresh shortly
Version 2025.8.2 (2025-08-07)¶
What's Changed¶
- Simplify should_fire_data_point_updated_callback for calculated data points
Version 2025.8.1 (2025-08-06)¶
What's Changed¶
- Cleanup slots
- Move timer support to BaseDataPoint
Version 2025.8.0 (2025-08-03)¶
What's Changed¶
- Use slots
Version 2025.7.7 (2025-07-26)¶
What's Changed¶
- Align exception naming
Version 2025.7.6 (2025-07-25)¶
What's Changed¶
- Refactor argument extraction from exceptions
Version 2025.7.5 (2025-07-23)¶
What's Changed¶
- Add customization for (Deleting of obsolete entities/device) might be required):
- HmIP-SMO230
Version 2025.7.4 (2025-07-13)¶
What's Changed¶
- Add customization for (Deleting of obsolete entities/device) might be required):
- HmIP-WGT/HmIP-WGTC
- Replace asyncio.iscoroutinefunction
Version 2025.7.3 (2025-07-13)¶
What's Changed¶
- Improve: Fire updated events for calculated DPs when refreshed within a second
Version 2025.7.2 (2025-07-12)¶
What's Changed¶
- Rename channel* to group* properties for cover, light and switch
Version 2025.7.1 (2025-07-12)¶
What's Changed¶
- Fire updated events for calculated DPs when refreshed within a second
Version 2025.7.0 (2025-07-09)¶
What's Changed¶
- Add default customization for ELV-SH-SW1-BAT (Deleting of obsolete entities might be required)
- Enable OPERATING_VOLTAGE_LEVEL for HM-CC-RT-DN and HM-TC-IT-WM-W-EU
Version 2025.6.0 (2025-06-16)¶
What's Changed¶
- Add batteries for ELV-SH-TACO
- Add state channel to sub_device_channel mapping
- Improve sub_device_channel identification
Version 2025.5.2 (2025-06-01)¶
What's Changed¶
- Add operating voltage level to ELV-SH-WSM / HmIP-WSM
- Enable ACTUAL_TEMPERATURE on maintenance channel
Version 2025.5.1 (2025-05-20)¶
What's Changed¶
- Add CustomDP valve for ELV-SH-WSM / HmIP-WSM
Version 2025.5.0 (2025-05-19)¶
What's Changed¶
- Fix performance measurement
- Improve identify ip address
- Wait with PING/PONG handling until interface is initialized
Version 2025.4.2 (2025-04-11)¶
What's Changed¶
- Add button_lock to HmIP-DLD
Version 2025.4.1 (2025-04-07)¶
What's Changed¶
- limit text values to 255 characters
Version 2025.4.0 (2025-04-03)¶
What's Changed¶
- Create TLS context during module load
Version 2025.3.0 (2025-03-09)¶
What's Changed¶
- Clear session on auth failure
- Use enums for const parameter values
Version 2025.2.7 (2025-02-08)¶
What's Changed¶
- Remove @cache and @lru_cache annotations
- Use @cached_property for expensive, one time calculated properties
Version 2025.2.6 (2025-02-08)¶
What's Changed¶
- Add vapor concentration and dew point to all device channels that support temperature and humidity
- Add HmIP-FCI1 and HmIP-FCI6 to batteries
- Ensure load_data_point_value usage for initial load
- Fix OperatingVoltageLevel attributes: low_bat_limit, low_bat_limit_default
- Ignore parameters on initial load, if not already fetched by rega script (ERROR*, RSSI*, DUTY_CYCLE, DUTYCYCLE, LOW_BAT, LOWBAT, OPERATING_VOLTAGE)
- Ignore model on initial load (HmIP-SWSD, HmIP-SWD)
Version 2025.2.5 (2025-02-05)¶
What's Changed¶
- Use value instead of default for low_bat_limit
Version 2025.2.3 (2025-02-05)¶
What's Changed¶
- Fix calculated climate sensor identification
Version 2025.2.2 (2025-02-05)¶
What's Changed¶
- Catch get_metadata XMLRPC fault
- Catch JSONDecodeError on load/save cache files
- Ignore devices with unknown battery
- Set battery to UNKNOWN for HmIP-PCBS-BAT
- Sort battery list for correct wildcard search
Version 2025.2.1 (2025-02-02)¶
What's Changed¶
- Add calculated data points for HM devices
- Remove python 3.12 for github tests and pylint
- Use py 3.13 for mypy and pylint
Version 2025.2.0 (2025-02-01)¶
What's Changed¶
- Fix battery qty
Version 2025.1.22 (2025-01-31)¶
What's Changed¶
- Add config option to define the hm_master_poll_after_send_intervals
- Enable DEW_POINT calculation for internal thermostats
- Use temporary values where push is not supported
Version 2025.1.21 (2025-01-30)¶
What's Changed¶
- Improve connection error handling
Version 2025.1.20 (2025-01-30)¶
What's Changed¶
- Fix index issue with WEEK_PROGRAM_POINTER
- Use ParamsetKey enum in tests
Version 2025.1.19 (2025-01-29)¶
What's Changed¶
- Don't read on unavailable devices
- Enable schedule on hm thermostat
- Poll master dp values 5s after send for bidcos devices
- Rename paramset_key to paramset_key_or_link_address for put_paramset
Version 2025.1.18 (2025-01-28)¶
What's Changed¶
- Add climate presets based on WEEK_PROGRAM_POINTER
- Add WEEK_PROGRAM_POINTER for bidcos climate devices
- Define schedule_channel_address for HM schedule usage
- Fix usage of master dps for bidcos climate devices
Version 2025.1.17 (2025-01-26)¶
What's Changed¶
- Catch math related value errors
Version 2025.1.16 (2025-01-26)¶
What's Changed¶
- Limit calculated climate sensors to selected devices
Version 2025.1.15 (2025-01-25)¶
What's Changed¶
- Add calculated data points: FrostPoint
Version 2025.1.14 (2025-01-25)¶
What's Changed¶
- Add calculated data points: ApparentTemperature, DewPoint, VaporConcentration
- Refactor OperatingVoltageLevel
Version 2025.1.13 (2025-01-24)¶
What's Changed¶
- Fix OperatingVoltageLevel sensor value
Version 2025.1.12 (2025-01-24)¶
What's Changed¶
- Add LOW_BAT_LIMIT
- Add calculated data points: OperatingVoltageLevel
- Refactor parameter_visibility
Version 2025.1.11 (2025-01-20)¶
What's Changed¶
- Cleanup cache file clear
- Delay start of scheduler until devices are created
- Rename instance_name to central_name
- Slugify cache file name
Version 2025.1.10 (2025-01-17)¶
What's Changed¶
- Return regular dict from list_devices
Version 2025.1.9 (2025-01-15)¶
What's Changed¶
- Load cached files as defaultdicts
Version 2025.1.8 (2025-01-15)¶
What's Changed¶
- Improve defaultdict usage
Version 2025.1.7 (2025-01-14)¶
What's Changed¶
- Fix KeyError on uninitialised dict pt2
Version 2025.1.6 (2025-01-14)¶
What's Changed¶
- Fix KeyError on uninitialised dict
Version 2025.1.5 (2025-01-11)¶
What's Changed¶
- Refactor create_* methods:
- create_data_points_and_events
- create_data_point_and_append_to_channel
- create_event_and_append_to_channel
- Speedup wildcard lookup
Version 2025.1.4 (2025-01-09)¶
What's Changed¶
- Cleanup: Use defaultdict, improve naming
- Rename decorator @inspector
Version 2025.1.3 (2025-01-08)¶
What's Changed¶
- Fix issue with programs/sysvars on backend restart
Version 2025.1.2 (2025-01-06)¶
What's Changed¶
- Add legacy name for hub entities
- Cleanup hub entity name if channel exists
- Identify channel of a system variable:
- name ends with channel address
- name contains channel/device id
Version 2025.1.1 (2025-01-05)¶
What's Changed¶
- Consider heating value type when calculating hvac action
Version 2025.1.0 (2025-01-01)¶
What's Changed¶
- Remove get-/set_install_mode
Version 2024.12.13 (2024-12-27)¶
What's Changed¶
- Add program switch
Version 2024.12.12 (2024-12-23)¶
What's Changed¶
- Ensure service and alarm messages are always displayed
- Remove sv prefix from sysvar / p prefix from program
Version 2024.12.11 (2024-12-22)¶
What's Changed¶
- Fix remove last sysvar/program
- Remove unignore file import
- Rename has_markers to enabled_default
- Use NamedTuple for datapoint key
Version 2024.12.10 (2024-12-21)¶
What's Changed¶
- Refactor scheduler
- Reformat line length to 120
Version 2024.12.9 (2024-12-20)¶
What's Changed¶
- Add periodic checks for device firmware updates
- Refactor scheduler to use just one task
- Rename marker for extended system variables from hahm to HAHM to better align with other markers
Version 2024.12.8 (2024-12-20)¶
What's Changed¶
- Rename create methods
- Revert mangled attribute name in json_rpc_client
Version 2024.12.7 (2024-12-18)¶
What's Changed¶
- Extend element_matches_key search
- Log debug if variable is too long
- Remove default markers from description
- Start json_rpc client only for ccu
Version 2024.12.6 (2024-12-18)¶
What's Changed¶
- Support markers for sysvar/program selection
- Remove danielperna84 from links after repository transfer to sukramj
Version 2024.12.5 (2024-12-15)¶
What's Changed¶
- Limit number of concurrent mass operations to json api to 3 parallel executions
Version 2024.12.4 (2024-12-14)¶
What's Changed¶
- Add missing encoding to unquote
- Ensure default encoding is ISO-8859-1 where needed
Version 2024.12.3 (2024-12-14)¶
What's Changed¶
- Add method cleanup_text_from_html_tags
- Decode received sysvar/program descriptions
- Replace special character replacement by simple UriEncode() method use by @jens-maus
Version 2024.12.2 (2024-12-10)¶
What's Changed¶
- Use kelvin instead of mireds for color temp
Version 2024.12.1 (2024-12-10)¶
What's Changed¶
- Catch orjson.JSONDecodeError on faulthy json script response
Version 2024.12.0 (2024-12-05)¶
What's Changed¶
- Add description to sysvar and program
- Add BidCos-Wired to list of primary interface candidates
- Remove obsolete try/except in homegear client
Version 2024.11.11 (2024-11-25)¶
What's Changed¶
- Enable central link management for HmIP-wired
- Reset temporary values before write
Version 2024.11.10 (2024-11-24)¶
What's Changed¶
- Add TIME_OF_OPERATION to smoke detector
- Switch multiplier from int to float
- Use more constants for cover and light
Version 2024.11.9 (2024-11-22)¶
What's Changed¶
- Make sysvars eventable
Version 2024.11.8 (2024-11-21)¶
What's Changed¶
- Add missing @service annotations
- Add performance measurement to @service
- Don't re-raise exception on internal services
- Move @service
- Remove @service from abstract methods
Version 2024.11.7 (2024-11-19)¶
What's Changed¶
- Set state_uncertain on value write
Version 2024.11.6 (2024-11-19)¶
What's Changed¶
- Cleanup data point
Version 2024.11.5 (2024-11-19)¶
What's Changed¶
- Fix returned version of client
- Improve store tmp value
- Store temporary value for sysvar data points
Version 2024.11.4 (2024-11-19)¶
What's Changed¶
- Add sysvar/program refresh to scheduler
- Run periodic tasks with an individual interval
- Store temporary value for polling client data points
Version 2024.11.3 (2024-11-18)¶
What's Changed¶
- Add interface(id) to performance log message
- Add interfaces_requiring_periodic_refresh to config
- Add periodic data refresh to CentralUnitChecker for some interfaces
- Add root path for virtual devices
- Maintain data_cache by interface
- Reduce MAX_CACHE_AGE to 10s
Version 2024.11.2 (2024-11-17)¶
What's Changed¶
- Add get_data_point_path to central
- Allow empty port for some interfaces
- Do reconnect/reload only for affected interfaces
- Ignore unknown interfaces
- Remove clients for not available interfaces
Version 2024.11.1 (2024-11-14)¶
What's Changed¶
- Add basic support for json clients
- Add data_point_path event
- Add getDeviceDescription, getParamsetDescription, listDevices, getValue, setValue, getParamset, putParamset to json_rpc
- Add option to refresh data by interface
- Add xml_rpc support flag to client
- Extend DP_KEY with interface_id
- Rename event to data_point_event
Version 2024.11.0 (2024-11-04)¶
What's Changed¶
- Improve on_time usage
Version 2024.10.17 (2024-10-29)¶
What's Changed¶
- Use enum for json/event keys
- Fire interface event, if data could not be fetched with script from CCU
Version 2024.10.16 (2024-10-27)¶
What's Changed¶
- Optimize MASTER data load
Version 2024.10.15 (2024-10-27)¶
What's Changed¶
- Rename model to better distinguish from HA
Version 2024.10.14 (2024-10-26)¶
What's Changed¶
- Use version from module
Version 2024.10.13 (2024-10-24)¶
What's Changed¶
- Disable climate temperature validation when turning off
Version 2024.10.12 (2024-10-19)¶
What's Changed¶
- Small tweaks to improve central link management
Version 2024.10.11 (2024-10-19)¶
What's Changed¶
- Align method parameters with CCU
- Use PRESS_SHORT for reportValueUsage
- Check if channel has programs before deleting links
Version 2024.10.10 (2024-10-18)¶
What's Changed¶
- Add create_central_links and remove_central_links to device and central
Version 2024.10.9 (2024-10-17)¶
What's Changed¶
- Add central link methods to click event
- Add reportValueUsage, addLink, removeLink and getLinks to client
- Add version to code
- Fix wrong channel assignment for HmIP-DRBLI4
- Add operation_mode to channel
Version 2024.10.8 (2024-10-15)¶
What's Changed¶
- Add services to copy climate schedules
- Make validation for climate schedules optional
Version 2024.10.7 (2024-10-12)¶
What's Changed¶
- Add MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE, OPTIMUM_START_STOP and TEMPERATURE_OFFSET to climate
- Improve profile validation
- Use regex to identify schedule profiles
Version 2024.10.6 (2024-10-11)¶
What's Changed¶
- Export SIMPLE_PROFILE_DICT, SIMPLE_WEEKDAY_LIST
Version 2024.10.5 (2024-10-11)¶
What's Changed¶
- Add simple climate schedule service to store profiles
- Reuse existing dict types
- Convert schedule time from minutes to hh:mm
Version 2024.10.4 (2024-10-09)¶
What's Changed¶
- Add basic climate schedule services
- Refactor constants
- Rename climate enums and constants to better distinguish from HA
Version 2024.10.3 (2024-10-07)¶
What's Changed¶
- Add missing import entries
Version 2024.10.2 (2024-10-07)¶
What's Changed¶
- Simplify entity imports
Version 2024.10.1 (2024-10-04)¶
What's Changed¶
- Fix rx_mode lazy_config
- Make DEFAULT optional due to homegear support
- Move context var to own module
Version 2024.10.0 (2024-10-03)¶
What's Changed¶
- Add config option for max read workers
- Disable collector for stop events
- Improve logging when raising exception
- Log exception at the most outer service
- Make UPDATEABLE optional due to homegear support
- Raise exception on set_value, put_paramset
- Remove command queue
Version 2024.9.12 (2024-09-26)¶
What's Changed¶
- Add config option for listen ip address and port
Version 2024.9.11 (2024-09-25)¶
What's Changed¶
- Remove CED for ELV-SH-WUA / HmIP-WUA
Version 2024.9.10 (2024-09-22)¶
What's Changed¶
- Add name to channel
- Catch bind address errors of xml rpc server
- Refactor get_events, get_new_entities
- Remove unnecessary checks
- Separate enable/disable sysvar and program scan
- Use paramset_description from channel
Version 2024.9.9 (2024-09-21)¶
What's Changed¶
- Use channel instead of channel_addresses
Version 2024.9.8 (2024-09-21)¶
What's Changed¶
- Refactor device/entity to extract channel
- Replace device_type by model
- Shorten names
Version 2024.9.7 (2024-09-15)¶
What's Changed¶
- Add bind_collector to all relevant methods with option to disable it
- Identify bind_collector annotated methods
- Mark externally accessed services with service_call if bind_collector is not appropriate
Version 2024.9.6 (2024-09-13)¶
What's Changed¶
- Add missing PayloadMixin
- Adjust payload and path
- Rename value_property to state_property
Version 2024.9.5 (2024-09-03)¶
What's Changed¶
- Improve device_description usage
- Reduce number of required characters for an address identification
Version 2024.9.4 (2024-09-03)¶
What's Changed¶
- Use validator for local schema
Version 2024.9.3 (2024-09-02)¶
What's Changed¶
- Improve validation of channel address, device address, password and htmltag
Version 2024.9.2 (2024-09-02)¶
What's Changed¶
- Allow str for get_paramset
Version 2024.9.1 (2024-09-02)¶
What's Changed¶
- Improve paramset key check
Version 2024.9.0 (2024-09-01)¶
What's Changed¶
- Add getLinkPeers XmlRPC method
- Do not create update entities that are not updatable (manually remove obsolete update entities)
- Only try device update refresh if device is updatable
- Refactor update entity
Version 2024.8.15 (2024-08-29)¶
What's Changed¶
- Add check for link paramsets
- Avoid permanent cache save on remove device
- Check rx_mode
- Ensure only one load/save of cache file at time
- Load all paramsets
- Small definition fix for DALI
- Use TypedDict for device_description
- Use TypedDict for parameter_data
Version 2024.8.14 (2024-08-26)¶
What's Changed¶
- Add paramset_key to entity_key
- Switch typing of paramset_key from str to ParamsetKey
- Mark only level as relevant entity for DALI
Version 2024.8.13 (2024-08-25)¶
What's Changed¶
- Check/convert values of manual executed put_paramset/set_value
Version 2024.8.12 (2024-08-24)¶
What's Changed¶
- Add additional validation on config parameters
Version 2024.8.11 (2024-08-21)¶
What's Changed¶
- Make HEATING_COOLING visible for thermostats
- Use only relevant IP for XmlRPC Server listening on
Version 2024.8.10 (2024-08-20)¶
What's Changed¶
- Cleanup ParamsetDescriptionCache
- Cleanup DeviceDescriptionCache
Version 2024.8.9 (2024-08-20)¶
What's Changed¶
- Avoid excessive memory usage in cache
Version 2024.8.8 (2024-08-18)¶
What's Changed¶
- Refactor folder handling
Version 2024.8.7 (2024-08-18)¶
What's Changed¶
- Fix empty channel on get_parameters
Version 2024.8.6 (2024-08-18)¶
What's Changed¶
- Fix get_parameters
Version 2024.8.5 (2024-08-17)¶
What's Changed¶
- Add un_ignore_candidates to central
Version 2024.8.4 (2024-08-16)¶
What's Changed¶
- Make load only relevant paramset descriptions configurable
- Add UN_IGNORE_WILDCARD to get_parameters
Version 2024.8.3 (2024-08-15)¶
What's Changed¶
- Ignore parameters on un ignore parameter list
Version 2024.8.2 (2024-08-15)¶
What's Changed¶
- Add CED for ELV-SH-WUA / HmIP-WUA
- Refactor get_parameters for unignore_candidates
Version 2024.8.1(2024-08-02)¶
What's Changed¶
- Refactor entity path
- Allow undefined generic entities besides CE
Version 2024.8.0 (2024-08-01)¶
What's Changed¶
- Reduce data load, if only device description is updated
Version 2024.7.1 (2024-07-27)¶
What's Changed¶
- Enable button lock for hm devices
Version 2024.7.0 (2024-07-26)¶
What's Changed¶
- Rename last_updated -> modified_at
- Rename last_refreshed -> refreshed_at
- Add button lock CE
- Add time units to HmIP-RGBW calls
Version 2024.5.6 (2024-05-31)¶
What's Changed¶
- Catch TypeError on SysVar import
Version 2024.5.5 (2024-05-29)¶
What's Changed¶
- Fix address for bidcos wired virtual device
Version 2024.5.4 (2024-05-23)¶
What's Changed¶
- Enable CE visible entities by default
Version 2024.5.3 (2024-05-16)¶
What's Changed¶
- Fix value assignment to lock enums
- Set open tilt level back to 100%
- Use PEP 695 typing
Version 2024.5.2 (2024-05-14)¶
What's Changed¶
- Move command_queue handling from device to channel
- Add level sensors to cover/blind
- Allow changing level or tilt while blind is moving by @sleiner
Version 2024.5.1 (2024-05-06)¶
What's Changed¶
- Improve callback register/unregister
Version 2024.5.0 (2024-05-01)¶
What's Changed¶
- Make some items from value_property to property
- Rename callbacks
- Fix Homegear reconnect
- Add COLOR_BEHAVIOUR to HmIP-BSL
Version 2024.4.12 (2024-04-24)¶
What's Changed¶
- Fix missing param in unregister_entity_updated_callback
- Set open tilt level to 50%
Version 2024.4.11 (2024-04-24)¶
What's Changed¶
- Add command queue
- Move open/close from IpBlind to Blind
- Use central_client_factory fixture
- Ensure central.stop() is called in tests
Version 2024.4.10 (2024-04-21)¶
What's Changed¶
- Add wait_for_callback to collector
- Wait for target value in wait_for_state_change_or_timeout
Version 2024.4.9 (2024-04-20)¶
What's Changed¶
- Decompose combined parameter
- Return affected entity keys for service calls
- Add callback to unregister on register return
- Add option to wait for set_value/put_paramset callback
Version 2024.4.8 (2024-04-13)¶
What's Changed¶
- Make entity event async
- Extract looper from central and reuse for json/xml_rpc
- Move loop_check to async_support
- Record last value send
Version 2024.4.7 (2024-04-13)¶
What's Changed¶
- Rename loop_safe to loop_check
- Reduce loop_check to minimum
- Update ruff rules / requirements
Version 2024.4.6 (2024-04-10)¶
What's Changed¶
- Remove unused callback from tests
- Add loop_safe annotation
- Remove entity_data_event_callback
- Make backend_system_callback loop aware
Version 2024.4.5 (2024-04-09)¶
What's Changed¶
- Align callback naming
Version 2024.4.4 (2024-04-09)¶
What's Changed¶
- Unify entity update/refresh events
Version 2024.4.3 (2024-04-09)¶
What's Changed¶
- Restructure check_connection
- Make xml_rpc event async
- Block central stop until tasks are finished
Version 2024.4.2 (2024-04-08)¶
What's Changed¶
- Adjust cache max size
- Update ruff rules
Version 2024.4.1 (2024-04-05)¶
What's Changed¶
- Fix register refreshed entity
- Refactor callback naming
Version 2024.4.0 (2024-04-02)¶
What's Changed¶
- Remove support for python 3.11
- Remove python 3.11 for github tests and pylint
- Use py 3.12 for mypy and pylint
- Use more list comprehension
- Customize HmIP-DRG-DALI
Version 2024.3.1 (2024-03-12)¶
What's Changed¶
- Add additional parameter to HBW-LC4-IN4-DR
- Add check if init is running in the main thread
Version 2024.3.0 (2024-03-01)¶
What's Changed¶
- Add HBW-LC4-IN4-DR
Version 2024.2.4 (2024-02-13)¶
What's Changed¶
- Group entities to sub devices / base channels
- Add mapping for fixed color channel
- Refactor entity name data
Version 2024.2.3 (2024-02-12)¶
What's Changed¶
- Rename func to make_ce_func
- Add fixed mapping for HBW-LC-RGBWW-IN6-DR
- Fix mapping of HmIP-HDM
Version 2024.2.2 (2024-02-11)¶
What's Changed¶
- Add option to un ignore mechanism to ignore the automatic creation of custom entities by device type
- Remove incomplete/wrong mapping for HBW-LC-RGBWW-IN6-DR
- Fix mapping of HmIP-HDM
Version 2024.2.1 (2024-02-02)¶
What's Changed¶
- Accept float as input for int numbers
Version 2024.2.0 (2024-02-01)¶
What's Changed¶
- Ignore empty unignore line
- All MASTER parameters must be unignored
Version 2024.1.11 (2024-01-31)¶
What's Changed¶
- Remove deprecation warnings for py3.12
- Fix/improve unignore search
Version 2024.1.10 (2024-01-28)¶
What's Changed¶
- Remove old complex format for unignore
Version 2024.1.9 (2024-01-26)¶
What's Changed¶
- Move product group identification to client
- Add new pattern for unignore (parameter:paramset_key@device_type:channel_no)
- Allow all as unignore parameter for device_type and channel_no
Version 2024.1.8 (2024-01-12)¶
What's Changed¶
- Store old_value in entity model
Version 2024.1.7 (2024-01-12)¶
What's Changed¶
- Reload master data after config pending event
- Allow direct_call without cache wait time
Version 2024.1.6 (2024-01-11)¶
What's Changed¶
- Fix unignore doc and improve unignore tests
- Move unignore check to entity
Version 2024.1.5 (2024-01-09)¶
What's Changed¶
- Remove effects from HmIP-RGBW when in PWM mode
Version 2024.1.4 (2024-01-07)¶
What's Changed¶
- Fix relevant entities for HmIP-RGBW
Version 2024.1.3 (2024-01-07)¶
What's Changed¶
- Add duration=111600 when ramp_time used for HmIP-RGBW
Version 2024.1.2 (2024-01-07)¶
What's Changed¶
- Only consider relevant entities for HmIP-RGBW
Version 2024.1.1 (2024-01-05)¶
What's Changed¶
- Allow ordered execution of collector paramsets
- Add python 3.12 for github tests and pylint
Version 2024.1.0 (2024-01-03)¶
What's Changed¶
- Add duration=0 when ramp_time used for HmIP-RGBW
Version 2023.12.4 (2023-12-19)¶
What's Changed¶
- Add HB-LC-Bl1-Velux to cover
Version 2023.12.3 (2023-12-16)¶
What's Changed¶
- Set attributes of dataclasses
- Add another reason to ping pong mismatch
Version 2023.12.2 (2023-12-15)¶
What's Changed¶
- Save all rooms to entity model
Version 2023.12.1 (2023-12-01)¶
What's Changed¶
- Central name must not contain the identifier separator (@)
Version 2023.12.0 (2023-12-01)¶
What's Changed¶
- Add support for away_mode and classic homematic thermostats
- Collect config validation errors
Version 2023.11.4 (2023-11-22)¶
What's Changed¶
- Don't send ts with ping pong if it should not be handled
Version 2023.11.3 (2023-11-21)¶
What's Changed¶
- Clear ping pong cache on proxy init
Version 2023.11.2 (2023-11-21)¶
What's Changed¶
- Refactor ping pong, remove semaphore
Version 2023.11.1 (2023-11-20)¶
What's Changed¶
- Improve ping/pong mechanism. Fire event, if mismatch is 15 within 5 Minutes
Version 2023.11.0 (2023-11-01)¶
What's Changed¶
- Use last_refreshed for validation check
Version 2023.10.14 (2023-10-29)¶
What's Changed¶
- Cleanup cover
- Replace last_updated by last_refreshed
- Rename fire events
- Switch formatting from black to ruff-format
Version 2023.10.13 (2023-10-28)¶
What's Changed¶
- Fix service enable_away_mode_by_calendar
- Add class method default_platform
Version 2023.10.12 (2023-10-15)¶
What's Changed¶
- Ignore switch to sensor if un ignored
- Update un ignore documentation
Version 2023.10.11 (2023-10-13)¶
What's Changed¶
- Remove WrapperEntity
Version 2023.10.10 (2023-10-12)¶
What's Changed¶
- Align method signatures
- Remove get_update_entities
Version 2023.10.9 (2023-10-12)¶
What's Changed¶
- Fix register_update_callback for update
- Add filter options to device.get_entity*
- Send relevant entities instead of devices in callback
Version 2023.10.8 (2023-10-11)¶
What's Changed¶
- Register external sources with custom identifier
- Remove subscribed_entity_unique_identifiers
- Rename custom_identifier to custom_id
- Rename unique_identifier to unique_id
Version 2023.10.7 (2023-10-10)¶
What's Changed¶
- Adjust typing after move to more enums
- Add measure_execution_time to writing methods
- Fix send sysvar #1249
- Add HmIPW-SCTHD
Version 2023.10.6 (2023-10-08)¶
What's Changed¶
- Add faultCode and faultString to xmlrpc.client.Fault
- Use Mapping/Set for readonly access
- Use enum for CE fields
- Use Parameter for ED
Version 2023.10.5 (2023-10-07)¶
What's Changed¶
- Add started property to central
- Rename:
- value_list -> values
- effect_list -> effects
- Add more checks to get/set value from/tp values
- Use more tuple instead of list
- Cleanup code
- Collect subscribed entities in central
Version 2023.10.4 (2023-10-03)¶
What's Changed¶
- Cleanup exception handling
- Reduce log output for InternalBackendException
Version 2023.10.3 (2023-10-03)¶
What's Changed¶
- Small fix to re raise InternalBackendException
Version 2023.10.2 (2023-10-03)¶
What's Changed¶
- Catch 'internal error' on _get_auth_enabled. Relevant for for CCU2 users
Version 2023.10.1 (2023-10-02)¶
What's Changed¶
- Use enum for JsonRPC and XmlRPC methods
- Get supported JsonRPC and XmlRPC methods and check against used methods
Version 2023.10.0 (2023-10-01)¶
What's Changed¶
- Code cleanup
- Remove Hm prefix from enums
- Use enum for parameters
- Use more existing constants
Version 2023.9.8 (2023-09-30)¶
What's Changed¶
- Improve caching
- Cleanup cache naming
- Remove max_age from most method signatures
- Simplify data cache
- Rename some cache methods
- Remove attr prefix
Version 2023.9.7 (2023-09-29)¶
What's Changed¶
- Add check to BaseHomematicException
- Reduce log level to 'warning' for get_all_device_data 'JSONDecodeError' exceptions
- Update requirements
Version 2023.9.6 (2023-09-29)¶
What's Changed¶
- Use freezegun for climate test
- Update ReGa-Script fetch_all_device_data.fn by @Baxxy13
- Parameterize call to fetch_all_device_data.fn
- Simplify json rpc post code
- Improve for ConnectionProblemIssuer json rpc
- Improve handle_exception_log
- Avoid repeated logs
- Move get_system_information to json_rpc
- Add str to client and central
Version 2023.9.5 (2023-09-23)¶
What's Changed¶
- Cleanup light code
- Use more enums for climate, cover, lock
- Use TypedDict for light, siren args
- Update requirements
Version 2023.9.4 (2023-09-21)¶
What's Changed¶
- Use more assignment-expr
- Make _LOGGER final
Version 2023.9.3 (2023-09-18)¶
What's Changed¶
- Improve typing
- Refactor get_paramset_description
Version 2023.9.2 (2023-09-17)¶
What's Changed¶
- Cleanup logger
- Refactor client and central modules
- Move bind_collector to platforms.entity
- Move config/value_property to platforms.decorators
- Move measure_execution_time to decorators
- Move definition exporter to device
- Move HM_INTERFACE_EVENT_SCHEMA to central
- Update requirements
Version 2023.9.1 (2023-09-06)¶
What's Changed¶
- Re add channel 7 for HmIPW-WRC6
- Reduce log level for exceptions in fetch_paramset_description
- Filter SSLErrors by code
Version 2023.9.0 (2023-09-03)¶
What's Changed¶
- Refactor cover api
Version 2023.8.14 (2023-08-30)¶
What's Changed¶
- Reduce visibility of local constants
- Convert StrEnum and IntEnum in proxy
Version 2023.8.13 (2023-08-28)¶
What's Changed¶
- Fix measure_execution_time decorator for sync methods
- Add async support to callback_system_event
- Replace constants enums
Version 2023.8.12 (2023-08-27)¶
What's Changed¶
- Remove unused const
- Remove dead code
- Optimize get readable entities for MASTER
Version 2023.8.11 (2023-08-25)¶
What's Changed¶
- Always set color_behaviour for HmIPW-WRC6
Version 2023.8.10 (2023-08-25)¶
What's Changed¶
- Extend HmIPW-WRC6 implementation
Version 2023.8.9 (2023-08-23)¶
What's Changed¶
- Add decorator to measure function execution time
- Extend HmIPW-WRC6 implementation
Version 2023.8.8 (2023-08-21)¶
What's Changed¶
- Fix get_all_system_variables return value
Version 2023.8.7 (2023-08-21)¶
What's Changed¶
- Add SSLError to XmlRpcProxy and JsonRpcAioHttpClient
- Make integration more robust against json result failures
Version 2023.8.6 (2023-08-17)¶
What's Changed¶
- Remove use_caches and load_un_ignore from central config
- Remove obsolete comments
- Align sslcontext creation with Home Assistant
Version 2023.8.5 (2023-08-16)¶
What's Changed¶
- Improve testing:
- Set client_session to None
- Remove unnecessary async from create_central
- Make start_direct a config option
Version 2023.8.4 (2023-08-14)¶
What's Changed¶
- Improve testing:
- Extract ClientLocal code from production code
- Use own main package for ClientLocal
- Patch permanent till teardown
Version 2023.8.3 (2023-08-12)¶
What's Changed¶
- Update project setup
- Restructure test helper
- Add ping pong tests
- Avoid multiple central starts
Version 2023.8.2 (2023-08-06)¶
What's Changed¶
- Improve exception and log handling
Version 2023.8.1 (2023-08-04)¶
What's Changed¶
- Prepare backend for HA issue usage
Version 2023.8.0 (2023-08-01)¶
What's Changed¶
- Remove only the starting device name from entity name
- Remove title from program and sysvar names
Version 2023.7.6 (2023-07-29)¶
What's Changed¶
- Refactor Json error handling / logging
- Use ping pong only for CCU
- Add primary_client attribute to central_unit
Version 2023.7.5 (2023-07-26)¶
What's Changed¶
- Add SystemInformation to client api
- Send credentials on XmlRPC api only when authentication is enabled in CCU
- Remove support for python 3.10
- Add available_interfaces to SystemInformation
Version 2023.7.4 (2023-07-18)¶
What's Changed¶
- Update requirements
- Add identifier to device
- Rename ENTITY_NO_CREATE to NO_CREATE
- Extend Channel
- Add channel related attributes to entity
- Add kwargs to update_entity
- Call update_entity for ENTITY_EVENTS
- Ignore click events on plugs
- Add manufacturer to device
Version 2023.7.3 (2023-07-13)¶
What's Changed¶
- Fire interface event about ping/pong mismatch
- Add message to fire_interface_event
- Add schema for interface event
Version 2023.7.2 (2023-07-12)¶
What's Changed¶
- Add new Events PRESS_LOCK and PRESS_UNLOCK for HmIP-WKP
Version 2023.7.1 (2023-07-11)¶
What's Changed¶
- Log an error about the ping/pong count mismatch
Version 2023.7.0 (2023-07-07)¶
What's Changed¶
- Project file maintenance
- Replace isort with ruff
- Move overlapping pylint rules to ruff, disable mypy overlap
Version 2023.6.1 (2023-06-23)¶
What's Changed¶
- Fix tunable white support for hmIP-RGBW
- Avoid creating entities that are not usable in selected device operation mode for hmIP-RGBW
- Update requirements
Version 2023.6.0 (2023-06-01)¶
What's Changed¶
- Update requirements
- Do not create update entities for virtual remotes
- Cleanup FIX_UNIT_BY_PARAM
Version 2023.5.2 (2023-05-14)¶
What's Changed¶
- Improve update_device_firmware
Version 2023.5.1 (2023-05-11)¶
What's Changed¶
- Refactor device description cache handling
- Add device firmware update handling
- Make interface an enum
- Add product group to device
Version 2023.5.0 (2023-05-01)¶
What's Changed¶
- Remove unsupported on_time / refactor HmIP-RGBW
- Update requirements
Version 2023.4.5 (2023-04-28)¶
What's Changed¶
- Fix division by zero for HmIP-RGBW
- Remove color_temperature from RGBW
Version 2023.4.4 (2023-04-28)¶
What's Changed¶
- Add missing channel for HmIP-RGBW
Version 2023.4.3 (2023-04-27)¶
What's Changed¶
- Update requirements
- Add HmIP-RGBW
Version 2023.4.2 (2023-04-24)¶
What's Changed¶
- Update requirements
- Fix cover (HDM2) no longer working
Version 2023.4.0 (2023-04-16)¶
What's Changed¶
- Update requirements
- Add log message to negative password check
- Fix 'Cannot parse hex-string value'
Version 2023.3.1 (2023-03-17)¶
What's Changed¶
- Add name to tasks
- Improve typing
- Move callback calls into exception block
- Remove avoidable usage of deepcopy
- Add dependabot
- Update requirements
- Drop pyupgrade, autoflake, flake8 in favor of ruff
- Refactor cover, add set_combined_position
- Add is_in_multiple_channels to base entity
Version 2023.3.0 (2023-03-01)¶
What's Changed¶
- Update ruff, adjust module aliases
- Fix spamming CCU logs with errors (#981)
Version 2023.2.11 (2023-02-24)¶
What's Changed¶
- Update ruff, fix comments
- Switch to orjson
- Fix climate: compare set temperature to target temperature
Version 2023.2.10 (2023-02-23)¶
What's Changed¶
- Use sets for central callbacks
- Add get_all_entities for device
Version 2023.2.9 (2023-02-18)¶
What's Changed¶
- Fix property types
- Ensure modules for platforms are loaded
- Use local dicts for device lists
- Clear central data cache if identified as outdated
- Avoid redundant cache loads within init phase
- Extract value preparation from send_value
- Differentiate between input and default parameter type
- Fix asyncio-dangling-task (RUF006)
- Add typed dict for light and siren
Version 2023.2.8 (2023-02-11)¶
What's Changed¶
- Add project setup script
- Add entity_data event
- Add payload mixin
- Cleanup module dependencies
- Use cache decorators for some high-traffic methods
- Allow that channel_no could be None
- Add and use get_channel_address
- Add HmIP-SWSD as siren
- Raise CALLBACK_WARN_INTERVAL to 10 minutes
Version 2023.2.7 (2023-02-07)¶
What's Changed¶
- Disable validation of state change for action and button
- Check if entity is writable on send
Version 2023.2.6 (2023-02-07)¶
What's Changed¶
- Add missing bind_collector
- Add more
Finaltyping - Add option to collector to disable put_paramset
- Add on_time Mixin to temporary store on_time
- Add pre-commit check
- Basic linting for tests
Version 2023.2.5 (2023-02-05)¶
What's Changed¶
- Fix GitHub build/publish
- Add comments to parameter_visibility
- Use
put_paramsetonly when there is more than one parameter to sent - Use only one implementation for garage doors (HO/TM)
- Avoid backend calls if value/state doesn't change
- If an entity (e.g.
switch) has only one parameter that represents its state, then a call to the backend will be made, if the parameter value sent is not identical to the current state. - If an entity (e.g.
cover,climate,light) has multiple parameters that represent its state, then a call to the backend will be made, if one of these parameter values sent is not identical to its current state. - Not covered by this approach:
- platforms: lock and siren.
- services:
stop_cover,stop_cover_tilt,enable_away_mode_*,disable_away_mode,set_on_time_value - system variables
- Add virtual channels for HmIP cover/blind:
- Channel no as examples from HmIP-BROLL. The implementation of the first actor channel (4) remains unchanged, which means that this channel (4) shows the correct cover position from sensor channel (3). The other actor channels (5+6) are generated as initially deactivated and only use the cover position from their own channel after activation.
Version 2023.2.1 (2023-02-01)¶
What's Changed¶
- Separate check for parameter is un_ignored based on if it should be hidden or not
Version 2023.2.0 (2023-02-01)¶
What's Changed¶
- Log validation exceptions in central
- Add typing to decorators
- Add tests for better code coverage
Version 2023.1.8 (2023-01-29)¶
What's Changed¶
- Cleanup LOGGER messages
- Cleanup code base with ruff
- Ensure the signal handler gets called at most once by @mtdcr
- Fix stop central, if another central is active on the same XmlRPC server
- JsonRpcAioHttpClient: Allow empty password by @mtdcr
- Remove VALVE_STATE from HmIPW-FALMOT-C12
- Remove put_paramset from custom_entity
- Remove set_value, put_paramset from central
- Remove support for python 3.9
- Remove to int converter for HmIP-SCTH230 CONCENTRATION
- Replace old-style union syntax
- Validate password with regex (warning only!)
Version 2023.1.7 (2023-01-24)¶
What's Changed¶
- Aggregate calls to backend
- Fix HmIP-MOD-TM: inverted direction
Version 2023.1.6 (2023-01-22)¶
What's Changed¶
- Add a new custom entity type for windows drive
- Return True if sending service calls succeed
Version 2023.1.5 (2023-01-20)¶
What's Changed¶
- Add ExtendedConfig and use for additional_entities
- Add ExtendedConfig to custom entities
- Add LED_STATUS to HM-OU-LED16
- Allow multiple CustomConfigs for a hm device
- Cleanup test imports
- Increase the line length to 99
- Remove LOWBAT from HM-LC-Sw1-DR
- Remove obsolete ED_ADDITIONAL_ENTITIES_BY_DEVICE_TYPE from entity_definition
- Replace custom entity config data structure by CustomConfig
- Sort lists in parameter_visibility.py
Version 2023.1.4 (2023-01-16)¶
What's Changed¶
- Add helper, central tests
- Add more tests and test based refactorings
- Reduce backend calls and logging during lost connection
- Remove obsolete parse_ccu_sys_var
- Update color_conversion threshold by @guillempages
Version 2023.1.3 (2023-01-13)¶
What's Changed¶
- Unify event parameters
- Refactor entity.py for better event support
- Fix wrong warning after set_system_variable
- Add validation to event_data
Version 2023.1.2 (2023-01-10)¶
What's Changed¶
- Remove OPERATING_VOLTAGE from HmIP-BROLL, HmIP-FROLL
- Remove loop from test signature
- Cleanup ignore/unignore handling and add tests
Version 2023.1.1 (2023-01-09)¶
What's Changed¶
- No longer create ClientSession in json_rpc_client for tests
- Add backend tests
- Use mocked local client to check method_calls
- Remove sleep after connection_checker stops
- Remove LOWBAT from HM-LC-Sw1-Pl, HM-LC-Sw2-FM
- Simplify entity de-/registration
- Refactor add/delete device and add tests
- Add un_ignore_list to test config
- Allow unignore for DEVICE_ERROR_EVENTS
Version 2023.1.0 (2023-01-01)¶
What's Changed¶
- API Cleanup
- Allow to disable cache
- Allow to disable un_ignore load
- Add local client
- Use local client in tests
- Move event() code to central_unit
- Move listDevices() code to central_unit
Version 2022.12.12 (2022-12-30)¶
What's Changed¶
- Add un_ignore list to central config
- Fix entity_definition schema
- Rename cache_dict to persistent_cache
- Reduce access to internal complex objects for custom_component
Version 2022.12.11 (2022-12-28)¶
What's Changed¶
- Rename climate presets from 'Profile ' to 'week*program*'
- Add support for python 3.11
Version 2022.12.10 (2022-12-27)¶
What's Changed¶
- Make constant assignment final
- Fix native device units
Version 2022.12.9 (2022-12-25)¶
What's Changed¶
- Remove empty unit for numeric sysvars
- Add enable_default to entity
- Remove some warn level parameters from ignore list
Version 2022.12.8 (2022-12-22)¶
What's Changed¶
- Reformat code / check with flake8
- Refactor entity inheritance
Version 2022.12.7 (2022-12-21)¶
What's Changed¶
- Send ERROR_* parameters as homematic.device_error event
Version 2022.12.6 (2022-12-20)¶
What's Changed¶
- Add additional checks for custom entities
- Code Cleanup
Version 2022.12.5 (2022-12-17)¶
What's Changed¶
- Code Cleanup
- Remove sub_type from model to simplify code
- Remove obsolete methods
- Refactor binary_sensor check
- Convert value_list to tuple
- Use tuple for immutable lists
Version 2022.12.4 (2022-12-13)¶
What's Changed¶
- Fix disable away_mode in climate. Now goes back to the origin control_mode.
Version 2022.12.3 (2022-12-12)¶
What's Changed¶
- Disable temperature validation for setting to off for HM heating group HM-CC-VG-1
Version 2022.12.2 (2022-12-09)¶
What's Changed¶
- Add HM-LC-AO-SM as light
- Remove hub from HmPlatform
- Hub is no longer an entity
Version 2022.12.1 (2022-12-01)¶
What's Changed¶
- Improve naming of modules
- Add new platform for text sysvars
Version 2022.12.0 (2022-12-01)¶
What's Changed¶
- Add transition to light turn_off
- Remove min brightness of 10 for lights
Version 2022.11.2 (2022-11-13)¶
What's Changed¶
- Generalize some collection helpers
Version 2022.11.1 (2022-11-03)¶
What's Changed¶
- Rename protected attributes to _attr*
- Code cleanup
- Add option to wrap entities to a different platform
- Wrap LEVEL of HmIP-TRV*, HmIP-HEATING to sensor
Version 2022.11.0 (2022-11-02)¶
What's Changed¶
- Rename ATTR*HM*_ to HM_
- Use generic property implementation
Version 2022.10.10 (2022-10-25)¶
What's Changed¶
- Use min_temp if target_temp < min_temp
- Remove event_loop from signatures
- Refactor central_config, create xml_rpc server in central_unit
Version 2022.10.9 (2022-10-23)¶
What's Changed¶
- Fix don't hide unignored parameters
- Refactor refesh_entity_data. Allow restriction to paramset and cache age.
Version 2022.10.8 (2022-10-21)¶
What's Changed¶
- Add semaphore to fetch sysvar and programs from backend
Version 2022.10.7 (2022-10-20)¶
What's Changed¶
- Accept some existing prefix for sysvars and programs to avoid additional prefixing with Sv* / P*
- accepted sysvar prefixes: V*, Sv*
- accepted program prefixes: P*, Prg*
- Read min/max temperature for climate devices
- Min set temperature for thermostats is now 5.0 degree. 4.5. degree is only off
Version 2022.10.6 (2022-10-15)¶
What's Changed¶
- Replace data_* by HmDataOperationResult
- Use HmHvacMode HEAT instead of AUTO for simple thermostats
- Add HUMIDITY and ACTUAL_TEMPERATURE to heating groups
Version 2022.10.5 (2022-10-11)¶
What's Changed¶
- Set Hm Thermostat to manual mode before switching off
Version 2022.10.4 (2022-10-10)¶
What's Changed¶
- Allow entity creation for some internal parameters
Version 2022.10.3 (2022-10-10)¶
What's Changed¶
- Fix HM Blind/Cover custom entity types
Version 2022.10.2 (2022-10-08)¶
What's Changed¶
- Make connection checker more resilient:
- Reduce connection checker interval to 15s
- Connection is not connected, if three consecutive checks fail.
Version 2022.10.1 (2022-10-05)¶
What's Changed¶
- Ignore OPERATING_VOLTAGE for HmIP-PMFS
- Add ALPHA-IP-RBG
Version 2022.10.0 (2022-10-01)¶
What's Changed¶
- Rename hub event
- Remove "Servicemeldungen" from sysvars. It's already included in the hub_entity (sensor.{instance_name})
Version 2022.9.1 (2022-09-20)¶
What's Changed¶
- Improve XmlServer shutdown
- Add name to threads and executors
- Improve ThreadPoolExecutor shutdown
Version 2022.9.0 (2022-09-02)¶
What's Changed¶
- Exclude value from event_data if None
Version 2022.8.15 (2022-08-27)¶
What's Changed¶
- Fix select entity detection
Version 2022.8.14 (2022-08-23)¶
What's Changed¶
- Exclude STRING sysvar from extended check
Version 2022.8.13 (2022-08-23)¶
What's Changed¶
- Allow three states for a forced availability of a device
Version 2022.8.12 (2022-08-23)¶
What's Changed¶
- Add device_type to device availability event
- Code deduplication and small fixes
Version 2022.8.11 (2022-08-18)¶
What's Changed¶
- Adjust logging (level and message)
- Delete sysvar if type changes
Version 2022.8.10 (2022-08-16)¶
What's Changed¶
- Improve readability of XmlRpc server
- Remove module data
Version 2022.8.9 (2022-08-16)¶
What's Changed¶
- Fix check if thread is started
Version 2022.8.8 (2022-08-16)¶
What's Changed¶
- Remove unused local_ip from XmlRPCServer
- Create all XmlRpc server by requested port(s)
Version 2022.8.7 (2022-08-12)¶
What's Changed¶
- Fix hs_color for CeColorDimmer(HM-LC-RGBW-WM)
Version 2022.8.6 (2022-08-12)¶
What's Changed¶
- Reduce api calls for light
Version 2022.8.5 (2022-08-11)¶
What's Changed¶
- Add cache for rega script files
Version 2022.8.4 (2022-08-08)¶
What's Changed¶
- Add platform as field and remove obsolete constructors
- Reduce member
Version 2022.8.3 (2022-08-07)¶
What's Changed¶
- Remove CHANNEL_OPERATION_MODE from cover ce
- Refactor get_value/set_value
- Remove domain from model
- Rename unique_id to unique_identifier
- Remove should_poll from model
Version 2022.8.2 (2022-08-02)¶
What's Changed¶
- Remove obsolete methods
- Remove obsolete device_address parameter
- Rename sysvar to hub entity
- Add program buttons
Version 2022.8.0 (2022-08-01)¶
What's Changed¶
- Fix pylint, mypy issues due to newer versions
- Remove properties of final members
- Add types to Final
- Init entity fields in init method
- Remove device_info from model
- Remove attributes from model
Version 2022.7.14 (2022-07-28)¶
What's Changed¶
- Add HmIP-BS2 to custom entities
- Remove force and add call_source for getValue
Version 2022.7.13 (2022-07-22)¶
What's Changed¶
- Cleanup API
- Limit init cache time usage
- Avoid repetitive calls to CCU within max_age_seconds
Version 2022.7.12 (2022-07-21)¶
What's Changed¶
- Add ELV-SH-BS2 to custom entities
- Code Cleanup
- Rearrange validity check
- Cleanup entity code
Version 2022.7.11 (2022-07-19)¶
What's Changed¶
- Raise interval for alive checks
Version 2022.7.10 (2022-07-19)¶
What's Changed¶
- Use entities instead of values inside custom entities
- Fix _check_connection for Homegear/CCU
Version 2022.7.9 (2022-07-17)¶
What's Changed¶
- Remove state_uncertain from default attributes
Version 2022.7.8 (2022-07-13)¶
What's Changed¶
- Fix entity update
Version 2022.7.7 (2022-07-12)¶
What's Changed¶
- Fix naming of custom entity
Version 2022.7.6 (2022-07-12)¶
What's Changed¶
- Fix last_state handling for custom entities
Version 2022.7.5 (2022-07-11)¶
What's Changed¶
- Rename value_uncertain to state_uncertain
- Add state_uncertain to custom entity
Version 2022.7.4 (2022-07-11)¶
What's Changed¶
- Set value_uncertain to True if no data could be loaded from CCU
Version 2022.7.3 (2022-07-10)¶
What's Changed¶
- Set default value for hub entity to None
Version 2022.7.2 (2022-07-10)¶
What's Changed¶
- Align entity naming to HA entity name
- Ensure entity value refresh after reconnect
- Ignore further parameters by device
Version 2022.7.1 (2022-07-07)¶
What's Changed¶
- Better distinguish between NO_CACHE_ENTRY and None
Version 2022.7.0 (2022-07-07)¶
What's Changed¶
- Switch to calendar versioning
Version 1.9.4 (2022-07-03)¶
What's Changed¶
- Load MASTER data on initial load
Version 1.9.3 (2022-07-02)¶
What's Changed¶
- Fix export of device definitions
Version 1.9.2 (2022-07-01)¶
What's Changed¶
- Use CHANNEL_OPERATION_MODE for devices with MULTI_MODE_INPUT_TRANSMITTER, KEY_TRANSCEIVER channels
- Re-Add HmIPW-FIO6 to custom device handling
Version 1.9.1 (2022-06-29)¶
What's Changed¶
- Remove HmIPW-FIO6 from custom device handling
Version 1.9.0 (2022-06-09)¶
What's Changed¶
- Refactor entity name creation
- Cleanup entity selection
- Add button to virtual remote
Version 1.8.6 (2022-06-07)¶
What's Changed¶
- Code cleanup
Version 1.8.5 (2022-06-06)¶
What's Changed¶
- Remove sysvars if deleted from CCU
- Add check for sysvar type in sensor
- Remove unused sysvar attributes
- Refactor HmEntityDefinition
Version 1.8.4 (2022-06-04)¶
What's Changed¶
- Refactor all sysvar script
- Use ext_marker script in combination with SysVar.getAll
Version 1.8.3 (2022-06-04)¶
What's Changed¶
- Refactor sysvar creation eventing
Version 1.8.2 (2022-06-03)¶
What's Changed¶
- Fix build
Version 1.8.1 (2022-06-03)¶
What's Changed¶
- Use marker in sysvar description for extended sysvars
Version 1.8.0 (2022-06-02)¶
What's Changed¶
- Enable additional sysvar entity types
Version 1.7.3 (2022-06-01)¶
What's Changed¶
- Add more debug logging
Version 1.7.2 (2022-06-01)¶
What's Changed¶
- Better differentiate between float and int for sysvars
- Switch from # as unit placeholder for sysvars to ' '
- Move sysvar length check to sensor
Version 1.7.1 (2022-05-31)¶
What's Changed¶
- Rename parameter channel_address to address for put/get_paramset
Version 1.7.0 (2022-05-31)¶
What's Changed¶
- Refactor system variables
- Add more types for sysvar entities
Version 1.6.2 (2022-05-30)¶
What's Changed¶
- Add more options for boolean conversions
Version 1.6.1 (2022-05-29)¶
What's Changed¶
- Fix entity definition for HMIP-HEATING
Version 1.6.0 (2022-05-29)¶
What's Changed¶
- Add impulse event
- Add LEVEL and STATE to HmIP-Heating group to display hvac_action
- Add device_type as model to attributes
Version 1.5.4 (2022-05-24)¶
What's Changed¶
- Add function attribute only if set
Version 1.5.3 (2022-05-24)¶
What's Changed¶
- Rename subsection to function
Version 1.5.2 (2022-05-24)¶
What's Changed¶
- Add subsection to attributes
- Use parser for internal sysvars
Version 1.5.0 (2022-05-23)¶
What's Changed¶
- Add option to replace too technical parameter name by friendly parameter name
- Ignore more parameters by device
- Use dataclass for sysvars
- Limit sysvar length to 255 chars due to HA limitations
Version 1.4.0 (2022-05-16)¶
What's Changed¶
- Block parameters by device_type that should not create entities in HA
- Fix remove instance on shutdown
Version 1.3.1 (2022-05-13)¶
What's Changed¶
- Increase connection timeout(30s->60s) and reconnect interval(90s->120s) to better support slower hardware
Version 1.3.0 (2022-05-06)¶
What's Changed¶
- Use unit for vars, if available
- Remove special handling for pydevccu
- Remove set boost mode to false, when preset is none for bidcos climate entities
Version 1.2.2 (2022-05-02)¶
What's Changed¶
- Fix light channel for multi dimmer
Version 1.2.1 (2022-04-27)¶
What's Changed¶
- Fix callback alive check
- Reconnect clients based on outstanding xml callback events
Version 1.2.0 (2022-04-26)¶
What's Changed¶
- Cleanup build
Version 1.1.5 (2022-04-25)¶
What's Changed¶
- Reorg light attributes
- Add on_time to light and switch
Version 1.1.4 (2022-04-21)¶
What's Changed¶
- Use min as default if default is unset for parameter_data
Version 1.1.3 (2022-04-20)¶
What's Changed¶
- Add CeColorDimmer
- Fix interface_event
Version 1.1.2 (2022-04-12)¶
What's Changed¶
- Add extra_params to _post_script
- Add set_system_variable with string value
- Disallow html tags in string system variable
Version 1.1.1 (2022-04-11)¶
What's Changed¶
- Read # Version and serial in get_client
Version 1.1.0 (2022-04-09)¶
What's Changed¶
- Add BATTERY_STATE to DEFAULT_ENTITIES
- Migrate device_info to dataclass
- Add rega script (provided by @baxxy13) to get serial from CCU
- Add method to clean up cache dirs
Version 1.0.6 (2022-04-06)¶
What's Changed¶
- Revert to XmlRPC getValue and getParamset for CCU
Version 1.0.5 (2022-04-05)¶
What's Changed¶
- Limit hub_state to ccu only
Version 1.0.4 (2022-03-30)¶
What's Changed¶
- Use max # Version of interfaces for backend version
- Remove device as parameter from parameter_availability
- Add XmlRPC.listDevice to Client
- Add start_direct for starts without waiting for events (only for temporary usage)
Version 1.0.3 (2022-03-30)¶
What's Changed¶
- Revert to XmlRPC get# Version for CCU
Version 1.0.2 (2022-03-29)¶
What's Changed¶
- Revert to XmlRPC getParamsetDescription for CCU
Version 1.0.1 (2022-03-29)¶
What's Changed¶
- Add central_id for uniqueness of heating groups, sysvars and hub
Version 1.0.0 (2022-03-28)¶
What's Changed¶
- Simplify json usage
- Move json methods to json client
- Make json client independent from central config
- Add get_serial to validate
- Use serial for sysvar unique_ids
- Rename domain for test and example from hahm to homematicip_local
Version 0.38.5 (2022-03-22)¶
What's Changed¶
- Use interface_id for interface events
- Add support for color temp dimmer
Version 0.38.4 (2022-03-21)¶
What's Changed¶
- Fix interface name for BidCos-Wired
Version 0.38.3 (2022-03-20)¶
What's Changed¶
- Add check for available API method to identify BidCos Wired
- Cleanup backend identification
Version 0.38.2 (2022-03-20)¶
What's Changed¶
- Catch SysVar parsing exceptions
Version 0.38.1 (2022-03-20)¶
What's Changed¶
- Fix lock/unlock for HM-Sec-Key
Version 0.38.0 (2022-03-20)¶
What's Changed¶
- Add central validation
- Add jso_rpc.post_script
Version 0.37.7 (2022-03-18)¶
What's Changed¶
- Add additional system_listMethods to avoid errors on CCU
Version 0.37.6 (2022-03-18)¶
What's Changed¶
- Add JsonRPC.Session.logout before central stop to avoid warn logs at CCU.
Version 0.37.5 (2022-03-18)¶
What's Changed¶
- Add api for available interfaces
- Send event if interface is not available
- Don't block available interfaces
Version 0.37.4 (2022-03-17)¶
What's Changed¶
- Fix reload paramset
- Fix value converter
Version 0.37.3 (2022-03-17)¶
What's Changed¶
- Cleanup caching code
Version 0.37.2 (2022-03-17)¶
What's Changed¶
- Use homematic script to fetch initial data for CCU/HM
Version 0.37.1 (2022-03-16)¶
What's Changed¶
- Add semaphore(1) to improve cache usage (less api calls)
Version 0.37.0 (2022-03-15)¶
What's Changed¶
- Avoid unnecessary prefetches
- Fix JsonRPC Session handling
- Rename NamesCache to DeviceDetailsCache
- Move RoomCache to DeviceDetailsCache
- Move hm value converter to helpers
- Use JSON RPC for get_value, get_paramset, get_paramset_description
- Use default for binary_sensor
Version 0.36.3 (2022-03-09)¶
What's Changed¶
- Add hub property
- Add check if callback is already registered
- Use callback when hub is created
Version 0.36.2 (2022-03-06)¶
What's Changed¶
- Fix cover device mapping
Version 0.36.1 (2022-03-06)¶
What's Changed¶
- Small climate fix
- Make more devices custom_entities
Version 0.36.0 (2022-02-24)¶
What's Changed¶
- Remove HA constants
- Use enums own constants
Version 0.35.3 (2022-02-23)¶
What's Changed¶
- Move xmlrpc credentials to header
Version 0.35.2 (2022-02-22)¶
What's Changed¶
- Remove password from Exceptions
Version 0.35.1 (2022-02-21)¶
What's Changed¶
- Fix IpBlind
- Fix parameter visibility
Version 0.35.0 (2022-02-19)¶
What's Changed¶
- Fix usage of async_add_executor_job
- Improve local_ip identification
Version 0.34.2 (2022-02-16)¶
What's Changed¶
- Add is_locking/is_unlocking to lock
Version 0.34.1 (2022-02-16)¶
What's Changed¶
- Fix siren definition
Version 0.34.0 (2022-02-15)¶
What's Changed¶
- Use backported StrEnum
- Sort constants to identify HA constants
- Add new platform siren
Version 0.33.0 (2022-02-14)¶
What's Changed¶
- Make parameter availability more robust
- Add hvac_action to IP Thermostats
- Add hvac_action to some HM Thermostats
Version 0.32.4 (2022-02-12)¶
What's Changed¶
- add opening/closing to IPGarage
Version 0.32.3 (2022-02-12)¶
What's Changed¶
- Add state to HmIP-MOD-HO
- Use enum value for actions
Version 0.32.2 (2022-02-11)¶
What's Changed¶
- Fix HmIP-MOD-HO
Version 0.32.1 (2022-02-11)¶
What's Changed¶
- Update to pydevccu 0.1.3
- Priotize detection of devices for custom entities (e.g. HmIP-PCBS2)
- Add HmIPW-FIO6 as CE
Version 0.32.0 (2022-02-10)¶
What's Changed¶
- Move create_devices to central
- Move parameter visibility relevant data to own module
Version 0.31.2 (2022-02-08)¶
What's Changed¶
- Add HmIP-HDM2 to cover
- Fix unignore filename
Version 0.31.1 (2022-02-07)¶
What's Changed¶
- Improve naming
- Add multiplier to entity
- Substitute device_type of HB devices for usage in custom_entities
Version 0.31.0 (2022-02-06)¶
What's Changed¶
- Add missing return statement
- Add last_update to every value_cache_entry
- Rename init_entity_value to load_entity_value
- move (un)ignore methods to device
- Add support for unignore file
- Make PROCESS a binary_sensor
- Add DIRECTION & ACTIVITY_STATE to cover (is_opening, is_closing)
Version 0.30.1 (2022-02-04)¶
What's Changed¶
- Start hub earlier
Version 0.30.0 (2022-02-03)¶
What's Changed¶
- Add paramset to entity
- Add CHANNEL_OPERATION_MODE for HmIP(W)-DRBL4
- Fix DLD lock_state
- Add is_jammed to locks
Version 0.29.2 (2022-02-02)¶
What's Changed¶
- Add support for blacklisting a custom entity
- Add HmIP-STH to climate custom entities
Version 0.29.1 (2022-02-02)¶
What's Changed¶
- Check if interface callback is alive
- Add class for HomeamaticIP Blinds
Version 0.29.0 (2022-02-01)¶
What's Changed¶
- Make device availability dependent on the client
- Fire event about interface availability
Version 0.28.7 (2022-01-30)¶
What's Changed¶
- Add additional check to reconnect
Version 0.28.6 (2022-01-30)¶
What's Changed¶
- Optimize get_value caching
Version 0.28.5 (2022-01-30)¶
What's Changed¶
- Extend device cache to use get_value
Version 0.28.4 (2022-01-30)¶
What's Changed¶
- Limit read proxy workers to 1
Version 0.28.3 (2022-01-29)¶
What's Changed¶
- Rename RawDevicesCache to DeviceDescriptionCache
Version 0.28.2 (2022-01-29)¶
What's Changed¶
- Make names cache non persistent
- Bump pydevccu to 0.1.2
Version 0.28.1 (2022-01-28)¶
What's Changed¶
- Update hub.py to match GenericEntity
- Cleanup central API
- Use dedicated proxy for mass read operations, to avoid blocking of connection checker
Version 0.28.0 (2022-01-27)¶
What's Changed¶
- Try create client after init failure
- Reduce CCU calls
Version 0.27.2 (2022-01-25)¶
What's Changed¶
- Optimize data_load
Version 0.27.1 (2022-01-25)¶
What's Changed¶
- Fix naming paramset -> paramset_description pt2
- Optimize data_load by using get_paramset
Version 0.27.0 (2022-01-25)¶
What's Changed¶
- Fix naming paramset -> paramset_description
- Add get_value and get_paramset to central
- Add hmcli.py as command line script
Version 0.26.0 (2022-01-22)¶
What's Changed¶
- Make whitelist for parameter depend on the device_type/sub_type
- Add additional params for HM-SEC-Win (DIRECTION, ERROR, WORKING, STATUS)
- Add additional params for HM-SEC-Key (DIRECTION, ERROR)
- Assign secondary channels for HM dimmers
- Remove explicit wildcard in entity_definition
Version 0.25.0 (2022-01-19)¶
What's Changed¶
- Remove SpecialEvents
- Make UNREACH, STICKY_UNREACH, CONFIG_PENDING generic entities
- init UNREACH ... on init
- only poll sysvars when central is available
Version 0.24.4 (2022-01-18)¶
What's Changed¶
- Improve logging
-
Generic schema for entities is name(str):channel(int), everything else is custom.
-
Fix sysvar unique_id
- Slugify sysvar name
- Kill executor on shutdown
- Catch ValueError on conversion
- Add more data to logging
Version 0.24.0-0.24.2 (2022-01-17)¶
What's Changed¶
- Improve exception handling
Version 0.23.3 (2022-01-16)¶
What's Changed¶
- Update fix_rssi according to doc
Version 0.23.1 (2022-01-16)¶
What's Changed¶
- Add more logging to reconnect
- Add doc link for RSSI fix
Version 0.23.0 (2022-01-16)¶
What's Changed¶
- Make ["DRY", "RAIN"] sensor a binary_sensor
- Add converter to sensor value
- HmIP-SCTH230 CONCENTRATION to int
- Fix RSSI
- raise connection_checker interval to 60s
- Add sleep interval(120s) to wait with reconnect after successful connection check
Version 0.22.2 (2022-01-15)¶
What's Changed¶
- Rename hub extra_state_attributes to attributes
Version 0.22.1 (2022-01-15)¶
What's Changed¶
- Add VALVE_STATE for hm climate
- Add entity_type to attributes
- Accept LOWBAT only on channel 0
Version 0.22.0 (2022-01-14)¶
What's Changed¶
- Move client management to central
- Add rooms
- Move calls to create_devices and start_connection_checker
Version 0.21.2 (2022-01-13)¶
What's Changed¶
- Add ERROR_LOCK form HmIP-DLD
- Remove ALARM_EVENTS
Version 0.21.1 (2022-01-13)¶
What's Changed¶
- Fix event identification and generation
Version 0.21.0 (2022-01-13)¶
What's Changed¶
- Remove typecast for text, binary_sensor and number
- Don't exclude Servicemeldungen from sysvars
- Use Servicemeldungen sysvar for hub state
- Add test for HM-CC-VG-1 (HM-Heatinggroup)
- Remove additional typecasts for number
Version 0.20.0 (2022-01-12)¶
What's Changed¶
- Add converter to BaseParameterEntity/GenericEntity
- Fix number entities returning None when 0
Version 0.19.0 (2022-01-11)¶
What's Changed¶
- Mark secondary channels name with a V → Vch
Version 0.18.1 (2022-01-10)¶
What's Changed¶
- Reduce some log_level
- Fix callback to notify un_reach
Version 0.18.0 (2022-01-09)¶
What's Changed¶
- Add config option to specify storage directory
- Move Exceptions to own module
- Add binary_sensor platform for SVs
- Add config check
- Add hub_entities_by_platform
- Remove option_enable_sensors_for_system_variables
Version 0.17.1 (2022-01-09)¶
What's Changed¶
- Fix naming for multi channel custom entities
Version 0.17.0 (2022-01-09)¶
What's Changed¶
- Refactor entity definition
- improve naming
- classify entities (primary, secondary, sensor, Generic, Event)
- remove option_enable_virtual_channels from central
- remove entity.create_in_ha. Replaced by HmEntityUsage
Version 0.16.2 (2022-01-08)¶
What's Changed¶
- Fix enum str in entity definition
Version 0.16.1 (2022-01-08)¶
What's Changed¶
- Use helper for device_name
- Add logging to show usage of unique_id in name
- Add HmIPW-WRC6 to custom entities
- Add HmIP-SCTH230 to custom entities
- Refactor entity definition
- Remove unnecessary field names from additional entity definitions
- Add additional entity definitions by device type
Version 0.16.0 (2022-01-08)¶
What's Changed¶
- Return unique_id if name is not in cache
- Remove no longer needed press_virtual_remote_key
Version 0.15.2 (2022-01-07)¶
What's Changed¶
- Add devices to CustomEntity
- HmIP-WGC
- HmIP-WHS
- Update to pydevccu 0.1.0
Version 0.15.1 (2022-01-07)¶
What's Changed¶
- Identify virtual remote by device type
- Fix Device Exporter / format output
Version 0.15.0 (2022-01-07)¶
What's Changed¶
- Use actions instead of buttons for virtual remotes
Version 0.14.1 (2022-01-06)¶
What's Changed¶
- Remove SVs from EXCLUDED_FROM_SENSOR
Version 0.14.0 (2022-01-06)¶
What's Changed¶
- Switch some HM-LC-Bl1 to cover
- Use decorators on central methods
- Make decorators async aware
- Don't exclude DutyCycle, needed for old rf-modules
- Don't exclude Watchdog from SV sensor
- Ignore mypy error
Version 0.13.3 (2022-01-05)¶
What's Changed¶
- HM cover fix: check level for None
- Only device_address is required for HA callback
- Fix: max_temp issue for hm thermostats
- Fix: hm const are str instead of int
Version 0.13.2 (2022-01-04)¶
What's Changed¶
- Fix cover state
- Move delete_devices from RPCFunctions to central
- Move new_devices from RPCFunctions to central
- Add method to delete a single device to central
Version 0.13.1 (2022-01-04)¶
What's Changed¶
- Use generic climate profiles list
Version 0.13.0 (2022-01-04)¶
What's Changed¶
- Remove dedicated json tls option
- Fix unique_id for heating_groups
- Use domain name as base folder name
- Remove domain const from aiohomematic
Version 0.12.0 (2022-01-03)¶
What's Changed¶
- Split number to integer and float
Version 0.11.2 (2022-01-02)¶
What's Changed¶
- Precise entity definitions
Version 0.11.1 (2022-01-02)¶
What's Changed¶
- Improve detection of multi channel devices
Version 0.11.0 (2022-01-02)¶
What's Changed¶
- Add positional arguments
- Add missing channel no
- Set ED_PHY_CHANNEL min_length to 1
- Add platform zu hub entities
- Use entities in properties
- Add transition to dimmer
- Rename entity.state to entity.value
- Remove channel no, if channel is the only_primary_channel
Version 0.10.0 (2021-12-31)¶
What's Changed¶
- Make reset_motion, reset_presence a button
- add check to device_name / Fixes
Version 0.9.1 (2021-12-30)¶
What's Changed¶
- Load and clear caches async
- Extend naming strategy to use device name if channel name is not customized
Version 0.9.0 (2021-12-30)¶
What's Changed¶
- Add new helper for event_name
- Add channel to click_event payload
Version 0.8.0 (2021-12-29)¶
What's Changed¶
- Use base class for file cache
- Rename primary_client to client
- Add export for device definition
Version 0.7.0 (2021-12-28)¶
What's Changed¶
- Remove deleted entities from device and central collections
- use datetime for last_events
- Climate IP: use calendar for duration away
Version 0.6.1 (2021-12-27)¶
What's Changed¶
- Display profiles only when hvac_mode auto is enabled
- Fix binary sensor state update for hmip 2-state sensors
Version 0.6.0 (2021-12-27)¶
What's Changed¶
- Add climate methods for away mode
- Fix HVAC_MODE_OFF for climate
Version 0.5.1 (2021-12-26)¶
What's Changed¶
- Fix hm_light turn_off
Version 0.5.0 (2021-12-25)¶
What's Changed¶
- Fix Select Entity
- Remove internal device temperature (ACTUAL_TEMPERATURE CH0)
- Support Cool Mode for IPThermostats
- Display if AWAY_MODE is set on thermostat
- Separate device_address and channel_address
Version 0.4.0 (2021-12-24)¶
What's Changed¶
- Use datetime for last_updated (time_initialized)
- Fix example
- Add ACTUAL_TEMPERATURE as separate entity by @towo
- Add HEATING_COOLING to IPThermostat and Group
- Add ()HUMIDITY and ()TEMPERATURE as separate entities for Bidcos thermostats
- use ACTIVE_PROFILE in climate presets
Version 0.3.1 (2021-12-23)¶
What's Changed¶
- Make HmIP-BSM a switch (only dimable devices should be lights)
Version 0.3.0 (2021-12-23)¶
What's Changed¶
- Cleanup API, device/entity
- Add ACTIVE_PROFILE to IPThermostat
Version 0.2.0 (2021-12-22)¶
What's Changed¶
- Cleanup API, reduce visibility
- Add setValue to client
Version 0.1.2 (2021-12-21)¶
What's Changed¶
- Rotate device identifier
Version 0.1.1 (2021-12-21)¶
What's Changed¶
- Remove unnecessary async
- Removed unused helper
- Add interface_id to identifiers in device_info
Version 0.1.0 (2021-12-20)¶
What's Changed¶
- Bump # Version to 0.1.0
- Remove interface_id from get_entity_name and get_custom_entity_name
- Add initial test
- Add coverage config
Version 0.0.22 (2021-12-16)¶
What's Changed¶
- Resolve names without interface
- Fix device.entities for virtual remotes
- Remove unused const
- Cache model and primary_client
Version 0.0.21 (2021-12-15)¶
What's Changed¶
- Fix number set_state
- Update ignore list
- Fix select entity
Version 0.0.20 (2021-12-14)¶
What's Changed¶
- Move caches to classes
Version 0.0.19 (2021-12-12)¶
What's Changed¶
- Add helper for address
- Fixes for Hub init
Version 0.0.18 (2021-12-11)¶
What's Changed¶
- Add type hints based on HA coding guidelines
- Rename device_description to entity_definition
- Send alarm event on value change
- Rename impulse to special events
- reduce event_callbacks
Version 0.0.17 (2021-12-05)¶
What's Changed¶
- Remove variables that are covered by other sensors (CCU only)
- Remove dummy from service message (HmIP-RF always sends 0001D3C98DD4B6:3 unreach)
- Rename Bidcos thermostats to SimpleRfThermostat and RfThermostat
- Use more Enums (like HA does): HmPlatform, HmEventType
- Use assignment expressions
- Add more type hints (fix most mypy errors)
Version 0.0.16 (2021-12-02)¶
What's Changed¶
- Don't use default entities for climate groups (already included in device)
Version 0.0.15 (2021-12-01)¶
What's Changed¶
- Fix: remove wildcard for HmIP-STHD
- Add unit to hub entities
Version 0.0.14 (2021-11-30)¶
What's Changed¶
- Add KeyMatic
- Add HmIP-MOD-OC8
- Add HmIP-PCBS, HmIP-PCBS2, HmIP-PCBS-BAT, HmIP-USBSM
- Remove xmlrpc calls related to ccu system variables (not supported by api)
- Update hub sensor excludes
Version 0.0.13 (2021-11-29)¶
What's Changed¶
- Add HmIP-MOD-HO, HmIP-MOD-TM
- Add sub_type to device/entity
- Add PRESET_NONE to climate
- Add level und state as additional entities for climate
Version 0.0.12 (2021-11-27)¶
What's Changed¶
- Add more type converter
- Move get_tls_context to helper
- Update requirements
- Cleanup constants
- Use flags from parameter_data
- Add wildcard start to exclude parameters that start with word
- Fix channel assignment for dimmers
- Fix entity name: add channel only if a parameter name exists is in multiple channels of the device.
Version 0.0.11 (2021-11-26)¶
What's Changed¶
- Fix: cover open/close default values to float
- Fix: add missing async/await
- make get_primary_client public
Version 0.0.10 (2021-11-26)¶
What's Changed¶
- Fix TLS handling
Version 0.0.9 (2021-11-25)¶
What's Changed¶
- Don't start connection checker for pydevccu
- Use a dummy hub for pydevccu
- Convert min, max, default values (fix for cover)
Version 0.0.8 (2021-11-25)¶
What's Changed¶
- Add button platform. This allows to use the virtual remotes of a ccu in automations.
- Cleanup entity inheritance.
Version 0.0.7 (2021-11-23)¶
What's Changed¶
- Switch to a non-permanent session for jsonrpc calls The json capabilities of a ccu are limited (3 parallel session!?!). So we no longer us a persisted session. (like pyhomematic)
- Enable write-only params as HMAction(solves a problem with climate writing CONTROL_MODE)
Version 0.0.6 (2021-11-22)¶
What's Changed¶
- Rename server to central_unit (after the extraction of the XMLRPC-Server server has not been a server anymore).
- Rename json_rpc to json_rpc_client
- Move json_rpc from client to central_unit to remove number of active sessions
- Add hub with option to enable own system variables as sensors
Version 0.0.5 (2021-11-20)¶
What's Changed¶
- Add method for virtual remote
- Update entity availability based on connection status
- Fix action_event for ha device trigger
Version 0.0.4 (2021-11-18)¶
What's Changed¶
- Use one XMLRPC-Server for all backends
Version 0.0.3 (2021-11-16)¶
What's Changed¶
- Reduce back to parameters with events
- Rewrite climate-entity creation
- Refactor to Async
- Remove entity_id and replace by unique_id
- Reorg Client/Server/Caches
- Use One Server per backend (CCU/Homegear) with multiple clients/interfaces
- Define device_description for custom_entities
- Create custom_entities for climate, cover, light, lock and switch
- Maintain ignored parameters
- Add collection with wildcard parameters to ignore
- Enable click, impulse and alarm events
- Add connection checker
Version 0.0.2 (2021-04-20)¶
What's Changed¶
- Use input_select for ENUM actors (Issue #8)
- Added
DEVICE_IN_BOOTLOADERandINSTALL_TESTto ignored parameters - Create
switchfor typeACTIONfor parameters with only write-flag - Create
numberfor typeFLOATfor parameters with only write-flag - Add exceptions to abort startup under certain conditions
- Refactoring, introduce
Deviceclass - Allow to fetch single paramset on demand
- Renew JSON-RPC sessions instead of logging in and out all the time
Version 0.0.1 (2021-04-08)¶
What's Changed¶
- Initial testing release