aiohomematic 2025.10.1__py3-none-any.whl → 2025.10.2__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 (56) hide show
  1. aiohomematic/async_support.py +7 -7
  2. aiohomematic/caches/dynamic.py +31 -26
  3. aiohomematic/caches/persistent.py +34 -32
  4. aiohomematic/caches/visibility.py +19 -7
  5. aiohomematic/central/__init__.py +87 -74
  6. aiohomematic/central/decorators.py +2 -2
  7. aiohomematic/central/xml_rpc_server.py +27 -24
  8. aiohomematic/client/__init__.py +72 -56
  9. aiohomematic/client/_rpc_errors.py +3 -3
  10. aiohomematic/client/json_rpc.py +33 -25
  11. aiohomematic/client/xml_rpc.py +14 -9
  12. aiohomematic/const.py +2 -1
  13. aiohomematic/converter.py +19 -19
  14. aiohomematic/exceptions.py +2 -1
  15. aiohomematic/model/__init__.py +4 -3
  16. aiohomematic/model/calculated/__init__.py +1 -1
  17. aiohomematic/model/calculated/climate.py +9 -9
  18. aiohomematic/model/calculated/data_point.py +13 -7
  19. aiohomematic/model/calculated/operating_voltage_level.py +2 -2
  20. aiohomematic/model/calculated/support.py +7 -7
  21. aiohomematic/model/custom/__init__.py +3 -3
  22. aiohomematic/model/custom/climate.py +57 -34
  23. aiohomematic/model/custom/cover.py +32 -18
  24. aiohomematic/model/custom/data_point.py +9 -7
  25. aiohomematic/model/custom/definition.py +23 -17
  26. aiohomematic/model/custom/light.py +52 -23
  27. aiohomematic/model/custom/lock.py +16 -12
  28. aiohomematic/model/custom/siren.py +6 -3
  29. aiohomematic/model/custom/switch.py +3 -2
  30. aiohomematic/model/custom/valve.py +3 -2
  31. aiohomematic/model/data_point.py +62 -49
  32. aiohomematic/model/device.py +48 -42
  33. aiohomematic/model/event.py +6 -5
  34. aiohomematic/model/generic/__init__.py +6 -4
  35. aiohomematic/model/generic/action.py +1 -1
  36. aiohomematic/model/generic/data_point.py +7 -5
  37. aiohomematic/model/generic/number.py +3 -3
  38. aiohomematic/model/generic/select.py +1 -1
  39. aiohomematic/model/generic/sensor.py +2 -2
  40. aiohomematic/model/generic/switch.py +3 -3
  41. aiohomematic/model/hub/__init__.py +17 -16
  42. aiohomematic/model/hub/data_point.py +12 -7
  43. aiohomematic/model/hub/number.py +3 -3
  44. aiohomematic/model/hub/select.py +3 -3
  45. aiohomematic/model/hub/text.py +2 -2
  46. aiohomematic/model/support.py +8 -7
  47. aiohomematic/model/update.py +6 -6
  48. aiohomematic/support.py +44 -38
  49. aiohomematic/validator.py +6 -6
  50. {aiohomematic-2025.10.1.dist-info → aiohomematic-2025.10.2.dist-info}/METADATA +1 -1
  51. aiohomematic-2025.10.2.dist-info/RECORD +78 -0
  52. aiohomematic_support/client_local.py +19 -12
  53. aiohomematic-2025.10.1.dist-info/RECORD +0 -78
  54. {aiohomematic-2025.10.1.dist-info → aiohomematic-2025.10.2.dist-info}/WHEEL +0 -0
  55. {aiohomematic-2025.10.1.dist-info → aiohomematic-2025.10.2.dist-info}/licenses/LICENSE +0 -0
  56. {aiohomematic-2025.10.1.dist-info → aiohomematic-2025.10.2.dist-info}/top_level.txt +0 -0
@@ -232,7 +232,7 @@ class CustomDpDimmer(CustomDataPoint):
232
232
  return None
233
233
 
234
234
  @bind_collector()
235
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
235
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
236
236
  """Turn the light on."""
237
237
  if (on_time := kwargs.get("on_time")) is not None:
238
238
  self.set_timer_on_time(on_time=on_time)
@@ -249,7 +249,9 @@ class CustomDpDimmer(CustomDataPoint):
249
249
  await self._dp_level.send_value(value=level, collector=collector)
250
250
 
251
251
  @bind_collector()
252
- async def turn_off(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOffArgs]) -> None:
252
+ async def turn_off(
253
+ self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOffArgs]
254
+ ) -> None:
253
255
  """Turn the light off."""
254
256
  self.reset_timer_on_time()
255
257
  if not self.is_state_change(off=True, **kwargs):
@@ -259,15 +261,19 @@ class CustomDpDimmer(CustomDataPoint):
259
261
  await self._dp_level.send_value(value=_DIMMER_OFF, collector=collector)
260
262
 
261
263
  @bind_collector()
262
- async def _set_on_time_value(self, on_time: float, collector: CallParameterCollector | None = None) -> None:
264
+ async def _set_on_time_value(self, *, on_time: float, collector: CallParameterCollector | None = None) -> None:
263
265
  """Set the on time value in seconds."""
264
266
  await self._dp_on_time_value.send_value(value=on_time, collector=collector, do_validate=False)
265
267
 
266
- async def _set_ramp_time_on_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
268
+ async def _set_ramp_time_on_value(
269
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
270
+ ) -> None:
267
271
  """Set the ramp time value in seconds."""
268
272
  await self._dp_ramp_time_value.send_value(value=ramp_time, collector=collector)
269
273
 
270
- async def _set_ramp_time_off_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
274
+ async def _set_ramp_time_off_value(
275
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
276
+ ) -> None:
271
277
  """Set the ramp time value in seconds."""
272
278
  await self._set_ramp_time_on_value(ramp_time=ramp_time, collector=collector)
273
279
 
@@ -323,7 +329,7 @@ class CustomDpColorDimmer(CustomDpDimmer):
323
329
  return _MIN_HUE, _MIN_SATURATION
324
330
 
325
331
  @bind_collector()
326
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
332
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
327
333
  """Turn the light on."""
328
334
  if not self.is_state_change(on=True, **kwargs):
329
335
  return
@@ -369,7 +375,7 @@ class CustomDpColorDimmerEffect(CustomDpColorDimmer):
369
375
  return self._effects
370
376
 
371
377
  @bind_collector()
372
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
378
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
373
379
  """Turn the light on."""
374
380
  if not self.is_state_change(on=True, **kwargs):
375
381
  return
@@ -405,7 +411,7 @@ class CustomDpColorTempDimmer(CustomDpDimmer):
405
411
  )
406
412
 
407
413
  @bind_collector()
408
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
414
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
409
415
  """Turn the light on."""
410
416
  if not self.is_state_change(on=True, **kwargs):
411
417
  return
@@ -528,7 +534,7 @@ class CustomDpIpRGBWLight(CustomDpDimmer):
528
534
  return self._dp_effect.values or ()
529
535
 
530
536
  @bind_collector()
531
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
537
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
532
538
  """Turn the light on."""
533
539
  if on_time := (kwargs.get("on_time") or self.get_and_start_timer()):
534
540
  kwargs["on_time"] = on_time
@@ -549,7 +555,9 @@ class CustomDpIpRGBWLight(CustomDpDimmer):
549
555
  await super().turn_on(collector=collector, **kwargs)
550
556
 
551
557
  @bind_collector()
552
- async def turn_off(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOffArgs]) -> None:
558
+ async def turn_off(
559
+ self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOffArgs]
560
+ ) -> None:
553
561
  """Turn the light off."""
554
562
  if kwargs.get("on_time") is None and kwargs.get("ramp_time"):
555
563
  await self._set_on_time_value(on_time=_NOT_USED, collector=collector)
@@ -563,21 +571,25 @@ class CustomDpIpRGBWLight(CustomDpDimmer):
563
571
  return _DeviceOperationMode(mode)
564
572
 
565
573
  @bind_collector()
566
- async def _set_on_time_value(self, on_time: float, collector: CallParameterCollector | None = None) -> None:
574
+ async def _set_on_time_value(self, *, on_time: float, collector: CallParameterCollector | None = None) -> None:
567
575
  """Set the on time value in seconds."""
568
576
  on_time, on_time_unit = _recalc_unit_timer(time=on_time)
569
577
  if on_time_unit is not None:
570
578
  await self._dp_on_time_unit.send_value(value=on_time_unit, collector=collector)
571
579
  await self._dp_on_time_value.send_value(value=float(on_time), collector=collector)
572
580
 
573
- async def _set_ramp_time_on_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
581
+ async def _set_ramp_time_on_value(
582
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
583
+ ) -> None:
574
584
  """Set the ramp time value in seconds."""
575
585
  ramp_time, ramp_time_unit = _recalc_unit_timer(time=ramp_time)
576
586
  if ramp_time_unit is not None:
577
587
  await self._dp_ramp_time_unit.send_value(value=ramp_time_unit, collector=collector)
578
588
  await self._dp_ramp_time_value.send_value(value=float(ramp_time), collector=collector)
579
589
 
580
- async def _set_ramp_time_off_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
590
+ async def _set_ramp_time_off_value(
591
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
592
+ ) -> None:
581
593
  """Set the ramp time value in seconds."""
582
594
  ramp_time, ramp_time_unit = _recalc_unit_timer(time=ramp_time)
583
595
  if ramp_time_unit is not None:
@@ -642,7 +654,7 @@ class CustomDpIpDrgDaliLight(CustomDpDimmer):
642
654
  return self._dp_effect.values or ()
643
655
 
644
656
  @bind_collector()
645
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
657
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
646
658
  """Turn the light on."""
647
659
  if not self.is_state_change(on=True, **kwargs):
648
660
  return
@@ -661,21 +673,25 @@ class CustomDpIpDrgDaliLight(CustomDpDimmer):
661
673
  await super().turn_on(collector=collector, **kwargs)
662
674
 
663
675
  @bind_collector()
664
- async def _set_on_time_value(self, on_time: float, collector: CallParameterCollector | None = None) -> None:
676
+ async def _set_on_time_value(self, *, on_time: float, collector: CallParameterCollector | None = None) -> None:
665
677
  """Set the on time value in seconds."""
666
678
  on_time, on_time_unit = _recalc_unit_timer(time=on_time)
667
679
  if on_time_unit:
668
680
  await self._dp_on_time_unit.send_value(value=on_time_unit, collector=collector)
669
681
  await self._dp_on_time_value.send_value(value=float(on_time), collector=collector)
670
682
 
671
- async def _set_ramp_time_on_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
683
+ async def _set_ramp_time_on_value(
684
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
685
+ ) -> None:
672
686
  """Set the ramp time value in seconds."""
673
687
  ramp_time, ramp_time_unit = _recalc_unit_timer(time=ramp_time)
674
688
  if ramp_time_unit:
675
689
  await self._dp_ramp_time_unit.send_value(value=ramp_time_unit, collector=collector)
676
690
  await self._dp_ramp_time_value.send_value(value=float(ramp_time), collector=collector)
677
691
 
678
- async def _set_ramp_time_off_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
692
+ async def _set_ramp_time_off_value(
693
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
694
+ ) -> None:
679
695
  """Set the ramp time value in seconds."""
680
696
  ramp_time, ramp_time_unit = _recalc_unit_timer(time=ramp_time)
681
697
  if ramp_time_unit:
@@ -751,12 +767,12 @@ class CustomDpIpFixedColorLight(CustomDpDimmer):
751
767
  return None
752
768
 
753
769
  @bind_collector()
754
- async def turn_on(self, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
770
+ async def turn_on(self, *, collector: CallParameterCollector | None = None, **kwargs: Unpack[LightOnArgs]) -> None:
755
771
  """Turn the light on."""
756
772
  if not self.is_state_change(on=True, **kwargs):
757
773
  return
758
774
  if (hs_color := kwargs.get("hs_color")) is not None:
759
- simple_rgb_color = _convert_color(hs_color)
775
+ simple_rgb_color = _convert_color(color=hs_color)
760
776
  await self._dp_color.send_value(value=simple_rgb_color, collector=collector)
761
777
  elif self.color_name in _NO_COLOR:
762
778
  await self._dp_color.send_value(value=_FixedColor.WHITE, collector=collector)
@@ -770,14 +786,16 @@ class CustomDpIpFixedColorLight(CustomDpDimmer):
770
786
  await super().turn_on(collector=collector, **kwargs)
771
787
 
772
788
  @bind_collector()
773
- async def _set_on_time_value(self, on_time: float, collector: CallParameterCollector | None = None) -> None:
789
+ async def _set_on_time_value(self, *, on_time: float, collector: CallParameterCollector | None = None) -> None:
774
790
  """Set the on time value in seconds."""
775
791
  on_time, on_time_unit = _recalc_unit_timer(time=on_time)
776
792
  if on_time_unit:
777
793
  await self._dp_on_time_unit.send_value(value=on_time_unit, collector=collector)
778
794
  await self._dp_on_time_value.send_value(value=float(on_time), collector=collector)
779
795
 
780
- async def _set_ramp_time_on_value(self, ramp_time: float, collector: CallParameterCollector | None = None) -> None:
796
+ async def _set_ramp_time_on_value(
797
+ self, *, ramp_time: float, collector: CallParameterCollector | None = None
798
+ ) -> None:
781
799
  """Set the ramp time value in seconds."""
782
800
  ramp_time, ramp_time_unit = _recalc_unit_timer(time=ramp_time)
783
801
  if ramp_time_unit:
@@ -785,7 +803,7 @@ class CustomDpIpFixedColorLight(CustomDpDimmer):
785
803
  await self._dp_ramp_time_value.send_value(value=float(ramp_time), collector=collector)
786
804
 
787
805
 
788
- def _recalc_unit_timer(time: float) -> tuple[float, int | None]:
806
+ def _recalc_unit_timer(*, time: float) -> tuple[float, int | None]:
789
807
  """Recalculate unit and value of timer."""
790
808
  ramp_time_unit = _TimeUnit.SECONDS
791
809
  if time == _NOT_USED:
@@ -799,7 +817,7 @@ def _recalc_unit_timer(time: float) -> tuple[float, int | None]:
799
817
  return time, ramp_time_unit
800
818
 
801
819
 
802
- def _convert_color(color: tuple[float, float]) -> str:
820
+ def _convert_color(*, color: tuple[float, float]) -> str:
803
821
  """
804
822
  Convert the given color to the reduced color of the device.
805
823
 
@@ -823,6 +841,7 @@ def _convert_color(color: tuple[float, float]) -> str:
823
841
 
824
842
 
825
843
  def make_ip_dimmer(
844
+ *,
826
845
  channel: hmd.Channel,
827
846
  custom_config: CustomConfig,
828
847
  ) -> None:
@@ -836,6 +855,7 @@ def make_ip_dimmer(
836
855
 
837
856
 
838
857
  def make_rf_dimmer(
858
+ *,
839
859
  channel: hmd.Channel,
840
860
  custom_config: CustomConfig,
841
861
  ) -> None:
@@ -849,6 +869,7 @@ def make_rf_dimmer(
849
869
 
850
870
 
851
871
  def make_rf_dimmer_color(
872
+ *,
852
873
  channel: hmd.Channel,
853
874
  custom_config: CustomConfig,
854
875
  ) -> None:
@@ -862,6 +883,7 @@ def make_rf_dimmer_color(
862
883
 
863
884
 
864
885
  def make_rf_dimmer_color_fixed(
886
+ *,
865
887
  channel: hmd.Channel,
866
888
  custom_config: CustomConfig,
867
889
  ) -> None:
@@ -875,6 +897,7 @@ def make_rf_dimmer_color_fixed(
875
897
 
876
898
 
877
899
  def make_rf_dimmer_color_effect(
900
+ *,
878
901
  channel: hmd.Channel,
879
902
  custom_config: CustomConfig,
880
903
  ) -> None:
@@ -888,6 +911,7 @@ def make_rf_dimmer_color_effect(
888
911
 
889
912
 
890
913
  def make_rf_dimmer_color_temp(
914
+ *,
891
915
  channel: hmd.Channel,
892
916
  custom_config: CustomConfig,
893
917
  ) -> None:
@@ -901,6 +925,7 @@ def make_rf_dimmer_color_temp(
901
925
 
902
926
 
903
927
  def make_rf_dimmer_with_virt_channel(
928
+ *,
904
929
  channel: hmd.Channel,
905
930
  custom_config: CustomConfig,
906
931
  ) -> None:
@@ -914,6 +939,7 @@ def make_rf_dimmer_with_virt_channel(
914
939
 
915
940
 
916
941
  def make_ip_fixed_color_light(
942
+ *,
917
943
  channel: hmd.Channel,
918
944
  custom_config: CustomConfig,
919
945
  ) -> None:
@@ -927,6 +953,7 @@ def make_ip_fixed_color_light(
927
953
 
928
954
 
929
955
  def make_ip_simple_fixed_color_light_wired(
956
+ *,
930
957
  channel: hmd.Channel,
931
958
  custom_config: CustomConfig,
932
959
  ) -> None:
@@ -940,6 +967,7 @@ def make_ip_simple_fixed_color_light_wired(
940
967
 
941
968
 
942
969
  def make_ip_rgbw_light(
970
+ *,
943
971
  channel: hmd.Channel,
944
972
  custom_config: CustomConfig,
945
973
  ) -> None:
@@ -953,6 +981,7 @@ def make_ip_rgbw_light(
953
981
 
954
982
 
955
983
  def make_ip_drg_dali_light(
984
+ *,
956
985
  channel: hmd.Channel,
957
986
  custom_config: CustomConfig,
958
987
  ) -> None:
@@ -85,17 +85,17 @@ class BaseCustomDpLock(CustomDataPoint):
85
85
 
86
86
  @abstractmethod
87
87
  @bind_collector()
88
- async def lock(self, collector: CallParameterCollector | None = None) -> None:
88
+ async def lock(self, *, collector: CallParameterCollector | None = None) -> None:
89
89
  """Lock the lock."""
90
90
 
91
91
  @abstractmethod
92
92
  @bind_collector()
93
- async def unlock(self, collector: CallParameterCollector | None = None) -> None:
93
+ async def unlock(self, *, collector: CallParameterCollector | None = None) -> None:
94
94
  """Unlock the lock."""
95
95
 
96
96
  @abstractmethod
97
97
  @bind_collector()
98
- async def open(self, collector: CallParameterCollector | None = None) -> None:
98
+ async def open(self, *, collector: CallParameterCollector | None = None) -> None:
99
99
  """Open the lock."""
100
100
 
101
101
 
@@ -146,17 +146,17 @@ class CustomDpIpLock(BaseCustomDpLock):
146
146
  return True
147
147
 
148
148
  @bind_collector()
149
- async def lock(self, collector: CallParameterCollector | None = None) -> None:
149
+ async def lock(self, *, collector: CallParameterCollector | None = None) -> None:
150
150
  """Lock the lock."""
151
151
  await self._dp_lock_target_level.send_value(value=_LockTargetLevel.LOCKED, collector=collector)
152
152
 
153
153
  @bind_collector()
154
- async def unlock(self, collector: CallParameterCollector | None = None) -> None:
154
+ async def unlock(self, *, collector: CallParameterCollector | None = None) -> None:
155
155
  """Unlock the lock."""
156
156
  await self._dp_lock_target_level.send_value(value=_LockTargetLevel.UNLOCKED, collector=collector)
157
157
 
158
158
  @bind_collector()
159
- async def open(self, collector: CallParameterCollector | None = None) -> None:
159
+ async def open(self, *, collector: CallParameterCollector | None = None) -> None:
160
160
  """Open the lock."""
161
161
  await self._dp_lock_target_level.send_value(value=_LockTargetLevel.OPEN, collector=collector)
162
162
 
@@ -187,17 +187,17 @@ class CustomDpButtonLock(BaseCustomDpLock):
187
187
  return False
188
188
 
189
189
  @bind_collector()
190
- async def lock(self, collector: CallParameterCollector | None = None) -> None:
190
+ async def lock(self, *, collector: CallParameterCollector | None = None) -> None:
191
191
  """Lock the lock."""
192
192
  await self._dp_button_lock.turn_on(collector=collector)
193
193
 
194
194
  @bind_collector()
195
- async def unlock(self, collector: CallParameterCollector | None = None) -> None:
195
+ async def unlock(self, *, collector: CallParameterCollector | None = None) -> None:
196
196
  """Unlock the lock."""
197
197
  await self._dp_button_lock.turn_off(collector=collector)
198
198
 
199
199
  @bind_collector()
200
- async def open(self, collector: CallParameterCollector | None = None) -> None:
200
+ async def open(self, *, collector: CallParameterCollector | None = None) -> None:
201
201
  """Open the lock."""
202
202
  return
203
203
 
@@ -254,22 +254,23 @@ class CustomDpRfLock(BaseCustomDpLock):
254
254
  return True
255
255
 
256
256
  @bind_collector()
257
- async def lock(self, collector: CallParameterCollector | None = None) -> None:
257
+ async def lock(self, *, collector: CallParameterCollector | None = None) -> None:
258
258
  """Lock the lock."""
259
259
  await self._dp_state.send_value(value=False, collector=collector)
260
260
 
261
261
  @bind_collector()
262
- async def unlock(self, collector: CallParameterCollector | None = None) -> None:
262
+ async def unlock(self, *, collector: CallParameterCollector | None = None) -> None:
263
263
  """Unlock the lock."""
264
264
  await self._dp_state.send_value(value=True, collector=collector)
265
265
 
266
266
  @bind_collector()
267
- async def open(self, collector: CallParameterCollector | None = None) -> None:
267
+ async def open(self, *, collector: CallParameterCollector | None = None) -> None:
268
268
  """Open the lock."""
269
269
  await self._dp_open.send_value(value=True, collector=collector)
270
270
 
271
271
 
272
272
  def make_ip_lock(
273
+ *,
273
274
  channel: hmd.Channel,
274
275
  custom_config: CustomConfig,
275
276
  ) -> None:
@@ -283,6 +284,7 @@ def make_ip_lock(
283
284
 
284
285
 
285
286
  def make_ip_button_lock(
287
+ *,
286
288
  channel: hmd.Channel,
287
289
  custom_config: CustomConfig,
288
290
  ) -> None:
@@ -296,6 +298,7 @@ def make_ip_button_lock(
296
298
 
297
299
 
298
300
  def make_rf_button_lock(
301
+ *,
299
302
  channel: hmd.Channel,
300
303
  custom_config: CustomConfig,
301
304
  ) -> None:
@@ -309,6 +312,7 @@ def make_rf_button_lock(
309
312
 
310
313
 
311
314
  def make_rf_lock(
315
+ *,
312
316
  channel: hmd.Channel,
313
317
  custom_config: CustomConfig,
314
318
  ) -> None:
@@ -86,7 +86,7 @@ class BaseCustomDpSiren(CustomDataPoint):
86
86
 
87
87
  @abstractmethod
88
88
  @bind_collector()
89
- async def turn_off(self, collector: CallParameterCollector | None = None) -> None:
89
+ async def turn_off(self, *, collector: CallParameterCollector | None = None) -> None:
90
90
  """Turn the device off."""
91
91
 
92
92
 
@@ -169,7 +169,7 @@ class CustomDpIpSiren(BaseCustomDpSiren):
169
169
  await self._dp_duration.send_value(value=duration, collector=collector)
170
170
 
171
171
  @bind_collector()
172
- async def turn_off(self, collector: CallParameterCollector | None = None) -> None:
172
+ async def turn_off(self, *, collector: CallParameterCollector | None = None) -> None:
173
173
  """Turn the device off."""
174
174
  await self._dp_acoustic_alarm_selection.send_value(
175
175
  value=self._dp_acoustic_alarm_selection.default, collector=collector
@@ -224,6 +224,7 @@ class CustomDpIpSirenSmoke(BaseCustomDpSiren):
224
224
  @bind_collector()
225
225
  async def turn_on(
226
226
  self,
227
+ *,
227
228
  collector: CallParameterCollector | None = None,
228
229
  **kwargs: Unpack[SirenOnArgs],
229
230
  ) -> None:
@@ -231,12 +232,13 @@ class CustomDpIpSirenSmoke(BaseCustomDpSiren):
231
232
  await self._dp_smoke_detector_command.send_value(value=_SirenCommand.ON, collector=collector)
232
233
 
233
234
  @bind_collector()
234
- async def turn_off(self, collector: CallParameterCollector | None = None) -> None:
235
+ async def turn_off(self, *, collector: CallParameterCollector | None = None) -> None:
235
236
  """Turn the device off."""
236
237
  await self._dp_smoke_detector_command.send_value(value=_SirenCommand.OFF, collector=collector)
237
238
 
238
239
 
239
240
  def make_ip_siren(
241
+ *,
240
242
  channel: hmd.Channel,
241
243
  custom_config: CustomConfig,
242
244
  ) -> None:
@@ -250,6 +252,7 @@ def make_ip_siren(
250
252
 
251
253
 
252
254
  def make_ip_siren_smoke(
255
+ *,
253
256
  channel: hmd.Channel,
254
257
  custom_config: CustomConfig,
255
258
  ) -> None:
@@ -60,7 +60,7 @@ class CustomDpSwitch(CustomDataPoint):
60
60
  return self._dp_state.value
61
61
 
62
62
  @bind_collector()
63
- async def turn_on(self, collector: CallParameterCollector | None = None, on_time: float | None = None) -> None:
63
+ async def turn_on(self, *, on_time: float | None = None, collector: CallParameterCollector | None = None) -> None:
64
64
  """Turn the switch on."""
65
65
  if on_time is not None:
66
66
  self.set_timer_on_time(on_time=on_time)
@@ -72,7 +72,7 @@ class CustomDpSwitch(CustomDataPoint):
72
72
  await self._dp_state.turn_on(collector=collector)
73
73
 
74
74
  @bind_collector()
75
- async def turn_off(self, collector: CallParameterCollector | None = None) -> None:
75
+ async def turn_off(self, *, collector: CallParameterCollector | None = None) -> None:
76
76
  """Turn the switch off."""
77
77
  self.reset_timer_on_time()
78
78
  if not self.is_state_change(off=True):
@@ -93,6 +93,7 @@ class CustomDpSwitch(CustomDataPoint):
93
93
 
94
94
 
95
95
  def make_ip_switch(
96
+ *,
96
97
  channel: hmd.Channel,
97
98
  custom_config: CustomConfig,
98
99
  ) -> None:
@@ -60,7 +60,7 @@ class CustomDpIpIrrigationValve(CustomDataPoint):
60
60
  return self._dp_state.value
61
61
 
62
62
  @bind_collector()
63
- async def open(self, collector: CallParameterCollector | None = None, on_time: float | None = None) -> None:
63
+ async def open(self, *, on_time: float | None = None, collector: CallParameterCollector | None = None) -> None:
64
64
  """Turn the valve on."""
65
65
  if on_time is not None:
66
66
  self.set_timer_on_time(on_time=on_time)
@@ -72,7 +72,7 @@ class CustomDpIpIrrigationValve(CustomDataPoint):
72
72
  await self._dp_state.turn_on(collector=collector)
73
73
 
74
74
  @bind_collector()
75
- async def close(self, collector: CallParameterCollector | None = None) -> None:
75
+ async def close(self, *, collector: CallParameterCollector | None = None) -> None:
76
76
  """Turn the valve off."""
77
77
  self.reset_timer_on_time()
78
78
  if not self.is_state_change(off=True):
@@ -93,6 +93,7 @@ class CustomDpIpIrrigationValve(CustomDataPoint):
93
93
 
94
94
 
95
95
  def make_ip_irrigation_valve(
96
+ *,
96
97
  channel: hmd.Channel,
97
98
  custom_config: CustomConfig,
98
99
  ) -> None: