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.
Files changed (188) hide show
  1. aiohomematic/__init__.py +110 -0
  2. aiohomematic/_log_context_protocol.py +29 -0
  3. aiohomematic/api.py +410 -0
  4. aiohomematic/async_support.py +250 -0
  5. aiohomematic/backend_detection.py +462 -0
  6. aiohomematic/central/__init__.py +103 -0
  7. aiohomematic/central/async_rpc_server.py +760 -0
  8. aiohomematic/central/central_unit.py +1152 -0
  9. aiohomematic/central/config.py +463 -0
  10. aiohomematic/central/config_builder.py +772 -0
  11. aiohomematic/central/connection_state.py +160 -0
  12. aiohomematic/central/coordinators/__init__.py +38 -0
  13. aiohomematic/central/coordinators/cache.py +414 -0
  14. aiohomematic/central/coordinators/client.py +480 -0
  15. aiohomematic/central/coordinators/connection_recovery.py +1141 -0
  16. aiohomematic/central/coordinators/device.py +1166 -0
  17. aiohomematic/central/coordinators/event.py +514 -0
  18. aiohomematic/central/coordinators/hub.py +532 -0
  19. aiohomematic/central/decorators.py +184 -0
  20. aiohomematic/central/device_registry.py +229 -0
  21. aiohomematic/central/events/__init__.py +104 -0
  22. aiohomematic/central/events/bus.py +1392 -0
  23. aiohomematic/central/events/integration.py +424 -0
  24. aiohomematic/central/events/types.py +194 -0
  25. aiohomematic/central/health.py +762 -0
  26. aiohomematic/central/rpc_server.py +353 -0
  27. aiohomematic/central/scheduler.py +794 -0
  28. aiohomematic/central/state_machine.py +391 -0
  29. aiohomematic/client/__init__.py +203 -0
  30. aiohomematic/client/_rpc_errors.py +187 -0
  31. aiohomematic/client/backends/__init__.py +48 -0
  32. aiohomematic/client/backends/base.py +335 -0
  33. aiohomematic/client/backends/capabilities.py +138 -0
  34. aiohomematic/client/backends/ccu.py +487 -0
  35. aiohomematic/client/backends/factory.py +116 -0
  36. aiohomematic/client/backends/homegear.py +294 -0
  37. aiohomematic/client/backends/json_ccu.py +252 -0
  38. aiohomematic/client/backends/protocol.py +316 -0
  39. aiohomematic/client/ccu.py +1857 -0
  40. aiohomematic/client/circuit_breaker.py +459 -0
  41. aiohomematic/client/config.py +64 -0
  42. aiohomematic/client/handlers/__init__.py +40 -0
  43. aiohomematic/client/handlers/backup.py +157 -0
  44. aiohomematic/client/handlers/base.py +79 -0
  45. aiohomematic/client/handlers/device_ops.py +1085 -0
  46. aiohomematic/client/handlers/firmware.py +144 -0
  47. aiohomematic/client/handlers/link_mgmt.py +199 -0
  48. aiohomematic/client/handlers/metadata.py +436 -0
  49. aiohomematic/client/handlers/programs.py +144 -0
  50. aiohomematic/client/handlers/sysvars.py +100 -0
  51. aiohomematic/client/interface_client.py +1304 -0
  52. aiohomematic/client/json_rpc.py +2068 -0
  53. aiohomematic/client/request_coalescer.py +282 -0
  54. aiohomematic/client/rpc_proxy.py +629 -0
  55. aiohomematic/client/state_machine.py +324 -0
  56. aiohomematic/const.py +2207 -0
  57. aiohomematic/context.py +275 -0
  58. aiohomematic/converter.py +270 -0
  59. aiohomematic/decorators.py +390 -0
  60. aiohomematic/exceptions.py +185 -0
  61. aiohomematic/hmcli.py +997 -0
  62. aiohomematic/i18n.py +193 -0
  63. aiohomematic/interfaces/__init__.py +407 -0
  64. aiohomematic/interfaces/central.py +1067 -0
  65. aiohomematic/interfaces/client.py +1096 -0
  66. aiohomematic/interfaces/coordinators.py +63 -0
  67. aiohomematic/interfaces/model.py +1921 -0
  68. aiohomematic/interfaces/operations.py +217 -0
  69. aiohomematic/logging_context.py +134 -0
  70. aiohomematic/metrics/__init__.py +125 -0
  71. aiohomematic/metrics/_protocols.py +140 -0
  72. aiohomematic/metrics/aggregator.py +534 -0
  73. aiohomematic/metrics/dataclasses.py +489 -0
  74. aiohomematic/metrics/emitter.py +292 -0
  75. aiohomematic/metrics/events.py +183 -0
  76. aiohomematic/metrics/keys.py +300 -0
  77. aiohomematic/metrics/observer.py +563 -0
  78. aiohomematic/metrics/stats.py +172 -0
  79. aiohomematic/model/__init__.py +189 -0
  80. aiohomematic/model/availability.py +65 -0
  81. aiohomematic/model/calculated/__init__.py +89 -0
  82. aiohomematic/model/calculated/climate.py +276 -0
  83. aiohomematic/model/calculated/data_point.py +315 -0
  84. aiohomematic/model/calculated/field.py +147 -0
  85. aiohomematic/model/calculated/operating_voltage_level.py +286 -0
  86. aiohomematic/model/calculated/support.py +232 -0
  87. aiohomematic/model/custom/__init__.py +214 -0
  88. aiohomematic/model/custom/capabilities/__init__.py +67 -0
  89. aiohomematic/model/custom/capabilities/climate.py +41 -0
  90. aiohomematic/model/custom/capabilities/light.py +87 -0
  91. aiohomematic/model/custom/capabilities/lock.py +44 -0
  92. aiohomematic/model/custom/capabilities/siren.py +63 -0
  93. aiohomematic/model/custom/climate.py +1130 -0
  94. aiohomematic/model/custom/cover.py +722 -0
  95. aiohomematic/model/custom/data_point.py +360 -0
  96. aiohomematic/model/custom/definition.py +300 -0
  97. aiohomematic/model/custom/field.py +89 -0
  98. aiohomematic/model/custom/light.py +1174 -0
  99. aiohomematic/model/custom/lock.py +322 -0
  100. aiohomematic/model/custom/mixins.py +445 -0
  101. aiohomematic/model/custom/profile.py +945 -0
  102. aiohomematic/model/custom/registry.py +251 -0
  103. aiohomematic/model/custom/siren.py +462 -0
  104. aiohomematic/model/custom/switch.py +195 -0
  105. aiohomematic/model/custom/text_display.py +289 -0
  106. aiohomematic/model/custom/valve.py +78 -0
  107. aiohomematic/model/data_point.py +1416 -0
  108. aiohomematic/model/device.py +1840 -0
  109. aiohomematic/model/event.py +216 -0
  110. aiohomematic/model/generic/__init__.py +327 -0
  111. aiohomematic/model/generic/action.py +40 -0
  112. aiohomematic/model/generic/action_select.py +62 -0
  113. aiohomematic/model/generic/binary_sensor.py +30 -0
  114. aiohomematic/model/generic/button.py +31 -0
  115. aiohomematic/model/generic/data_point.py +177 -0
  116. aiohomematic/model/generic/dummy.py +150 -0
  117. aiohomematic/model/generic/number.py +76 -0
  118. aiohomematic/model/generic/select.py +56 -0
  119. aiohomematic/model/generic/sensor.py +76 -0
  120. aiohomematic/model/generic/switch.py +54 -0
  121. aiohomematic/model/generic/text.py +33 -0
  122. aiohomematic/model/hub/__init__.py +100 -0
  123. aiohomematic/model/hub/binary_sensor.py +24 -0
  124. aiohomematic/model/hub/button.py +28 -0
  125. aiohomematic/model/hub/connectivity.py +190 -0
  126. aiohomematic/model/hub/data_point.py +342 -0
  127. aiohomematic/model/hub/hub.py +864 -0
  128. aiohomematic/model/hub/inbox.py +135 -0
  129. aiohomematic/model/hub/install_mode.py +393 -0
  130. aiohomematic/model/hub/metrics.py +208 -0
  131. aiohomematic/model/hub/number.py +42 -0
  132. aiohomematic/model/hub/select.py +52 -0
  133. aiohomematic/model/hub/sensor.py +37 -0
  134. aiohomematic/model/hub/switch.py +43 -0
  135. aiohomematic/model/hub/text.py +30 -0
  136. aiohomematic/model/hub/update.py +221 -0
  137. aiohomematic/model/support.py +592 -0
  138. aiohomematic/model/update.py +140 -0
  139. aiohomematic/model/week_profile.py +1827 -0
  140. aiohomematic/property_decorators.py +719 -0
  141. aiohomematic/py.typed +0 -0
  142. aiohomematic/rega_scripts/accept_device_in_inbox.fn +51 -0
  143. aiohomematic/rega_scripts/create_backup_start.fn +28 -0
  144. aiohomematic/rega_scripts/create_backup_status.fn +89 -0
  145. aiohomematic/rega_scripts/fetch_all_device_data.fn +97 -0
  146. aiohomematic/rega_scripts/get_backend_info.fn +25 -0
  147. aiohomematic/rega_scripts/get_inbox_devices.fn +61 -0
  148. aiohomematic/rega_scripts/get_program_descriptions.fn +31 -0
  149. aiohomematic/rega_scripts/get_serial.fn +44 -0
  150. aiohomematic/rega_scripts/get_service_messages.fn +83 -0
  151. aiohomematic/rega_scripts/get_system_update_info.fn +39 -0
  152. aiohomematic/rega_scripts/get_system_variable_descriptions.fn +31 -0
  153. aiohomematic/rega_scripts/set_program_state.fn +17 -0
  154. aiohomematic/rega_scripts/set_system_variable.fn +19 -0
  155. aiohomematic/rega_scripts/trigger_firmware_update.fn +67 -0
  156. aiohomematic/schemas.py +256 -0
  157. aiohomematic/store/__init__.py +55 -0
  158. aiohomematic/store/dynamic/__init__.py +43 -0
  159. aiohomematic/store/dynamic/command.py +250 -0
  160. aiohomematic/store/dynamic/data.py +175 -0
  161. aiohomematic/store/dynamic/details.py +187 -0
  162. aiohomematic/store/dynamic/ping_pong.py +416 -0
  163. aiohomematic/store/persistent/__init__.py +71 -0
  164. aiohomematic/store/persistent/base.py +285 -0
  165. aiohomematic/store/persistent/device.py +233 -0
  166. aiohomematic/store/persistent/incident.py +380 -0
  167. aiohomematic/store/persistent/paramset.py +241 -0
  168. aiohomematic/store/persistent/session.py +556 -0
  169. aiohomematic/store/serialization.py +150 -0
  170. aiohomematic/store/storage.py +689 -0
  171. aiohomematic/store/types.py +526 -0
  172. aiohomematic/store/visibility/__init__.py +40 -0
  173. aiohomematic/store/visibility/parser.py +141 -0
  174. aiohomematic/store/visibility/registry.py +722 -0
  175. aiohomematic/store/visibility/rules.py +307 -0
  176. aiohomematic/strings.json +237 -0
  177. aiohomematic/support.py +706 -0
  178. aiohomematic/tracing.py +236 -0
  179. aiohomematic/translations/de.json +237 -0
  180. aiohomematic/translations/en.json +237 -0
  181. aiohomematic/type_aliases.py +51 -0
  182. aiohomematic/validator.py +128 -0
  183. aiohomematic-2026.1.29.dist-info/METADATA +296 -0
  184. aiohomematic-2026.1.29.dist-info/RECORD +188 -0
  185. aiohomematic-2026.1.29.dist-info/WHEEL +5 -0
  186. aiohomematic-2026.1.29.dist-info/entry_points.txt +2 -0
  187. aiohomematic-2026.1.29.dist-info/licenses/LICENSE +21 -0
  188. 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}"