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

Files changed (73) hide show
  1. aiohomematic/__init__.py +3 -3
  2. aiohomematic/async_support.py +1 -1
  3. aiohomematic/central/__init__.py +59 -31
  4. aiohomematic/central/decorators.py +1 -1
  5. aiohomematic/central/rpc_server.py +1 -1
  6. aiohomematic/client/__init__.py +19 -13
  7. aiohomematic/client/_rpc_errors.py +1 -1
  8. aiohomematic/client/json_rpc.py +29 -3
  9. aiohomematic/client/rpc_proxy.py +20 -2
  10. aiohomematic/const.py +25 -6
  11. aiohomematic/context.py +1 -1
  12. aiohomematic/converter.py +1 -1
  13. aiohomematic/decorators.py +1 -1
  14. aiohomematic/exceptions.py +1 -1
  15. aiohomematic/hmcli.py +1 -1
  16. aiohomematic/model/__init__.py +1 -1
  17. aiohomematic/model/calculated/__init__.py +21 -4
  18. aiohomematic/model/calculated/climate.py +59 -1
  19. aiohomematic/model/calculated/data_point.py +1 -1
  20. aiohomematic/model/calculated/operating_voltage_level.py +1 -1
  21. aiohomematic/model/calculated/support.py +41 -3
  22. aiohomematic/model/custom/__init__.py +1 -1
  23. aiohomematic/model/custom/climate.py +7 -4
  24. aiohomematic/model/custom/const.py +1 -1
  25. aiohomematic/model/custom/cover.py +1 -1
  26. aiohomematic/model/custom/data_point.py +1 -1
  27. aiohomematic/model/custom/definition.py +1 -1
  28. aiohomematic/model/custom/light.py +1 -1
  29. aiohomematic/model/custom/lock.py +1 -1
  30. aiohomematic/model/custom/siren.py +1 -1
  31. aiohomematic/model/custom/support.py +1 -1
  32. aiohomematic/model/custom/switch.py +1 -1
  33. aiohomematic/model/custom/valve.py +1 -1
  34. aiohomematic/model/data_point.py +3 -2
  35. aiohomematic/model/device.py +10 -13
  36. aiohomematic/model/event.py +1 -1
  37. aiohomematic/model/generic/__init__.py +1 -1
  38. aiohomematic/model/generic/action.py +1 -1
  39. aiohomematic/model/generic/binary_sensor.py +1 -1
  40. aiohomematic/model/generic/button.py +1 -1
  41. aiohomematic/model/generic/data_point.py +1 -1
  42. aiohomematic/model/generic/number.py +1 -1
  43. aiohomematic/model/generic/select.py +1 -1
  44. aiohomematic/model/generic/sensor.py +1 -1
  45. aiohomematic/model/generic/switch.py +1 -1
  46. aiohomematic/model/generic/text.py +1 -1
  47. aiohomematic/model/hub/__init__.py +1 -1
  48. aiohomematic/model/hub/binary_sensor.py +1 -1
  49. aiohomematic/model/hub/button.py +1 -1
  50. aiohomematic/model/hub/data_point.py +1 -1
  51. aiohomematic/model/hub/number.py +1 -1
  52. aiohomematic/model/hub/select.py +1 -1
  53. aiohomematic/model/hub/sensor.py +1 -1
  54. aiohomematic/model/hub/switch.py +1 -1
  55. aiohomematic/model/hub/text.py +1 -1
  56. aiohomematic/model/support.py +1 -1
  57. aiohomematic/model/update.py +1 -1
  58. aiohomematic/property_decorators.py +2 -2
  59. aiohomematic/store/__init__.py +34 -0
  60. aiohomematic/{caches → store}/dynamic.py +4 -4
  61. aiohomematic/store/persistent.py +933 -0
  62. aiohomematic/{caches → store}/visibility.py +4 -4
  63. aiohomematic/support.py +20 -17
  64. aiohomematic/validator.py +1 -1
  65. {aiohomematic-2025.10.7.dist-info → aiohomematic-2025.10.9.dist-info}/METADATA +1 -1
  66. aiohomematic-2025.10.9.dist-info/RECORD +78 -0
  67. aiohomematic_support/client_local.py +2 -2
  68. aiohomematic/caches/__init__.py +0 -12
  69. aiohomematic/caches/persistent.py +0 -478
  70. aiohomematic-2025.10.7.dist-info/RECORD +0 -78
  71. {aiohomematic-2025.10.7.dist-info → aiohomematic-2025.10.9.dist-info}/WHEEL +0 -0
  72. {aiohomematic-2025.10.7.dist-info → aiohomematic-2025.10.9.dist-info}/licenses/LICENSE +0 -0
  73. {aiohomematic-2025.10.7.dist-info → aiohomematic-2025.10.9.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2021-2025 Daniel Perna, SukramJ
2
+ # Copyright (c) 2021-2025
3
3
  """
4
4
  Parameter visibility rules and cache for Homematic data points.
5
5
 
@@ -8,7 +8,7 @@ ignored, or un‑ignored for channels and devices. It centralizes the rules
8
8
  that influence the visibility of data points exposed by the library.
9
9
 
10
10
  Overview
11
- - ParameterVisibilityCache: Computes and caches visibility decisions per model,
11
+ - ParameterVisibilityCache: Computes and store visibility decisions per model,
12
12
  channel number, paramset and parameter. It consolidates rules from multiple
13
13
  sources, such as model‑specific defaults, paramset relevance, hidden lists,
14
14
  and explicit un‑ignore directives.
@@ -352,7 +352,7 @@ class ParameterVisibilityCache:
352
352
  "_relevant_master_paramsets_by_device",
353
353
  "_relevant_prefix_cache",
354
354
  "_required_parameters",
355
- "_storage_folder",
355
+ "_storage_directory",
356
356
  "_un_ignore_parameters_by_device_paramset_key",
357
357
  "_un_ignore_prefix_cache",
358
358
  )
@@ -364,7 +364,7 @@ class ParameterVisibilityCache:
364
364
  ) -> None:
365
365
  """Init the parameter visibility cache."""
366
366
  self._central = central
367
- self._storage_folder: Final = central.config.storage_folder
367
+ self._storage_directory: Final = central.config.storage_directory
368
368
  self._required_parameters: Final = get_required_parameters()
369
369
  self._raw_un_ignores: Final[frozenset[str]] = central.config.un_ignore_list or frozenset()
370
370
 
aiohomematic/support.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2021-2025 Daniel Perna, SukramJ
2
+ # Copyright (c) 2021-2025
3
3
  """
4
4
  Helper functions used within aiohomematic.
5
5
 
@@ -15,11 +15,13 @@ import contextlib
15
15
  from dataclasses import dataclass
16
16
  from datetime import datetime
17
17
  from functools import lru_cache
18
+ import glob
18
19
  import hashlib
19
20
  import inspect
20
21
  from ipaddress import IPv4Address
21
22
  import logging
22
23
  import os
24
+ import random
23
25
  import re
24
26
  import socket
25
27
  import ssl
@@ -43,6 +45,7 @@ from aiohomematic.const import (
43
45
  NO_CACHE_ENTRY,
44
46
  PRIMARY_CLIENT_CANDIDATE_INTERFACES,
45
47
  TIMEOUT,
48
+ UTF_8,
46
49
  CommandRxMode,
47
50
  DeviceDescription,
48
51
  ParamsetKey,
@@ -98,7 +101,7 @@ def check_config(
98
101
  host: str,
99
102
  username: str,
100
103
  password: str,
101
- storage_folder: str,
104
+ storage_directory: str,
102
105
  callback_host: str | None,
103
106
  callback_port_xml_rpc: int | None,
104
107
  json_port: int | None,
@@ -118,7 +121,7 @@ def check_config(
118
121
  if not check_password(password=password):
119
122
  config_failures.append("Password is not valid")
120
123
  try:
121
- check_or_create_directory(directory=storage_folder)
124
+ check_or_create_directory(directory=storage_directory)
122
125
  except BaseHomematicException as bhexc:
123
126
  config_failures.append(extract_exc_args(exc=bhexc)[0])
124
127
  if callback_host and not (is_hostname(hostname=callback_host) or is_ipv4_address(address=callback_host)):
@@ -141,15 +144,12 @@ def has_primary_client(*, interface_configs: AbstractSet[hmcl.InterfaceConfig])
141
144
  return False
142
145
 
143
146
 
144
- def delete_file(*, folder: str, file_name: str) -> None:
145
- """Delete the file."""
146
- file_path = os.path.join(folder, file_name)
147
- if (
148
- os.path.exists(folder)
149
- and os.path.exists(file_path)
150
- and (os.path.isfile(file_path) or os.path.islink(file_path))
151
- ):
152
- os.unlink(file_path)
147
+ def delete_file(directory: str, file_name: str) -> None: # kwonly: disable
148
+ """Delete the file. File can contain a wildcard."""
149
+ if os.path.exists(directory):
150
+ for file_path in glob.glob(os.path.join(directory, file_name)):
151
+ if os.path.isfile(file_path):
152
+ os.remove(file_path)
153
153
 
154
154
 
155
155
  def check_or_create_directory(*, directory: str) -> bool:
@@ -526,9 +526,9 @@ def hash_sha256(*, value: Any) -> str:
526
526
  data = orjson.dumps(value, option=orjson.OPT_SORT_KEYS | orjson.OPT_NON_STR_KEYS)
527
527
  except Exception:
528
528
  # Fallback: convert to a hashable representation and use repr()
529
- data = repr(_make_value_hashable(value=value)).encode()
529
+ data = repr(_make_value_hashable(value=value)).encode(encoding=UTF_8)
530
530
  hasher.update(data)
531
- return base64.b64encode(hasher.digest()).decode()
531
+ return base64.b64encode(hasher.digest()).decode(encoding=UTF_8)
532
532
 
533
533
 
534
534
  def _make_value_hashable(*, value: Any) -> Any:
@@ -577,6 +577,11 @@ def cleanup_text_from_html_tags(*, text: str) -> str:
577
577
  return re.sub(HTMLTAG_PATTERN, "", text)
578
578
 
579
579
 
580
+ def create_random_device_addresses(*, addresses: list[str]) -> dict[str, str]:
581
+ """Create a random device address."""
582
+ return {adr: f"VCU{int(random.randint(1000000, 9999999))}" for adr in addresses}
583
+
584
+
580
585
  # --- Structured error boundary logging helpers ---
581
586
 
582
587
  _BOUNDARY_MSG = "error_boundary"
@@ -632,9 +637,7 @@ def log_boundary_error(
632
637
  log_message += f" {message}"
633
638
 
634
639
  if log_context:
635
- log_message += (
636
- f" ctx={orjson.dumps(_safe_log_context(context=log_context), option=orjson.OPT_SORT_KEYS).decode()}"
637
- )
640
+ log_message += f" ctx={orjson.dumps(_safe_log_context(context=log_context), option=orjson.OPT_SORT_KEYS).decode(encoding=UTF_8)}"
638
641
 
639
642
  # Choose level if not provided:
640
643
  if (chosen_level := level) is None:
aiohomematic/validator.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2021-2025 Daniel Perna, SukramJ
2
+ # Copyright (c) 2021-2025
3
3
  """
4
4
  Validator functions used within aiohomematic.
5
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.10.7
3
+ Version: 2025.10.9
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>
@@ -0,0 +1,78 @@
1
+ aiohomematic/__init__.py,sha256=Uo9CIoil0Arl3GwtgMZAwM8jhcgoBKcZEgj8cXYlswY,2258
2
+ aiohomematic/async_support.py,sha256=01chvt-Ac_UIAWI39VeGpQV9AmxpSCbNyfPPAwX_Qqc,7865
3
+ aiohomematic/const.py,sha256=8Reu1r01pcMN3U5VQLufSJxCcuzhcU1Utn-IKDIKTgE,27124
4
+ aiohomematic/context.py,sha256=hGE-iPcPt21dY-1MZar-Hyh9YaKL-VS42xjrulIVyRQ,429
5
+ aiohomematic/converter.py,sha256=FiHU71M5RZ7N5FXJYh2CN14s63-PM-SHdb0cJ_CLx54,3602
6
+ aiohomematic/decorators.py,sha256=cSW0aF3PzrW_qW6H0sjRNH9eqO8ysqhXZDgJ2OJTZM4,11038
7
+ aiohomematic/exceptions.py,sha256=RLldRD4XY8iYuNYVdspCbbphGcKsximB7R5OL7cYKw0,5006
8
+ aiohomematic/hmcli.py,sha256=_QZFKcfr_KJrdiyBRbhz0f8LZ95glD7LgJBmQc8cwog,4911
9
+ aiohomematic/property_decorators.py,sha256=3Id1_rWIYnwyN_oSMgbh7XNKz9HPkGTC1CeS5ei04ZQ,17139
10
+ aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ aiohomematic/support.py,sha256=R275ZIKoufMZORcBa7Tiq0MZ7KtMZiqoUXUJX4LM1qA,23083
12
+ aiohomematic/validator.py,sha256=qX5janicu4jLrAVzKoyWgXe1XU4EOjk5-QhNFL4awTQ,3541
13
+ aiohomematic/central/__init__.py,sha256=9q1cl0qCVvPSd6eW7ipFdbd783SVLVz1fD_Hh8iDDv8,93519
14
+ aiohomematic/central/decorators.py,sha256=vrujdw2QMXva-7DGXMQyittujx0q7cPuGD-SCeQlD30,6886
15
+ aiohomematic/central/rpc_server.py,sha256=PX6idUEZ5j9fx9y__Q--Zcc2cyFMhLBie-lNvkx1bsI,10949
16
+ aiohomematic/client/__init__.py,sha256=X7lR-A9fAYKbVoR3aNRui_-pfeR20-sehNSlXvkrIoE,73905
17
+ aiohomematic/client/_rpc_errors.py,sha256=IaYjX60mpBJ43gDCJjuUSVraamy5jXHTRjOnutK4azs,2962
18
+ aiohomematic/client/json_rpc.py,sha256=u25nedb3AEK54GN9F4z3oOCfoE-YTYZpL4166OsRPAg,51274
19
+ aiohomematic/client/rpc_proxy.py,sha256=T6tmfBAJJSFxzBLrhKJc6_KiHyTs5EVnStQsVJA5YkY,11604
20
+ aiohomematic/model/__init__.py,sha256=gUYa8ROWSbXjZTWUTmINZ1bbYAxGkVpA-onxaJN2Iso,5436
21
+ aiohomematic/model/data_point.py,sha256=7FqnFO9C0_UtUfwPIsaq61QDhjZqsmjkepzzc_9StUs,41595
22
+ aiohomematic/model/device.py,sha256=CQ_zFRVnwmuEQzBEHlgz3DxFzDnW36FVCPlckmho2TI,52891
23
+ aiohomematic/model/event.py,sha256=uO6Z2pCZEU_8MR8uRIIZjX8IL0rFh7sNhhTNT8yFoVU,6852
24
+ aiohomematic/model/support.py,sha256=ITyxBIJ2Bv69fcwuUD2HyMKlburOnLo9NFs5VKg34ZY,19635
25
+ aiohomematic/model/update.py,sha256=p_zyC73fERQxXF2d1O89zi9EJovzNlrYIONJfPOz5_g,5134
26
+ aiohomematic/model/calculated/__init__.py,sha256=JNtxK4-XZeyR6MxfKVPdcF6ezQliQYTWEDoeOChumaE,2966
27
+ aiohomematic/model/calculated/climate.py,sha256=rm9b4rCrmsZAA5_dzP6YRtahdveI97581_EnC4utqpg,10499
28
+ aiohomematic/model/calculated/data_point.py,sha256=ESUqwolPViXPuH9hvL0q5FMvsGXjcqxeyySpNTUAMU8,11587
29
+ aiohomematic/model/calculated/operating_voltage_level.py,sha256=99A8HvahVS4IxpgK1dsgQXHfeubU7JI2c0ObagbnSNQ,13505
30
+ aiohomematic/model/calculated/support.py,sha256=GBD35_OR3TEAWo5ADeH_gk2Ebw9pHOtOnOS7umCkXB0,7989
31
+ aiohomematic/model/custom/__init__.py,sha256=JxJXyr2CgKlj-jc1xQ14lbMT76vvswfLUecwj8RJCXA,6073
32
+ aiohomematic/model/custom/climate.py,sha256=5r0zjBOhnp4QcL2p6x2UYhIMQqa0SG1Sw1cnnyY9POs,57274
33
+ aiohomematic/model/custom/const.py,sha256=s4iqhwvt8x41h4-CtMCyXwryGHuBNbhBrcJ5zGVRFJU,4939
34
+ aiohomematic/model/custom/cover.py,sha256=KQzLEoPkKgZ2oi2oblUrGReQnT_0WAuseWAxu_xH5_Y,29035
35
+ aiohomematic/model/custom/data_point.py,sha256=WLKygP3SQwtG35BpOH3HNt_o-z9dfSUmuSyPDIEWF8A,14133
36
+ aiohomematic/model/custom/definition.py,sha256=miZssuy1u5EcQ4opOWo9n0Eko-2aIK9f3MAKYiMmJb8,35640
37
+ aiohomematic/model/custom/light.py,sha256=JC7GeU87gObBN0b1fCjm0VzgCtoytWsmq2Sd-fQqBGM,44426
38
+ aiohomematic/model/custom/lock.py,sha256=iJY8jiJA_HRynpbeACEQ_kzwiXOfAaT2IcF1FbXc0xY,11974
39
+ aiohomematic/model/custom/siren.py,sha256=iaCJuRWiQH-r_ckhPZGRfmzxI8PddBBA5z_Jo78f1qI,9763
40
+ aiohomematic/model/custom/support.py,sha256=FPhC3kp7blJu4jWHWAmXUXv4JWJu5nhQkrr8dyYxFas,1431
41
+ aiohomematic/model/custom/switch.py,sha256=u4zbda4MFz_rmyuIvTgQC6Gi1XDWvX5EsOhP2NiQy38,6941
42
+ aiohomematic/model/custom/valve.py,sha256=K42YSlG6610reWo3S6lo070WvEN2InVA8MsMpXltRLs,4220
43
+ aiohomematic/model/generic/__init__.py,sha256=-4yben7G-QKBWMWpusrLkGo65a4IXIPYoiGu49T_KMM,7653
44
+ aiohomematic/model/generic/action.py,sha256=VDFCAkX0TkXV4xh3ya0AUIKnjOKF_rEobI6qdW5mAOQ,975
45
+ aiohomematic/model/generic/binary_sensor.py,sha256=yABUafcBmPHLNAkdj_malYroBZc5UaunYLhmRtS2nGU,865
46
+ aiohomematic/model/generic/button.py,sha256=3ahmj1BJZfdh6h6YV-urC8UwcKRp94QPOQtsF0fBI3Y,718
47
+ aiohomematic/model/generic/data_point.py,sha256=P89BuRm8pWUBvCeR8XVHE2A1SqYb53REJCCOUnoKN34,6062
48
+ aiohomematic/model/generic/number.py,sha256=WNu4EB_npDZ8f7RrCrab1g9KzRtG8dziUvNQApEKXYk,2656
49
+ aiohomematic/model/generic/select.py,sha256=-CXHdvzwWGp74t5UVdIWOFhlcW7bf0hcuGriBl7EWXk,1516
50
+ aiohomematic/model/generic/sensor.py,sha256=ueqXw9bkFFJeD_mer6idpMTGFg6rweDEUNOgqsF22NA,2240
51
+ aiohomematic/model/generic/switch.py,sha256=Y5Bml60QoHs14mfsMvhsk7S7I-2QSBoB7KWHMCJak3Q,1820
52
+ aiohomematic/model/generic/text.py,sha256=AOMZCHgPO2v4lza-OI0J6WNsQcUOvab9HA5sRN8NQZQ,832
53
+ aiohomematic/model/hub/__init__.py,sha256=qQkjMYd9-xE5iWvN-sMTcDvHIghz7g0z7u2ja73vaKQ,13503
54
+ aiohomematic/model/hub/binary_sensor.py,sha256=yqBXEzVS7zMoY4N7agwQ70ypAgIRkfUeBNCInsQV_kA,730
55
+ aiohomematic/model/hub/button.py,sha256=fEtBIxKF32kyacaCgsDLohw1exDpFtE7SCwEYgBAlOY,868
56
+ aiohomematic/model/hub/data_point.py,sha256=7AKkZM4cpO3qhVF5rKPs25H2JKGjHQlHd-wJdf73Wcg,10631
57
+ aiohomematic/model/hub/number.py,sha256=zS5ft2wkUUJ0NkUlhkWvbXCeMcI9v-gH36NVCdrNtcU,1215
58
+ aiohomematic/model/hub/select.py,sha256=ENF1TMk5jrNbk7lspNTfWIROMifjJMrllnu6htM1C2E,1652
59
+ aiohomematic/model/hub/sensor.py,sha256=F--BHrgziizBOkXTupwV0ZZlzNnjsWrL9qnkHQv-lEE,1170
60
+ aiohomematic/model/hub/switch.py,sha256=sllPvUy4NggktWjUqobDRZLSTJa2OX88WE1M8wlGmr8,1368
61
+ aiohomematic/model/hub/text.py,sha256=JSCpC37sVm4TbjJCd0vaqybHVuCz1ctNHXEyJnmmMVs,977
62
+ aiohomematic/rega_scripts/fetch_all_device_data.fn,sha256=7uxhHoelAOsH6yYr1n1M1XwIRgDmItiHnWIMhDYEimk,4373
63
+ aiohomematic/rega_scripts/get_program_descriptions.fn,sha256=pGmj377MkqbZi6j-UBKQAsXTphwh1kDwDKqXij8zUBE,835
64
+ aiohomematic/rega_scripts/get_serial.fn,sha256=t1oeo-sB_EuVeiY24PLcxFSkdQVgEWGXzpemJQZFybY,1079
65
+ aiohomematic/rega_scripts/get_system_variable_descriptions.fn,sha256=UKXvC0_5lSApdQ2atJc0E5Stj5Zt3lqh0EcliokYu2c,849
66
+ aiohomematic/rega_scripts/set_program_state.fn,sha256=0bnv7lUj8FMjDZBz325tDVP61m04cHjVj4kIOnUUgpY,279
67
+ aiohomematic/rega_scripts/set_system_variable.fn,sha256=sTmr7vkPTPnPkor5cnLKlDvfsYRbGO1iq2z_2pMXq5E,383
68
+ aiohomematic/store/__init__.py,sha256=PHwF_tw_zL20ODwLywHgpOLWrghQo_BMZzeiQSXN1Fc,1081
69
+ aiohomematic/store/dynamic.py,sha256=kgZs5gJ4i8bHZKkJ883xuLecSKdjj6UwlLRJAvQcNGI,22528
70
+ aiohomematic/store/persistent.py,sha256=yRrGgCLGQtuUAKg37UeLDnp0HcnZjl9DordbjJukLCA,38066
71
+ aiohomematic/store/visibility.py,sha256=0y93kPTugqQsrh6kKamfgwBkbIdBPEZpQVv_1NaLz3A,31662
72
+ aiohomematic-2025.10.9.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
73
+ aiohomematic_support/__init__.py,sha256=_0YtF4lTdC_k6-zrM2IefI0u0LMr_WA61gXAyeGLgbY,66
74
+ aiohomematic_support/client_local.py,sha256=GAIg3DN4lD4H9eA3gs_CILtWR3tphXrf_Hai9rWFpM8,12817
75
+ aiohomematic-2025.10.9.dist-info/METADATA,sha256=ezEHtzT_d_BJhX-cCb920mQK5ED0UmvdNsqAoGJrELw,7603
76
+ aiohomematic-2025.10.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ aiohomematic-2025.10.9.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
78
+ aiohomematic-2025.10.9.dist-info/RECORD,,
@@ -12,7 +12,7 @@ from typing import Any, Final, cast
12
12
 
13
13
  import orjson
14
14
 
15
- from aiohomematic.client import _LOGGER, Client, _ClientConfig
15
+ from aiohomematic.client import _LOGGER, Client, ClientConfig
16
16
  from aiohomematic.const import (
17
17
  ADDRESS_SEPARATOR,
18
18
  DP_KEY_VALUE,
@@ -41,7 +41,7 @@ BACKEND_LOCAL: Final = "PyDevCCU"
41
41
  class ClientLocal(Client): # pragma: no cover
42
42
  """Local client object to provide access to locally stored files."""
43
43
 
44
- def __init__(self, *, client_config: _ClientConfig, local_resources: LocalRessources) -> None:
44
+ def __init__(self, *, client_config: ClientConfig, local_resources: LocalRessources) -> None:
45
45
  """Initialize the Client."""
46
46
  super().__init__(client_config=client_config)
47
47
  self._local_resources = local_resources
@@ -1,12 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
- """
4
- Cache packages for AioHomematic.
5
-
6
- This package groups cache implementations used throughout the library:
7
- - persistent: Long-lived on-disk caches for device and paramset descriptions.
8
- - dynamic: Short-lived in-memory caches for runtime values and connection health.
9
- - visibility: Parameter visibility rules to decide which parameters are relevant.
10
- """
11
-
12
- from __future__ import annotations