aiohomematic 2026.1.29__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiohomematic/__init__.py +110 -0
- aiohomematic/_log_context_protocol.py +29 -0
- aiohomematic/api.py +410 -0
- aiohomematic/async_support.py +250 -0
- aiohomematic/backend_detection.py +462 -0
- aiohomematic/central/__init__.py +103 -0
- aiohomematic/central/async_rpc_server.py +760 -0
- aiohomematic/central/central_unit.py +1152 -0
- aiohomematic/central/config.py +463 -0
- aiohomematic/central/config_builder.py +772 -0
- aiohomematic/central/connection_state.py +160 -0
- aiohomematic/central/coordinators/__init__.py +38 -0
- aiohomematic/central/coordinators/cache.py +414 -0
- aiohomematic/central/coordinators/client.py +480 -0
- aiohomematic/central/coordinators/connection_recovery.py +1141 -0
- aiohomematic/central/coordinators/device.py +1166 -0
- aiohomematic/central/coordinators/event.py +514 -0
- aiohomematic/central/coordinators/hub.py +532 -0
- aiohomematic/central/decorators.py +184 -0
- aiohomematic/central/device_registry.py +229 -0
- aiohomematic/central/events/__init__.py +104 -0
- aiohomematic/central/events/bus.py +1392 -0
- aiohomematic/central/events/integration.py +424 -0
- aiohomematic/central/events/types.py +194 -0
- aiohomematic/central/health.py +762 -0
- aiohomematic/central/rpc_server.py +353 -0
- aiohomematic/central/scheduler.py +794 -0
- aiohomematic/central/state_machine.py +391 -0
- aiohomematic/client/__init__.py +203 -0
- aiohomematic/client/_rpc_errors.py +187 -0
- aiohomematic/client/backends/__init__.py +48 -0
- aiohomematic/client/backends/base.py +335 -0
- aiohomematic/client/backends/capabilities.py +138 -0
- aiohomematic/client/backends/ccu.py +487 -0
- aiohomematic/client/backends/factory.py +116 -0
- aiohomematic/client/backends/homegear.py +294 -0
- aiohomematic/client/backends/json_ccu.py +252 -0
- aiohomematic/client/backends/protocol.py +316 -0
- aiohomematic/client/ccu.py +1857 -0
- aiohomematic/client/circuit_breaker.py +459 -0
- aiohomematic/client/config.py +64 -0
- aiohomematic/client/handlers/__init__.py +40 -0
- aiohomematic/client/handlers/backup.py +157 -0
- aiohomematic/client/handlers/base.py +79 -0
- aiohomematic/client/handlers/device_ops.py +1085 -0
- aiohomematic/client/handlers/firmware.py +144 -0
- aiohomematic/client/handlers/link_mgmt.py +199 -0
- aiohomematic/client/handlers/metadata.py +436 -0
- aiohomematic/client/handlers/programs.py +144 -0
- aiohomematic/client/handlers/sysvars.py +100 -0
- aiohomematic/client/interface_client.py +1304 -0
- aiohomematic/client/json_rpc.py +2068 -0
- aiohomematic/client/request_coalescer.py +282 -0
- aiohomematic/client/rpc_proxy.py +629 -0
- aiohomematic/client/state_machine.py +324 -0
- aiohomematic/const.py +2207 -0
- aiohomematic/context.py +275 -0
- aiohomematic/converter.py +270 -0
- aiohomematic/decorators.py +390 -0
- aiohomematic/exceptions.py +185 -0
- aiohomematic/hmcli.py +997 -0
- aiohomematic/i18n.py +193 -0
- aiohomematic/interfaces/__init__.py +407 -0
- aiohomematic/interfaces/central.py +1067 -0
- aiohomematic/interfaces/client.py +1096 -0
- aiohomematic/interfaces/coordinators.py +63 -0
- aiohomematic/interfaces/model.py +1921 -0
- aiohomematic/interfaces/operations.py +217 -0
- aiohomematic/logging_context.py +134 -0
- aiohomematic/metrics/__init__.py +125 -0
- aiohomematic/metrics/_protocols.py +140 -0
- aiohomematic/metrics/aggregator.py +534 -0
- aiohomematic/metrics/dataclasses.py +489 -0
- aiohomematic/metrics/emitter.py +292 -0
- aiohomematic/metrics/events.py +183 -0
- aiohomematic/metrics/keys.py +300 -0
- aiohomematic/metrics/observer.py +563 -0
- aiohomematic/metrics/stats.py +172 -0
- aiohomematic/model/__init__.py +189 -0
- aiohomematic/model/availability.py +65 -0
- aiohomematic/model/calculated/__init__.py +89 -0
- aiohomematic/model/calculated/climate.py +276 -0
- aiohomematic/model/calculated/data_point.py +315 -0
- aiohomematic/model/calculated/field.py +147 -0
- aiohomematic/model/calculated/operating_voltage_level.py +286 -0
- aiohomematic/model/calculated/support.py +232 -0
- aiohomematic/model/custom/__init__.py +214 -0
- aiohomematic/model/custom/capabilities/__init__.py +67 -0
- aiohomematic/model/custom/capabilities/climate.py +41 -0
- aiohomematic/model/custom/capabilities/light.py +87 -0
- aiohomematic/model/custom/capabilities/lock.py +44 -0
- aiohomematic/model/custom/capabilities/siren.py +63 -0
- aiohomematic/model/custom/climate.py +1130 -0
- aiohomematic/model/custom/cover.py +722 -0
- aiohomematic/model/custom/data_point.py +360 -0
- aiohomematic/model/custom/definition.py +300 -0
- aiohomematic/model/custom/field.py +89 -0
- aiohomematic/model/custom/light.py +1174 -0
- aiohomematic/model/custom/lock.py +322 -0
- aiohomematic/model/custom/mixins.py +445 -0
- aiohomematic/model/custom/profile.py +945 -0
- aiohomematic/model/custom/registry.py +251 -0
- aiohomematic/model/custom/siren.py +462 -0
- aiohomematic/model/custom/switch.py +195 -0
- aiohomematic/model/custom/text_display.py +289 -0
- aiohomematic/model/custom/valve.py +78 -0
- aiohomematic/model/data_point.py +1416 -0
- aiohomematic/model/device.py +1840 -0
- aiohomematic/model/event.py +216 -0
- aiohomematic/model/generic/__init__.py +327 -0
- aiohomematic/model/generic/action.py +40 -0
- aiohomematic/model/generic/action_select.py +62 -0
- aiohomematic/model/generic/binary_sensor.py +30 -0
- aiohomematic/model/generic/button.py +31 -0
- aiohomematic/model/generic/data_point.py +177 -0
- aiohomematic/model/generic/dummy.py +150 -0
- aiohomematic/model/generic/number.py +76 -0
- aiohomematic/model/generic/select.py +56 -0
- aiohomematic/model/generic/sensor.py +76 -0
- aiohomematic/model/generic/switch.py +54 -0
- aiohomematic/model/generic/text.py +33 -0
- aiohomematic/model/hub/__init__.py +100 -0
- aiohomematic/model/hub/binary_sensor.py +24 -0
- aiohomematic/model/hub/button.py +28 -0
- aiohomematic/model/hub/connectivity.py +190 -0
- aiohomematic/model/hub/data_point.py +342 -0
- aiohomematic/model/hub/hub.py +864 -0
- aiohomematic/model/hub/inbox.py +135 -0
- aiohomematic/model/hub/install_mode.py +393 -0
- aiohomematic/model/hub/metrics.py +208 -0
- aiohomematic/model/hub/number.py +42 -0
- aiohomematic/model/hub/select.py +52 -0
- aiohomematic/model/hub/sensor.py +37 -0
- aiohomematic/model/hub/switch.py +43 -0
- aiohomematic/model/hub/text.py +30 -0
- aiohomematic/model/hub/update.py +221 -0
- aiohomematic/model/support.py +592 -0
- aiohomematic/model/update.py +140 -0
- aiohomematic/model/week_profile.py +1827 -0
- aiohomematic/property_decorators.py +719 -0
- aiohomematic/py.typed +0 -0
- aiohomematic/rega_scripts/accept_device_in_inbox.fn +51 -0
- aiohomematic/rega_scripts/create_backup_start.fn +28 -0
- aiohomematic/rega_scripts/create_backup_status.fn +89 -0
- aiohomematic/rega_scripts/fetch_all_device_data.fn +97 -0
- aiohomematic/rega_scripts/get_backend_info.fn +25 -0
- aiohomematic/rega_scripts/get_inbox_devices.fn +61 -0
- aiohomematic/rega_scripts/get_program_descriptions.fn +31 -0
- aiohomematic/rega_scripts/get_serial.fn +44 -0
- aiohomematic/rega_scripts/get_service_messages.fn +83 -0
- aiohomematic/rega_scripts/get_system_update_info.fn +39 -0
- aiohomematic/rega_scripts/get_system_variable_descriptions.fn +31 -0
- aiohomematic/rega_scripts/set_program_state.fn +17 -0
- aiohomematic/rega_scripts/set_system_variable.fn +19 -0
- aiohomematic/rega_scripts/trigger_firmware_update.fn +67 -0
- aiohomematic/schemas.py +256 -0
- aiohomematic/store/__init__.py +55 -0
- aiohomematic/store/dynamic/__init__.py +43 -0
- aiohomematic/store/dynamic/command.py +250 -0
- aiohomematic/store/dynamic/data.py +175 -0
- aiohomematic/store/dynamic/details.py +187 -0
- aiohomematic/store/dynamic/ping_pong.py +416 -0
- aiohomematic/store/persistent/__init__.py +71 -0
- aiohomematic/store/persistent/base.py +285 -0
- aiohomematic/store/persistent/device.py +233 -0
- aiohomematic/store/persistent/incident.py +380 -0
- aiohomematic/store/persistent/paramset.py +241 -0
- aiohomematic/store/persistent/session.py +556 -0
- aiohomematic/store/serialization.py +150 -0
- aiohomematic/store/storage.py +689 -0
- aiohomematic/store/types.py +526 -0
- aiohomematic/store/visibility/__init__.py +40 -0
- aiohomematic/store/visibility/parser.py +141 -0
- aiohomematic/store/visibility/registry.py +722 -0
- aiohomematic/store/visibility/rules.py +307 -0
- aiohomematic/strings.json +237 -0
- aiohomematic/support.py +706 -0
- aiohomematic/tracing.py +236 -0
- aiohomematic/translations/de.json +237 -0
- aiohomematic/translations/en.json +237 -0
- aiohomematic/type_aliases.py +51 -0
- aiohomematic/validator.py +128 -0
- aiohomematic-2026.1.29.dist-info/METADATA +296 -0
- aiohomematic-2026.1.29.dist-info/RECORD +188 -0
- aiohomematic-2026.1.29.dist-info/WHEEL +5 -0
- aiohomematic-2026.1.29.dist-info/entry_points.txt +2 -0
- aiohomematic-2026.1.29.dist-info/licenses/LICENSE +21 -0
- aiohomematic-2026.1.29.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2021-2026
|
|
3
|
+
"""Module for data points implemented using the update category."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from typing import Final
|
|
9
|
+
|
|
10
|
+
from aiohomematic.const import (
|
|
11
|
+
HMIP_FIRMWARE_UPDATE_IN_PROGRESS_STATES,
|
|
12
|
+
HMIP_FIRMWARE_UPDATE_READY_STATES,
|
|
13
|
+
DataPointCategory,
|
|
14
|
+
Interface,
|
|
15
|
+
InternalCustomID,
|
|
16
|
+
)
|
|
17
|
+
from aiohomematic.decorators import inspector
|
|
18
|
+
from aiohomematic.exceptions import AioHomematicException
|
|
19
|
+
from aiohomematic.interfaces import DeviceProtocol
|
|
20
|
+
from aiohomematic.model.data_point import CallbackDataPoint
|
|
21
|
+
from aiohomematic.model.support import DataPointPathData, generate_unique_id
|
|
22
|
+
from aiohomematic.property_decorators import DelegatedProperty, Kind, config_property, state_property
|
|
23
|
+
from aiohomematic.support import PayloadMixin
|
|
24
|
+
from aiohomematic.type_aliases import DataPointUpdatedHandler, UnsubscribeCallback
|
|
25
|
+
|
|
26
|
+
__all__ = ["DpUpdate"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class DpUpdate(CallbackDataPoint, PayloadMixin):
|
|
30
|
+
"""
|
|
31
|
+
Implementation of a update.
|
|
32
|
+
|
|
33
|
+
This is a default data point that gets automatically generated.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
__slots__ = ("_device",)
|
|
37
|
+
|
|
38
|
+
_category = DataPointCategory.UPDATE
|
|
39
|
+
|
|
40
|
+
def __init__(self, *, device: DeviceProtocol) -> None:
|
|
41
|
+
"""Initialize the callback data_point."""
|
|
42
|
+
PayloadMixin.__init__(self)
|
|
43
|
+
self._device: Final = device
|
|
44
|
+
super().__init__(
|
|
45
|
+
unique_id=generate_unique_id(
|
|
46
|
+
config_provider=device.config_provider,
|
|
47
|
+
address=device.address,
|
|
48
|
+
parameter="Update",
|
|
49
|
+
),
|
|
50
|
+
central_info=device.central_info,
|
|
51
|
+
event_bus_provider=device.event_bus_provider,
|
|
52
|
+
event_publisher=device.event_publisher,
|
|
53
|
+
task_scheduler=device.task_scheduler,
|
|
54
|
+
paramset_description_provider=device.paramset_description_provider,
|
|
55
|
+
parameter_visibility_provider=device.parameter_visibility_provider,
|
|
56
|
+
)
|
|
57
|
+
self._set_modified_at(modified_at=datetime.now())
|
|
58
|
+
|
|
59
|
+
available: Final = DelegatedProperty[bool](path="_device.available", kind=Kind.STATE)
|
|
60
|
+
device: Final = DelegatedProperty[DeviceProtocol](path="_device")
|
|
61
|
+
firmware: Final = DelegatedProperty[str | None](path="_device.firmware", kind=Kind.STATE)
|
|
62
|
+
firmware_update_state: Final = DelegatedProperty[str | None](path="_device.firmware_update_state", kind=Kind.STATE)
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def full_name(self) -> str:
|
|
66
|
+
"""Return the full name of the data_point."""
|
|
67
|
+
return f"{self._device.name} Update"
|
|
68
|
+
|
|
69
|
+
@config_property
|
|
70
|
+
def name(self) -> str:
|
|
71
|
+
"""Return the name of the data_point."""
|
|
72
|
+
return "Update"
|
|
73
|
+
|
|
74
|
+
@state_property
|
|
75
|
+
def in_progress(self) -> bool:
|
|
76
|
+
"""Update installation progress."""
|
|
77
|
+
if self._device.interface == Interface.HMIP_RF:
|
|
78
|
+
return self._device.firmware_update_state in HMIP_FIRMWARE_UPDATE_IN_PROGRESS_STATES
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
@state_property
|
|
82
|
+
def latest_firmware(self) -> str | None:
|
|
83
|
+
"""Latest firmware available for install."""
|
|
84
|
+
if self._device.available_firmware and (
|
|
85
|
+
(
|
|
86
|
+
self._device.interface == Interface.HMIP_RF
|
|
87
|
+
and self._device.firmware_update_state in HMIP_FIRMWARE_UPDATE_READY_STATES
|
|
88
|
+
)
|
|
89
|
+
or self._device.interface in (Interface.BIDCOS_RF, Interface.BIDCOS_WIRED)
|
|
90
|
+
):
|
|
91
|
+
return self._device.available_firmware
|
|
92
|
+
return self._device.firmware
|
|
93
|
+
|
|
94
|
+
async def on_config_changed(self) -> None:
|
|
95
|
+
"""Do what is needed on device config change."""
|
|
96
|
+
|
|
97
|
+
@inspector
|
|
98
|
+
async def refresh_firmware_data(self) -> None:
|
|
99
|
+
"""Refresh device firmware data."""
|
|
100
|
+
await self._device.device_data_refresher.refresh_firmware_data(device_address=self._device.address)
|
|
101
|
+
self._set_modified_at(modified_at=datetime.now())
|
|
102
|
+
|
|
103
|
+
def subscribe_to_data_point_updated(
|
|
104
|
+
self, *, handler: DataPointUpdatedHandler, custom_id: str
|
|
105
|
+
) -> UnsubscribeCallback:
|
|
106
|
+
"""Subscribe to data point updates via EventBus."""
|
|
107
|
+
if custom_id != InternalCustomID.DEFAULT:
|
|
108
|
+
if self._custom_id is not None:
|
|
109
|
+
raise AioHomematicException( # i18n-exc: ignore
|
|
110
|
+
f"SUBSCRIBE failed: hm_data_point: {self.full_name} is already registered by {self._custom_id}"
|
|
111
|
+
)
|
|
112
|
+
self._custom_id = custom_id
|
|
113
|
+
|
|
114
|
+
unsubscribe = self._device.subscribe_to_firmware_updated(handler=handler)
|
|
115
|
+
|
|
116
|
+
# Wrap unsubscribe to also reset custom_id
|
|
117
|
+
def wrapped_unsubscribe() -> None:
|
|
118
|
+
unsubscribe()
|
|
119
|
+
if custom_id != InternalCustomID.DEFAULT:
|
|
120
|
+
self._custom_id = None
|
|
121
|
+
|
|
122
|
+
return wrapped_unsubscribe
|
|
123
|
+
|
|
124
|
+
@inspector
|
|
125
|
+
async def update_firmware(self, *, refresh_after_update_intervals: tuple[int, ...]) -> bool:
|
|
126
|
+
"""Turn the update on."""
|
|
127
|
+
return await self._device.update_firmware(refresh_after_update_intervals=refresh_after_update_intervals)
|
|
128
|
+
|
|
129
|
+
def _get_path_data(self) -> DataPointPathData:
|
|
130
|
+
"""Return the path data of the data_point."""
|
|
131
|
+
return DataPointPathData(
|
|
132
|
+
interface=None,
|
|
133
|
+
address=self._device.address,
|
|
134
|
+
channel_no=None,
|
|
135
|
+
kind=DataPointCategory.UPDATE,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
def _get_signature(self) -> str:
|
|
139
|
+
"""Return the signature of the data_point."""
|
|
140
|
+
return f"{self._category}/{self._device.model}"
|