aiohomematic 2025.10.8__py3-none-any.whl → 2025.10.10__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 +69 -30
  4. aiohomematic/central/decorators.py +1 -1
  5. aiohomematic/central/rpc_server.py +1 -1
  6. aiohomematic/client/__init__.py +22 -14
  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 +33 -7
  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 +1 -1
  18. aiohomematic/model/calculated/climate.py +1 -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 +1 -1
  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 +4 -4
  35. aiohomematic/model/device.py +13 -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 +3 -3
  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 +970 -0
  62. aiohomematic/{caches → store}/visibility.py +4 -4
  63. aiohomematic/support.py +16 -12
  64. aiohomematic/validator.py +1 -1
  65. {aiohomematic-2025.10.8.dist-info → aiohomematic-2025.10.10.dist-info}/METADATA +1 -1
  66. aiohomematic-2025.10.10.dist-info/RECORD +78 -0
  67. aiohomematic_support/client_local.py +8 -8
  68. aiohomematic/caches/__init__.py +0 -12
  69. aiohomematic/caches/persistent.py +0 -478
  70. aiohomematic-2025.10.8.dist-info/RECORD +0 -78
  71. {aiohomematic-2025.10.8.dist-info → aiohomematic-2025.10.10.dist-info}/WHEEL +0 -0
  72. {aiohomematic-2025.10.8.dist-info → aiohomematic-2025.10.10.dist-info}/licenses/LICENSE +0 -0
  73. {aiohomematic-2025.10.8.dist-info → aiohomematic-2025.10.10.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
@@ -99,7 +101,7 @@ def check_config(
99
101
  host: str,
100
102
  username: str,
101
103
  password: str,
102
- storage_folder: str,
104
+ storage_directory: str,
103
105
  callback_host: str | None,
104
106
  callback_port_xml_rpc: int | None,
105
107
  json_port: int | None,
@@ -119,7 +121,7 @@ def check_config(
119
121
  if not check_password(password=password):
120
122
  config_failures.append("Password is not valid")
121
123
  try:
122
- check_or_create_directory(directory=storage_folder)
124
+ check_or_create_directory(directory=storage_directory)
123
125
  except BaseHomematicException as bhexc:
124
126
  config_failures.append(extract_exc_args(exc=bhexc)[0])
125
127
  if callback_host and not (is_hostname(hostname=callback_host) or is_ipv4_address(address=callback_host)):
@@ -142,15 +144,12 @@ def has_primary_client(*, interface_configs: AbstractSet[hmcl.InterfaceConfig])
142
144
  return False
143
145
 
144
146
 
145
- def delete_file(*, folder: str, file_name: str) -> None:
146
- """Delete the file."""
147
- file_path = os.path.join(folder, file_name)
148
- if (
149
- os.path.exists(folder)
150
- and os.path.exists(file_path)
151
- and (os.path.isfile(file_path) or os.path.islink(file_path))
152
- ):
153
- 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)
154
153
 
155
154
 
156
155
  def check_or_create_directory(*, directory: str) -> bool:
@@ -578,6 +577,11 @@ def cleanup_text_from_html_tags(*, text: str) -> str:
578
577
  return re.sub(HTMLTAG_PATTERN, "", text)
579
578
 
580
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
+
581
585
  # --- Structured error boundary logging helpers ---
582
586
 
583
587
  _BOUNDARY_MSG = "error_boundary"
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.8
3
+ Version: 2025.10.10
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=fF-aNIwaVEwjG9QxsL-oRntUYi-DcnxH8aRrwYAJ560,27427
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=xqlWOAKbnLzYTteVHIdxFpLCBcrTzgub8ZztJd43HTw,94122
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=14lx62VvPm9yQgm5nUVdzgAKkhS8GXeAvV8gmGbldl8,73941
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=VdwzjRrBDaYhWyIQL4JVC9wYTFMSwvwymYSEAPxjms8,41573
22
+ aiohomematic/model/device.py,sha256=WfnSXPahzyCptCsvoWRbrnQQEqlEbbgKb9qappMUrx4,52898
23
+ aiohomematic/model/event.py,sha256=uO6Z2pCZEU_8MR8uRIIZjX8IL0rFh7sNhhTNT8yFoVU,6852
24
+ aiohomematic/model/support.py,sha256=ITyxBIJ2Bv69fcwuUD2HyMKlburOnLo9NFs5VKg34ZY,19635
25
+ aiohomematic/model/update.py,sha256=R3uUA61m-UQNNGkRod3vES66AgkPKay_CPyyrd-nqVI,5140
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=OnkZKxJKInrP52Tqu_hPcDDZbyL0wTMaIjWuBJ3th_k,57292
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=RVd8opnPmjM-iXhtZ79B5a6QDNsRUkbA0LF6UKTT2cw,39430
71
+ aiohomematic/store/visibility.py,sha256=0y93kPTugqQsrh6kKamfgwBkbIdBPEZpQVv_1NaLz3A,31662
72
+ aiohomematic-2025.10.10.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=gpWkbyt_iCQCwxsvKahYl4knFrzyBku5WwbR83_mgM8,12825
75
+ aiohomematic-2025.10.10.dist-info/METADATA,sha256=iobe6GKEwejmW7IGIY47Jwabivu15Kn1cLifFivDh7E,7604
76
+ aiohomematic-2025.10.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ aiohomematic-2025.10.10.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
78
+ aiohomematic-2025.10.10.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
@@ -269,7 +269,7 @@ class ClientLocal(Client): # pragma: no cover
269
269
  data := await self._load_json_file(
270
270
  anchor=self._local_resources.anchor,
271
271
  resource=self._local_resources.paramset_description_dir,
272
- filename=file_name,
272
+ file_name=file_name,
273
273
  )
274
274
  )
275
275
  ):
@@ -329,20 +329,20 @@ class ClientLocal(Client): # pragma: no cover
329
329
  exclude_list = []
330
330
  result: list[Any] = []
331
331
  resource_path = os.path.join(str(importlib.resources.files(anchor)), resource)
332
- for filename in os.listdir(resource_path):
333
- if filename not in include_list or filename in exclude_list:
332
+ for file_name in os.listdir(resource_path):
333
+ if file_name not in include_list or file_name in exclude_list:
334
334
  continue
335
- if file_content := await self._load_json_file(anchor=anchor, resource=resource, filename=filename):
335
+ if file_content := await self._load_json_file(anchor=anchor, resource=resource, file_name=file_name):
336
336
  result.append(file_content)
337
337
  return result
338
338
 
339
- async def _load_json_file(self, *, anchor: str, resource: str, filename: str) -> Any | None:
339
+ async def _load_json_file(self, *, anchor: str, resource: str, file_name: str) -> Any | None:
340
340
  """Load json file from disk into dict."""
341
341
  package_path = str(importlib.resources.files(anchor))
342
342
 
343
343
  def _perform_load() -> Any | None:
344
344
  with open(
345
- file=os.path.join(package_path, resource, filename),
345
+ file=os.path.join(package_path, resource, file_name),
346
346
  encoding=UTF_8,
347
347
  ) as fptr:
348
348
  return orjson.loads(fptr.read())
@@ -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