aiohomematic 2025.10.6__py3-none-any.whl → 2025.10.8__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.

Potentially problematic release.


This version of aiohomematic might be problematic. Click here for more details.

@@ -1068,7 +1068,7 @@ class CentralUnit(LogContextMixin, PayloadMixin):
1068
1068
  )
1069
1069
  return
1070
1070
  client = self._clients[interface_id]
1071
- if (device_descriptions := await client.get_all_device_description(device_address=address)) is None:
1071
+ if (device_descriptions := await client.get_all_device_descriptions(device_address=address)) is None:
1072
1072
  _LOGGER.warning(
1073
1073
  "ADD_NEW_DEVICES_MANUALLY failed: No device description found for address %s on interface_id %s",
1074
1074
  address,
@@ -12,7 +12,7 @@ from __future__ import annotations
12
12
  import contextlib
13
13
  import logging
14
14
  import threading
15
- from typing import Any, Final
15
+ from typing import Any, Final, cast
16
16
  from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
17
17
 
18
18
  from aiohomematic import central as hmcu
@@ -175,7 +175,7 @@ class RpcServer(threading.Thread):
175
175
  """RPC server thread to handle messages from the backend."""
176
176
 
177
177
  _initialized: bool = False
178
- _instances: Final[dict[tuple[str, int], XmlRpcServer]] = {}
178
+ _instances: Final[dict[tuple[str, int], RpcServer]] = {}
179
179
 
180
180
  def __init__(
181
181
  self,
@@ -190,9 +190,10 @@ class RpcServer(threading.Thread):
190
190
  self._listen_ip_addr: Final = ip_addr
191
191
  self._listen_port: Final[int] = find_free_port() if port == PORT_ANY else port
192
192
  self._address: Final[tuple[str, int]] = (ip_addr, self._listen_port)
193
- threading.Thread.__init__(self, name=f"RpcServer {ip_addr}:{self._listen_port}")
194
193
  self._centrals: Final[dict[str, hmcu.CentralUnit]] = {}
195
194
  self._simple_rpc_server: SimpleXMLRPCServer
195
+ self._instances[self._address] = self
196
+ threading.Thread.__init__(self, name=f"RpcServer {ip_addr}:{self._listen_port}")
196
197
 
197
198
  def run(self) -> None:
198
199
  """Run the RPC-Server thread."""
@@ -266,8 +267,9 @@ class XmlRpcServer(RpcServer):
266
267
  ) -> None:
267
268
  """Init XmlRPC server."""
268
269
 
270
+ if self._initialized:
271
+ return
269
272
  super().__init__(ip_addr=ip_addr, port=port)
270
- self._instances[self._address] = self
271
273
  self._simple_rpc_server = HomematicXMLRPCServer(
272
274
  addr=self._address,
273
275
  requestHandler=RequestHandler,
@@ -283,7 +285,7 @@ class XmlRpcServer(RpcServer):
283
285
  if (rpc := cls._instances.get((ip_addr, port))) is None:
284
286
  _LOGGER.debug("Creating XmlRpc server")
285
287
  return super().__new__(cls)
286
- return rpc
288
+ return cast(XmlRpcServer, rpc)
287
289
 
288
290
 
289
291
  def create_xml_rpc_server(*, ip_addr: str = IP_ANY_V4, port: int = PORT_ANY) -> XmlRpcServer:
@@ -507,7 +507,7 @@ class Client(ABC, LogContextMixin):
507
507
  return None
508
508
 
509
509
  @inspector(re_raise=False)
510
- async def get_all_device_description(self, *, device_address: str) -> tuple[DeviceDescription, ...] | None:
510
+ async def get_all_device_descriptions(self, *, device_address: str) -> tuple[DeviceDescription, ...] | None:
511
511
  """Get all device descriptions from the backend."""
512
512
  all_device_description: list[DeviceDescription] = []
513
513
  if main_dd := await self.get_device_description(device_address=device_address):
aiohomematic/const.py CHANGED
@@ -19,7 +19,7 @@ import sys
19
19
  from types import MappingProxyType
20
20
  from typing import Any, Final, NamedTuple, Required, TypeAlias, TypedDict
21
21
 
22
- VERSION: Final = "2025.10.6"
22
+ VERSION: Final = "2025.10.8"
23
23
 
24
24
  # Detect test speedup mode via environment
25
25
  _TEST_SPEEDUP: Final = (
@@ -179,6 +179,8 @@ class CalulatedParameter(StrEnum):
179
179
 
180
180
  APPARENT_TEMPERATURE = "APPARENT_TEMPERATURE"
181
181
  DEW_POINT = "DEW_POINT"
182
+ DEW_POINT_SPREAD = "DEW_POINT_SPREAD"
183
+ ENTHALPY = "ENTHALPY"
182
184
  FROST_POINT = "FROST_POINT"
183
185
  OPERATING_VOLTAGE_LEVEL = "OPERATING_VOLTAGE_LEVEL"
184
186
  VAPOR_CONCENTRATION = "VAPOR_CONCENTRATION"
@@ -24,7 +24,7 @@ Factory:
24
24
  normal read-only data points.
25
25
 
26
26
  Modules/classes:
27
- - ApparentTemperature, DewPoint, FrostPoint, VaporConcentration: Climate-related
27
+ - ApparentTemperature, DewPoint, DewPointSpread, Enthalphy, FrostPoint, VaporConcentration: Climate-related
28
28
  sensors implemented in climate.py using well-known formulas (see
29
29
  aiohomematic.model.calculated.support for details and references).
30
30
  - OperatingVoltageLevel: Interprets battery/voltage values and exposes a human
@@ -41,7 +41,14 @@ from typing import Final
41
41
 
42
42
  from aiohomematic.decorators import inspector
43
43
  from aiohomematic.model import device as hmd
44
- from aiohomematic.model.calculated.climate import ApparentTemperature, DewPoint, FrostPoint, VaporConcentration
44
+ from aiohomematic.model.calculated.climate import (
45
+ ApparentTemperature,
46
+ DewPoint,
47
+ DewPointSpread,
48
+ Enthalpy,
49
+ FrostPoint,
50
+ VaporConcentration,
51
+ )
45
52
  from aiohomematic.model.calculated.data_point import CalculatedDataPoint
46
53
  from aiohomematic.model.calculated.operating_voltage_level import OperatingVoltageLevel
47
54
 
@@ -49,13 +56,23 @@ __all__ = [
49
56
  "ApparentTemperature",
50
57
  "CalculatedDataPoint",
51
58
  "DewPoint",
59
+ "DewPointSpread",
60
+ "Enthalpy",
52
61
  "FrostPoint",
53
62
  "OperatingVoltageLevel",
54
63
  "VaporConcentration",
55
64
  "create_calculated_data_points",
56
65
  ]
57
66
 
58
- _CALCULATED_DATA_POINTS: Final = (ApparentTemperature, DewPoint, FrostPoint, OperatingVoltageLevel, VaporConcentration)
67
+ _CALCULATED_DATA_POINTS: Final = (
68
+ ApparentTemperature,
69
+ DewPoint,
70
+ DewPointSpread,
71
+ Enthalpy,
72
+ FrostPoint,
73
+ OperatingVoltageLevel,
74
+ VaporConcentration,
75
+ )
59
76
  _LOGGER: Final = logging.getLogger(__name__)
60
77
 
61
78
 
@@ -13,6 +13,8 @@ from aiohomematic.model.calculated.data_point import CalculatedDataPoint
13
13
  from aiohomematic.model.calculated.support import (
14
14
  calculate_apparent_temperature,
15
15
  calculate_dew_point,
16
+ calculate_dew_point_spread,
17
+ calculate_enthalpy,
16
18
  calculate_frost_point,
17
19
  calculate_vapor_concentration,
18
20
  )
@@ -141,6 +143,62 @@ class DewPoint(BaseClimateSensor):
141
143
  return None
142
144
 
143
145
 
146
+ class DewPointSpread(BaseClimateSensor):
147
+ """Implementation of a calculated sensor for dew point spread."""
148
+
149
+ __slots__ = ()
150
+
151
+ _calculated_parameter = CalulatedParameter.DEW_POINT_SPREAD
152
+
153
+ def __init__(self, *, channel: hmd.Channel) -> None:
154
+ """Initialize the data point."""
155
+ super().__init__(channel=channel)
156
+ self._unit = "K"
157
+
158
+ @staticmethod
159
+ def is_relevant_for_model(*, channel: hmd.Channel) -> bool:
160
+ """Return if this calculated data point is relevant for the model."""
161
+ return _is_relevant_for_model_temperature_and_humidity(channel=channel)
162
+
163
+ @state_property
164
+ def value(self) -> float | None:
165
+ """Return the value."""
166
+ if self._dp_temperature.value is not None and self._dp_humidity.value is not None:
167
+ return calculate_dew_point_spread(
168
+ temperature=self._dp_temperature.value,
169
+ humidity=self._dp_humidity.value,
170
+ )
171
+ return None
172
+
173
+
174
+ class Enthalpy(BaseClimateSensor):
175
+ """Implementation of a calculated sensor for enthalpy."""
176
+
177
+ __slots__ = ()
178
+
179
+ _calculated_parameter = CalulatedParameter.ENTHALPY
180
+
181
+ def __init__(self, *, channel: hmd.Channel) -> None:
182
+ """Initialize the data point."""
183
+ super().__init__(channel=channel)
184
+ self._unit = "kJ/kg"
185
+
186
+ @staticmethod
187
+ def is_relevant_for_model(*, channel: hmd.Channel) -> bool:
188
+ """Return if this calculated data point is relevant for the model."""
189
+ return _is_relevant_for_model_temperature_and_humidity(channel=channel)
190
+
191
+ @state_property
192
+ def value(self) -> float | None:
193
+ """Return the value."""
194
+ if self._dp_temperature.value is not None and self._dp_humidity.value is not None:
195
+ return calculate_enthalpy(
196
+ temperature=self._dp_temperature.value,
197
+ humidity=self._dp_humidity.value,
198
+ )
199
+ return None
200
+
201
+
144
202
  class FrostPoint(BaseClimateSensor):
145
203
  """Implementation of a calculated sensor for frost point."""
146
204
 
@@ -16,9 +16,47 @@ from typing import Final
16
16
 
17
17
  from aiohomematic.support import extract_exc_args
18
18
 
19
+ _DEFAULT_PRESSURE_HPA: Final = 1013.25
19
20
  _LOGGER: Final = logging.getLogger(__name__)
20
21
 
21
22
 
23
+ def calculate_dew_point_spread(*, temperature: float, humidity: int) -> float | None:
24
+ """
25
+ Calculate the dew point spread.
26
+
27
+ Dew point spread = Difference between current air temperature and dew point.
28
+ Specifies the safety margin against condensation(K).
29
+ """
30
+ if dew_point := calculate_dew_point(temperature=temperature, humidity=humidity):
31
+ return round(temperature - dew_point, 2)
32
+ return None
33
+
34
+
35
+ def calculate_enthalpy(
36
+ *, temperature: float, humidity: int, pressure_hPa: float = _DEFAULT_PRESSURE_HPA
37
+ ) -> float | None:
38
+ """
39
+ Calculate the enthalpy based on temperature and humidity.
40
+
41
+ Calculates the specific enthalpy of humid air in kJ/kg (relative to dry air).
42
+ temperature: Air temperature in °C
43
+ humidity: Relative humidity in %
44
+ pressure_hPa: Air pressure (default: 1013.25 hPa)
45
+
46
+ """
47
+
48
+ # Saturation vapor pressure according to Magnus in hPa
49
+ e_s = 6.112 * math.exp((17.62 * temperature) / (243.12 + temperature))
50
+ e = humidity / 100.0 * e_s # aktueller Dampfdruck in hPa
51
+
52
+ # Mixing ratio (g water / kg dry air)
53
+ r = 622 * e / (pressure_hPa - e)
54
+
55
+ # Specific enthalpy (kJ/kg dry air)
56
+ h = 1.006 * temperature + r * (2501 + 1.86 * temperature) / 1000 # in kJ/kg
57
+ return round(h, 2)
58
+
59
+
22
60
  def _calculate_heat_index(*, temperature: float, humidity: int) -> float:
23
61
  """
24
62
  Calculate the Heat Index (feels like temperature) based on the NOAA equation.
@@ -158,10 +196,10 @@ def calculate_dew_point(*, temperature: float, humidity: int) -> float | None:
158
196
  def calculate_frost_point(*, temperature: float, humidity: int) -> float | None:
159
197
  """Calculate the frost point."""
160
198
  try:
161
- if (dewpoint := calculate_dew_point(temperature=temperature, humidity=humidity)) is None:
199
+ if (dew_point := calculate_dew_point(temperature=temperature, humidity=humidity)) is None:
162
200
  return None
163
201
  t = temperature + 273.15
164
- td = dewpoint + 273.15
202
+ td = dew_point + 273.15
165
203
 
166
204
  return round((td + (2671.02 / ((2954.61 / t) + 2.193665 * math.log(t) - 13.3448)) - t) - 273.15, 1)
167
205
  except ValueError as verr:
@@ -1338,10 +1338,7 @@ class _DefinitionExporter:
1338
1338
  def perform_save() -> DataOperationResult:
1339
1339
  if not check_or_create_directory(directory=file_dir):
1340
1340
  return DataOperationResult.NO_SAVE # pragma: no cover
1341
- with open(
1342
- file=os.path.join(file_dir, filename),
1343
- mode="wb",
1344
- ) as fptr:
1341
+ with open(file=os.path.join(file_dir, filename), mode="wb") as fptr:
1345
1342
  fptr.write(orjson.dumps(data, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS))
1346
1343
  return DataOperationResult.SAVE_SUCCESS
1347
1344
 
aiohomematic/support.py CHANGED
@@ -43,6 +43,7 @@ from aiohomematic.const import (
43
43
  NO_CACHE_ENTRY,
44
44
  PRIMARY_CLIENT_CANDIDATE_INTERFACES,
45
45
  TIMEOUT,
46
+ UTF_8,
46
47
  CommandRxMode,
47
48
  DeviceDescription,
48
49
  ParamsetKey,
@@ -526,9 +527,9 @@ def hash_sha256(*, value: Any) -> str:
526
527
  data = orjson.dumps(value, option=orjson.OPT_SORT_KEYS | orjson.OPT_NON_STR_KEYS)
527
528
  except Exception:
528
529
  # Fallback: convert to a hashable representation and use repr()
529
- data = repr(_make_value_hashable(value=value)).encode()
530
+ data = repr(_make_value_hashable(value=value)).encode(encoding=UTF_8)
530
531
  hasher.update(data)
531
- return base64.b64encode(hasher.digest()).decode()
532
+ return base64.b64encode(hasher.digest()).decode(encoding=UTF_8)
532
533
 
533
534
 
534
535
  def _make_value_hashable(*, value: Any) -> Any:
@@ -632,9 +633,7 @@ def log_boundary_error(
632
633
  log_message += f" {message}"
633
634
 
634
635
  if log_context:
635
- log_message += (
636
- f" ctx={orjson.dumps(_safe_log_context(context=log_context), option=orjson.OPT_SORT_KEYS).decode()}"
637
- )
636
+ log_message += f" ctx={orjson.dumps(_safe_log_context(context=log_context), option=orjson.OPT_SORT_KEYS).decode(encoding=UTF_8)}"
638
637
 
639
638
  # Choose level if not provided:
640
639
  if (chosen_level := level) is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.10.6
3
+ Version: 2025.10.8
4
4
  Summary: Homematic interface for Home Assistant running on Python 3.
5
5
  Home-page: https://github.com/sukramj/aiohomematic
6
6
  Author-email: SukramJ <sukramj@icloud.com>, Daniel Perna <danielperna84@gmail.com>
@@ -1,6 +1,6 @@
1
1
  aiohomematic/__init__.py,sha256=ngULK_anZQwwUUCVcberBdVjguYfboiuG9VoueKy9fA,2283
2
2
  aiohomematic/async_support.py,sha256=BeNKaDrFsRA5-_uAFzmyyKPqlImfSs58C22Nqd5dZAg,7887
3
- aiohomematic/const.py,sha256=7siFMot4SYI6EAdWTG-GTgsHsdYpue_0EA-29kyBEbk,26643
3
+ aiohomematic/const.py,sha256=cUITpwnRyO-gGI7iJH2pFO3vV1fb0tbFZ2-kQjby0L0,26711
4
4
  aiohomematic/context.py,sha256=M7gkA7KFT0dp35gzGz2dzKVXu1PP0sAnepgLlmjyRS4,451
5
5
  aiohomematic/converter.py,sha256=gaNHe-WEiBStZMuuRz9iGn3Mo_CGz1bjgLtlYBJJAko,3624
6
6
  aiohomematic/decorators.py,sha256=M4n_VSyqmsUgQQQv_-3JWQxYPbS6KEkhCS8OzAfaVKo,11060
@@ -8,30 +8,30 @@ aiohomematic/exceptions.py,sha256=8Uu3rADawhYlAz6y4J52aJ-wKok8Z7YbUYUwWeGMKhs,50
8
8
  aiohomematic/hmcli.py,sha256=qNstNDX6q8t3mJFCGlXlmRVobGabntrPtFi3kchf1Eg,4933
9
9
  aiohomematic/property_decorators.py,sha256=56lHGATgRtaFkIK_IXcR2tBW9mIVITcCwH5KOw575GA,17162
10
10
  aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- aiohomematic/support.py,sha256=7FTIDvRZvGFMfN3i_zBnHtJQd-vDqTMTq2i1G5GmW3Y,22834
11
+ aiohomematic/support.py,sha256=TSzKKSVY6_fj_3hGvdmIIqSHzXQSmYVXV4A2WdBTPqQ,22863
12
12
  aiohomematic/validator.py,sha256=HUikmo-SFksehFBAdZmBv4ajy0XkjgvXvcCfbexnzZo,3563
13
13
  aiohomematic/caches/__init__.py,sha256=_gI30tbsWgPRaHvP6cRxOQr6n9bYZzU-jp1WbHhWg-A,470
14
14
  aiohomematic/caches/dynamic.py,sha256=0hOu-WoYUc9_3fofMeg_OjlYS-quD4uTyDI6zd5W4Do,22553
15
15
  aiohomematic/caches/persistent.py,sha256=xUMjvu5Vthz9W0LLllSbcqTADZvVV025b4VnPzrPnis,20604
16
16
  aiohomematic/caches/visibility.py,sha256=8lTO-jfAUzd90atUOK8rKMrzRa__m083RAoEovg0Q0o,31676
17
- aiohomematic/central/__init__.py,sha256=_ft-2HXfn0pF_LTrNyV_mZ7cHkHuRgeprBJZx5MlK0I,92659
17
+ aiohomematic/central/__init__.py,sha256=z6_VqPDaVnnHFdqNmdeMMqzolxIF-Ef-K_sB9dOikD0,92660
18
18
  aiohomematic/central/decorators.py,sha256=NUMSsQ_Or6gno4LzagrNMXeBtmbBbYyoIlMI0TFp1_E,6908
19
- aiohomematic/central/rpc_server.py,sha256=V1H8RNs8ofDOXe_L0yK_GXA7N-39sp3NcywPWzHcJnQ,10899
20
- aiohomematic/client/__init__.py,sha256=w7ns0JZNroKNy9Yw1YM1ssxhPwXUoVNpPo5RLAbgK7E,73857
19
+ aiohomematic/central/rpc_server.py,sha256=wf2KG-cj_wIdgfRHY3GIFFzOenJbz8MfUGLdF1drd3k,10971
20
+ aiohomematic/client/__init__.py,sha256=2oqhX9JjWrQ3Bxz4JR1Y53DjpNDlNQ9sEIa6z8Mm-88,73858
21
21
  aiohomematic/client/_rpc_errors.py,sha256=-NPtGvkQPJ4V2clDxv1tKy09M9JZm61pUCeki9DDh6s,2984
22
22
  aiohomematic/client/json_rpc.py,sha256=7p8j6uhS0y2LuJVtobQqwtpOA_AsC5HqEdGB0T8ZSu4,50177
23
23
  aiohomematic/client/rpc_proxy.py,sha256=v0YyhfQ_qylQpqGvGtylJtG3_tIk9PN6tWMHkki4D48,10705
24
24
  aiohomematic/model/__init__.py,sha256=KO7gas_eEzm67tODKqWTs0617CSGeKKjOWOlDbhRo_Q,5458
25
25
  aiohomematic/model/data_point.py,sha256=Ml8AOQ1RcRezTYWiGBlIXwcTLolQMX5Cyb-O7GtNDm4,41586
26
- aiohomematic/model/device.py,sha256=15z5G2X3jSJaj-yz7jX_tnirzipRIGBJPymObY3Dmjk,52942
26
+ aiohomematic/model/device.py,sha256=NZ5J5Snu03gMVlGlFYW7meGLT0XV4Fvz-SlqfPXkWOA,52895
27
27
  aiohomematic/model/event.py,sha256=82H8M_QNMCCC29mP3R16alJyKWS3Hb3aqY_aFMSqCvo,6874
28
28
  aiohomematic/model/support.py,sha256=l5E9Oon20nkGWOSEmbYtqQbpbh6-H4rIk8xtEtk5Fcg,19657
29
29
  aiohomematic/model/update.py,sha256=5F39xNz9B2GKJ8TvJHPMC-Wu97HfkiiMawjnHEYMnoA,5156
30
- aiohomematic/model/calculated/__init__.py,sha256=UGLePgKDH8JpLqjhPBgvBzjggI34omcaCPsc6tcM8Xs,2811
31
- aiohomematic/model/calculated/climate.py,sha256=GXBsC5tnrC_BvnFBkJ9KUqE7uVcGD1KTU_6-OleF5H4,8545
30
+ aiohomematic/model/calculated/__init__.py,sha256=_n-qWnG4FDs-arTEfWbsXfLK4LGic4pM8kFQgCqtPMI,2988
31
+ aiohomematic/model/calculated/climate.py,sha256=tDYbO7BajBgc8MpId2jGnrHJNQbxWDTGZoEQnb9WRL8,10521
32
32
  aiohomematic/model/calculated/data_point.py,sha256=oTN8y3B9weh7CX3ZFiDyZFgvX77iUwge-acg49pd1sI,11609
33
33
  aiohomematic/model/calculated/operating_voltage_level.py,sha256=ZrOPdNoWQ5QLr4yzMRsoPG3UuJKRkBUHfchIrpKZU4o,13527
34
- aiohomematic/model/calculated/support.py,sha256=vOxTvWe8SBCwJpLzcVA8ibtfw4eP8yTUZj4Jt9hWt9k,6695
34
+ aiohomematic/model/calculated/support.py,sha256=v7Wz0efL2XmjRY48IKFX1P2HbbPQUVVU9iXwdaao0D4,8011
35
35
  aiohomematic/model/custom/__init__.py,sha256=UzczqjsUqWvS9ZaqKeb6elbjb2y5W3cgFPB0YQUHaeM,6095
36
36
  aiohomematic/model/custom/climate.py,sha256=zSLQUY_tU7tDlbM-vW15BGuyWRjcR_DyqOwSg1_Vmfw,57217
37
37
  aiohomematic/model/custom/const.py,sha256=Kh1pnab6nmwbaY43CfXQy3yrWpPwsrQdl1Ea2aZ6aw0,4961
@@ -69,10 +69,10 @@ aiohomematic/rega_scripts/get_serial.fn,sha256=t1oeo-sB_EuVeiY24PLcxFSkdQVgEWGXz
69
69
  aiohomematic/rega_scripts/get_system_variable_descriptions.fn,sha256=UKXvC0_5lSApdQ2atJc0E5Stj5Zt3lqh0EcliokYu2c,849
70
70
  aiohomematic/rega_scripts/set_program_state.fn,sha256=0bnv7lUj8FMjDZBz325tDVP61m04cHjVj4kIOnUUgpY,279
71
71
  aiohomematic/rega_scripts/set_system_variable.fn,sha256=sTmr7vkPTPnPkor5cnLKlDvfsYRbGO1iq2z_2pMXq5E,383
72
- aiohomematic-2025.10.6.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
72
+ aiohomematic-2025.10.8.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
73
73
  aiohomematic_support/__init__.py,sha256=_0YtF4lTdC_k6-zrM2IefI0u0LMr_WA61gXAyeGLgbY,66
74
74
  aiohomematic_support/client_local.py,sha256=nFeYkoX_EXXIwbrpL_5peYQG-934D0ASN6kflYp0_4I,12819
75
- aiohomematic-2025.10.6.dist-info/METADATA,sha256=IjdBD7NWGknN0DlQcM0K4gZeFEYAkC-iCnUOkRPu1tU,7603
76
- aiohomematic-2025.10.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
- aiohomematic-2025.10.6.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
78
- aiohomematic-2025.10.6.dist-info/RECORD,,
75
+ aiohomematic-2025.10.8.dist-info/METADATA,sha256=NidjXklk-E_9ym54IQr5kTTx5lCDVNhUx5Ep3bIfwyc,7603
76
+ aiohomematic-2025.10.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ aiohomematic-2025.10.8.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
78
+ aiohomematic-2025.10.8.dist-info/RECORD,,