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

@@ -85,7 +85,7 @@ class Looper:
85
85
  )
86
86
  return
87
87
 
88
- def _async_create_task[R](self, target: Coroutine[Any, Any, R], name: str) -> asyncio.Task[R]:
88
+ def _async_create_task[R](self, target: Coroutine[Any, Any, R], name: str) -> asyncio.Task[R]: # kwonly: disable
89
89
  """Create a task from within the event_loop. This method must be run in the event_loop."""
90
90
  task = self._loop.create_task(target, name=name)
91
91
  self._tasks.add(task)
@@ -1640,7 +1640,7 @@ class _Scheduler(threading.Thread):
1640
1640
  ),
1641
1641
  ]
1642
1642
 
1643
- def _backend_system_callback(self, system_event: BackendSystemEvent, **kwargs: Any) -> None:
1643
+ def _backend_system_callback(self, *, system_event: BackendSystemEvent, **kwargs: Any) -> None:
1644
1644
  """Handle event of new device creation, to delay the start of the sysvar scan."""
1645
1645
  if system_event == BackendSystemEvent.DEVICES_CREATED:
1646
1646
  self._devices_created = True
@@ -27,6 +27,9 @@ _LOGGER: Final = logging.getLogger(__name__)
27
27
  class RPCFunctions:
28
28
  """The XML-RPC functions the backend will expect."""
29
29
 
30
+ # Disable kw-only linter for this class since XML-RPC signatures are positional by protocol
31
+ __kwonly_check__ = False
32
+
30
33
  def __init__(self, *, xml_rpc_server: XmlRpcServer) -> None:
31
34
  """Init RPCFunctions."""
32
35
  self._xml_rpc_server: Final = xml_rpc_server
@@ -161,6 +164,8 @@ class AioHomematicXMLRPCServer(SimpleXMLRPCServer):
161
164
  system_listMethods(self, interface_id: str.
162
165
  """
163
166
 
167
+ __kwonly_check__ = False
168
+
164
169
  def system_listMethods(self, interface_id: str | None = None, /) -> list[str]:
165
170
  """Return a list of the methods supported by the server."""
166
171
  return SimpleXMLRPCServer.system_listMethods(self)
@@ -198,7 +203,7 @@ class XmlRpcServer(threading.Thread):
198
203
  self._simple_xml_rpc_server.register_instance(RPCFunctions(xml_rpc_server=self), allow_dotted_names=True)
199
204
  self._centrals: Final[dict[str, hmcu.CentralUnit]] = {}
200
205
 
201
- def __new__(cls, ip_addr: str, port: int) -> XmlRpcServer: # noqa: PYI034
206
+ def __new__(cls, ip_addr: str, port: int) -> XmlRpcServer: # noqa: PYI034 # kwonly: disable
202
207
  """Create new XmlRPC server."""
203
208
  if (xml_rpc := cls._instances.get((ip_addr, port))) is None:
204
209
  _LOGGER.debug("Creating XmlRpc server")
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.2"
22
+ VERSION: Final = "2025.10.3"
23
23
 
24
24
  # Detect test speedup mode via environment
25
25
  _TEST_SPEEDUP: Final = (
@@ -79,6 +79,7 @@ class BaseCustomDpSiren(CustomDataPoint):
79
79
  @bind_collector()
80
80
  async def turn_on(
81
81
  self,
82
+ *,
82
83
  collector: CallParameterCollector | None = None,
83
84
  **kwargs: Unpack[SirenOnArgs],
84
85
  ) -> None:
@@ -143,6 +144,7 @@ class CustomDpIpSiren(BaseCustomDpSiren):
143
144
  @bind_collector()
144
145
  async def turn_on(
145
146
  self,
147
+ *,
146
148
  collector: CallParameterCollector | None = None,
147
149
  **kwargs: Unpack[SirenOnArgs],
148
150
  ) -> None:
@@ -999,6 +999,7 @@ class CallParameterCollector:
999
999
 
1000
1000
  def add_data_point(
1001
1001
  self,
1002
+ *,
1002
1003
  data_point: BaseParameterDataPoint,
1003
1004
  value: Any,
1004
1005
  collector_order: int,
@@ -111,7 +111,7 @@ class GenericDataPoint[ParameterT: GenericParameterType, InputParameterT: Generi
111
111
  converted_value = self._convert_value(value=prepared_value)
112
112
  # if collector is set, then add value to collector
113
113
  if collector:
114
- collector.add_data_point(self, value=converted_value, collector_order=collector_order)
114
+ collector.add_data_point(data_point=self, value=converted_value, collector_order=collector_order)
115
115
  return set()
116
116
 
117
117
  # if collector is not set, then send value directly
@@ -87,7 +87,7 @@ class ChannelNameData:
87
87
  return ChannelNameData(device_name="", channel_name="")
88
88
 
89
89
  @staticmethod
90
- def _get_channel_name(device_name: str, channel_name: str) -> str:
90
+ def _get_channel_name(*, device_name: str, channel_name: str) -> str:
91
91
  """Return the channel_name of the data_point only name."""
92
92
  if device_name and channel_name and channel_name.startswith(device_name):
93
93
  c_name = channel_name.replace(device_name, "").strip()
@@ -121,7 +121,7 @@ class DataPointNameData(ChannelNameData):
121
121
  return DataPointNameData(device_name="", channel_name="")
122
122
 
123
123
  @staticmethod
124
- def _get_channel_parameter_name(channel_name: str, parameter_name: str | None) -> str:
124
+ def _get_channel_parameter_name(*, channel_name: str, parameter_name: str | None) -> str:
125
125
  """Return the channel parameter name of the data_point."""
126
126
  if channel_name and parameter_name:
127
127
  return f"{channel_name} {parameter_name}".strip()
@@ -65,6 +65,8 @@ class _GenericProperty[GETTER, SETTER](property):
65
65
 
66
66
  """
67
67
 
68
+ __kwonly_check__ = False
69
+
68
70
  fget: Callable[[Any], GETTER] | None
69
71
  fset: Callable[[Any, SETTER], None] | None
70
72
  fdel: Callable[[Any], None] | None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.10.2
3
+ Version: 2025.10.3
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,12 +1,12 @@
1
1
  aiohomematic/__init__.py,sha256=ngULK_anZQwwUUCVcberBdVjguYfboiuG9VoueKy9fA,2283
2
- aiohomematic/async_support.py,sha256=gqyZH8x5dYfRsS77pm28euMwG6GYeFWomzSE0dQxzfc,6134
3
- aiohomematic/const.py,sha256=HZ24tNwS3R9AwEVSX3o6KrUgXBZuNly5NbuAnFeiAkE,25565
2
+ aiohomematic/async_support.py,sha256=EEzOwI3LAWjl16Q2QgtTLS7P9ktodBvs8Cw3ZKsjyxw,6153
3
+ aiohomematic/const.py,sha256=mJmfDFhm3NFQP4qkRlb63d89qi-pDidoHUq0RYYOM6I,25565
4
4
  aiohomematic/context.py,sha256=M7gkA7KFT0dp35gzGz2dzKVXu1PP0sAnepgLlmjyRS4,451
5
5
  aiohomematic/converter.py,sha256=gaNHe-WEiBStZMuuRz9iGn3Mo_CGz1bjgLtlYBJJAko,3624
6
6
  aiohomematic/decorators.py,sha256=oHEFSJoJVd-h9RYb6NLTJ60erkpRHPYv7EEipKn1a9Q,10636
7
7
  aiohomematic/exceptions.py,sha256=8Uu3rADawhYlAz6y4J52aJ-wKok8Z7YbUYUwWeGMKhs,5028
8
8
  aiohomematic/hmcli.py,sha256=qNstNDX6q8t3mJFCGlXlmRVobGabntrPtFi3kchf1Eg,4933
9
- aiohomematic/property_decorators.py,sha256=TN07L9uAos2hB7aqaSIRPziYowWWJXSDFnZqxg0WFhs,16201
9
+ aiohomematic/property_decorators.py,sha256=tAsmcSDnLsUiWlD1KUEe5fvYoIGpk5syYB0DrGuN4QU,16231
10
10
  aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  aiohomematic/support.py,sha256=w05YlO1IrelF2a1zKkUGWyr5E-nDJ-knh0LQqOHpR34,20514
12
12
  aiohomematic/validator.py,sha256=HUikmo-SFksehFBAdZmBv4ajy0XkjgvXvcCfbexnzZo,3563
@@ -14,18 +14,18 @@ aiohomematic/caches/__init__.py,sha256=_gI30tbsWgPRaHvP6cRxOQr6n9bYZzU-jp1WbHhWg
14
14
  aiohomematic/caches/dynamic.py,sha256=vyQsjBc2uGoNCCrWPMGmNBlUQ9GYvgVuupA9bhqH5hI,21466
15
15
  aiohomematic/caches/persistent.py,sha256=2bgASru4zbrFEd8rOn2YcReeHPiPJE8hMgMUPAbGh68,20117
16
16
  aiohomematic/caches/visibility.py,sha256=SThfEO3LKbIIERD4Novyj4ZZUkcYrBuvYdNQfPO29JQ,31676
17
- aiohomematic/central/__init__.py,sha256=zmZGMnRhTv_sooFLjwQ0_MRs2DEQ-EvwtGGYcu934kw,86937
17
+ aiohomematic/central/__init__.py,sha256=nXbA9IYHSn-Gm59U_T9gqMeKwQxmliv3jdrkXnMtpXs,86940
18
18
  aiohomematic/central/decorators.py,sha256=v0gCa5QEQPNEvGy0O2YIOhoJy7OKiJZJWtK64OQm7y4,6918
19
- aiohomematic/central/xml_rpc_server.py,sha256=rf3fFakCX7p7eYp2XLKWZUHWHervrDPysKcWKULAlpM,10602
19
+ aiohomematic/central/xml_rpc_server.py,sha256=1Vr8BXakLSo-RC967IlRI9LPUCl4iXp2y-AXSZuDyPc,10777
20
20
  aiohomematic/client/__init__.py,sha256=XWHg8VTtiahu7jfHwq4yOVXOxUy8nw80JF9uyY7QNJI,70457
21
21
  aiohomematic/client/_rpc_errors.py,sha256=-NPtGvkQPJ4V2clDxv1tKy09M9JZm61pUCeki9DDh6s,2984
22
22
  aiohomematic/client/json_rpc.py,sha256=k5euUJkDzIQXdOX5JJxkua_7AUUTFspK8rTGnVKoCf8,49568
23
23
  aiohomematic/client/xml_rpc.py,sha256=9PEOWoTG0EMUAMyqiInF4iA_AduHv_hhjJW3YhYjYqU,9614
24
24
  aiohomematic/model/__init__.py,sha256=KO7gas_eEzm67tODKqWTs0617CSGeKKjOWOlDbhRo_Q,5458
25
- aiohomematic/model/data_point.py,sha256=hpC-AmymEgx823zgRvPI0HhMq529AsvIDTG-UxISZ4A,41575
25
+ aiohomematic/model/data_point.py,sha256=Ml8AOQ1RcRezTYWiGBlIXwcTLolQMX5Cyb-O7GtNDm4,41586
26
26
  aiohomematic/model/device.py,sha256=15z5G2X3jSJaj-yz7jX_tnirzipRIGBJPymObY3Dmjk,52942
27
27
  aiohomematic/model/event.py,sha256=82H8M_QNMCCC29mP3R16alJyKWS3Hb3aqY_aFMSqCvo,6874
28
- aiohomematic/model/support.py,sha256=kr2k3hZQatm2EYtaL-pywbVRXNmrqunb2dPfNrVjxV8,19651
28
+ aiohomematic/model/support.py,sha256=l5E9Oon20nkGWOSEmbYtqQbpbh6-H4rIk8xtEtk5Fcg,19657
29
29
  aiohomematic/model/update.py,sha256=5F39xNz9B2GKJ8TvJHPMC-Wu97HfkiiMawjnHEYMnoA,5156
30
30
  aiohomematic/model/calculated/__init__.py,sha256=UGLePgKDH8JpLqjhPBgvBzjggI34omcaCPsc6tcM8Xs,2811
31
31
  aiohomematic/model/calculated/climate.py,sha256=GXBsC5tnrC_BvnFBkJ9KUqE7uVcGD1KTU_6-OleF5H4,8545
@@ -40,7 +40,7 @@ aiohomematic/model/custom/data_point.py,sha256=l2pTz7Fu5jGCstXHK1cWCFfBWIJeKmtt3
40
40
  aiohomematic/model/custom/definition.py,sha256=9kSdqVOHQs65Q2Op5QknNQv5lLmZkZlGCUUCRGicOaw,35662
41
41
  aiohomematic/model/custom/light.py,sha256=2UxQOoupwTpQ-5iwY51gL_B815sgDXNW-HG-QhAFb9E,44448
42
42
  aiohomematic/model/custom/lock.py,sha256=ndzZ0hp7FBohw7T_qR0jPobwlcwxus9M1DuDu_7vfPw,11996
43
- aiohomematic/model/custom/siren.py,sha256=KcUwADlqfbnYSoFYLbcSYMf_dOgfc_OdUJxyd7MpcGw,9763
43
+ aiohomematic/model/custom/siren.py,sha256=DT8RoOCl7FqstgRSBK-RWRcY4T29LuEdnlhaWCB6ATk,9785
44
44
  aiohomematic/model/custom/support.py,sha256=UvencsvCwgpm4iqRNRt5KRs560tyw1NhYP5ZaqmCT2k,1453
45
45
  aiohomematic/model/custom/switch.py,sha256=VKknWPJOtSwIzV-Ag_8Zg1evtkyjKh768Be_quU_R54,6885
46
46
  aiohomematic/model/custom/valve.py,sha256=u9RYzeJ8FNmpFO6amlLElXTQdAeqac5yo7NbZYS6Z9U,4242
@@ -48,7 +48,7 @@ aiohomematic/model/generic/__init__.py,sha256=-ho8m9gFlORBGNPn2i8c9i5-GVLLFvTlf5
48
48
  aiohomematic/model/generic/action.py,sha256=niJPvTs43b9GiKomdBaBKwjOwtmNxR_YRhj5Fpje9NU,997
49
49
  aiohomematic/model/generic/binary_sensor.py,sha256=U5GvfRYbhwe0jRmaedD4LVZ_24SyyPbVr74HEfZXoxE,887
50
50
  aiohomematic/model/generic/button.py,sha256=6jZ49woI9gYJEx__PjguDNbc5vdE1P-YcLMZZFkYRCg,740
51
- aiohomematic/model/generic/data_point.py,sha256=bhCMhiIjnrl6GUeZ7RQhg20Tg2GsuUkqY1EOZOp67Fg,6073
51
+ aiohomematic/model/generic/data_point.py,sha256=2NvdU802JUo4NZh0v6oMI-pVtlNluSFse7ISMGqo70g,6084
52
52
  aiohomematic/model/generic/number.py,sha256=nJgOkMZwNfPtzBrX2o5RAjBt-o8KrKuqtDa9LBj0Jw0,2678
53
53
  aiohomematic/model/generic/select.py,sha256=vWfLUdQBjZLG-q-WZMxHk9Klawg_iNOEeSoVHrvG35I,1538
54
54
  aiohomematic/model/generic/sensor.py,sha256=wCnQ8IoC8uPTN29R250pfJa4x6y9sh4c3vxQ4Km8Clg,2262
@@ -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.2.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
72
+ aiohomematic-2025.10.3.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
73
73
  aiohomematic_support/__init__.py,sha256=_0YtF4lTdC_k6-zrM2IefI0u0LMr_WA61gXAyeGLgbY,66
74
- aiohomematic_support/client_local.py,sha256=nDG6nmpMHjq8tDUEmE4mK6veGORtIsGqcr6hbGjI2rQ,12759
75
- aiohomematic-2025.10.2.dist-info/METADATA,sha256=2pXDu9_TySGqUPkJvKpM8C9EjpIROMurxQl8n6pRvis,7603
76
- aiohomematic-2025.10.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
- aiohomematic-2025.10.2.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
78
- aiohomematic-2025.10.2.dist-info/RECORD,,
74
+ aiohomematic_support/client_local.py,sha256=CGZ6N_JCQ12_u2h56M_WCZ5SbcOK4xBsPYjLH2eyqlo,12820
75
+ aiohomematic-2025.10.3.dist-info/METADATA,sha256=npEp8wqV-PrVJzhabx_yKlOicBz3Q7pnqrLf1nqqlLg,7603
76
+ aiohomematic-2025.10.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
77
+ aiohomematic-2025.10.3.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
78
+ aiohomematic-2025.10.3.dist-info/RECORD,,
@@ -153,7 +153,7 @@ class ClientLocal(Client): # pragma: no cover
153
153
 
154
154
  @inspector(re_raise=False)
155
155
  async def get_all_system_variables(
156
- self, markers: tuple[DescriptionMarker | str, ...]
156
+ self, *, markers: tuple[DescriptionMarker | str, ...]
157
157
  ) -> tuple[SystemVariableData, ...]:
158
158
  """Get all system variables from the backend."""
159
159
  return ()
@@ -203,6 +203,7 @@ class ClientLocal(Client): # pragma: no cover
203
203
  @inspector(log_level=logging.NOTSET)
204
204
  async def get_value(
205
205
  self,
206
+ *,
206
207
  channel_address: str,
207
208
  paramset_key: ParamsetKey,
208
209
  parameter: str,
@@ -214,6 +215,7 @@ class ClientLocal(Client): # pragma: no cover
214
215
  @inspector(re_raise=False, no_raise_return=set())
215
216
  async def set_value(
216
217
  self,
218
+ *,
217
219
  channel_address: str,
218
220
  paramset_key: ParamsetKey,
219
221
  parameter: str,
@@ -236,6 +238,7 @@ class ClientLocal(Client): # pragma: no cover
236
238
  @inspector
237
239
  async def get_paramset(
238
240
  self,
241
+ *,
239
242
  address: str,
240
243
  paramset_key: ParamsetKey | str,
241
244
  call_source: CallSource = CallSource.MANUAL_OR_SCHEDULED,
@@ -249,7 +252,7 @@ class ClientLocal(Client): # pragma: no cover
249
252
  return {}
250
253
 
251
254
  async def _get_paramset_description(
252
- self, address: str, paramset_key: ParamsetKey
255
+ self, *, address: str, paramset_key: ParamsetKey
253
256
  ) -> dict[str, ParameterData] | None:
254
257
  """Get paramset description from the backend."""
255
258
  if not self._local_resources:
@@ -277,6 +280,7 @@ class ClientLocal(Client): # pragma: no cover
277
280
  @inspector(measure_performance=True)
278
281
  async def put_paramset(
279
282
  self,
283
+ *,
280
284
  channel_address: str,
281
285
  paramset_key_or_link_address: ParamsetKey | str,
282
286
  values: Any,
@@ -312,6 +316,7 @@ class ClientLocal(Client): # pragma: no cover
312
316
 
313
317
  async def _load_all_json_files(
314
318
  self,
319
+ *,
315
320
  anchor: str,
316
321
  resource: str,
317
322
  include_list: list[str] | None = None,