aiohomematic 2025.9.5__tar.gz → 2025.9.6__tar.gz

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 (106) hide show
  1. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/PKG-INFO +13 -3
  2. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/README.md +12 -2
  3. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/__init__.py +1 -1
  4. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/caches/dynamic.py +1 -1
  5. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/caches/persistent.py +1 -1
  6. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/caches/visibility.py +1 -1
  7. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/central/__init__.py +5 -5
  8. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/client/__init__.py +4 -4
  9. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/client/json_rpc.py +3 -3
  10. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/client/xml_rpc.py +1 -1
  11. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/const.py +13 -13
  12. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/hmcli.py +5 -5
  13. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/data_point.py +1 -1
  14. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/climate.py +4 -4
  15. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/cover.py +6 -6
  16. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/light.py +10 -10
  17. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/lock.py +3 -3
  18. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/siren.py +1 -1
  19. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/switch.py +1 -1
  20. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/valve.py +1 -1
  21. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/data_point.py +2 -2
  22. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/device.py +19 -15
  23. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/event.py +1 -1
  24. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/__init__.py +2 -2
  25. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/button.py +1 -1
  26. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/data_point.py +3 -3
  27. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic.egg-info/PKG-INFO +13 -3
  28. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/LICENSE +0 -0
  29. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/async_support.py +0 -0
  30. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/caches/__init__.py +0 -0
  31. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/central/decorators.py +0 -0
  32. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/central/xml_rpc_server.py +0 -0
  33. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/client/_rpc_errors.py +0 -0
  34. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/context.py +0 -0
  35. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/converter.py +0 -0
  36. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/decorators.py +0 -0
  37. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/exceptions.py +0 -0
  38. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/__init__.py +0 -0
  39. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/__init__.py +0 -0
  40. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/climate.py +0 -0
  41. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/operating_voltage_level.py +0 -0
  42. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/support.py +0 -0
  43. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/__init__.py +0 -0
  44. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/const.py +0 -0
  45. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/data_point.py +0 -0
  46. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/definition.py +0 -0
  47. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/custom/support.py +0 -0
  48. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/__init__.py +0 -0
  49. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/action.py +0 -0
  50. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/binary_sensor.py +0 -0
  51. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/button.py +0 -0
  52. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/data_point.py +0 -0
  53. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/number.py +0 -0
  54. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/select.py +0 -0
  55. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/sensor.py +0 -0
  56. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/switch.py +0 -0
  57. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/generic/text.py +0 -0
  58. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/binary_sensor.py +0 -0
  59. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/number.py +0 -0
  60. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/select.py +0 -0
  61. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/sensor.py +0 -0
  62. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/switch.py +0 -0
  63. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/hub/text.py +0 -0
  64. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/support.py +0 -0
  65. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/model/update.py +0 -0
  66. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/property_decorators.py +0 -0
  67. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/py.typed +0 -0
  68. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/fetch_all_device_data.fn +0 -0
  69. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/get_program_descriptions.fn +0 -0
  70. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/get_serial.fn +0 -0
  71. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/get_system_variable_descriptions.fn +0 -0
  72. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/set_program_state.fn +0 -0
  73. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/set_system_variable.fn +0 -0
  74. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/support.py +0 -0
  75. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic/validator.py +0 -0
  76. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic.egg-info/SOURCES.txt +0 -0
  77. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic.egg-info/dependency_links.txt +0 -0
  78. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic.egg-info/requires.txt +0 -0
  79. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic.egg-info/top_level.txt +0 -0
  80. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic_support/__init__.py +0 -0
  81. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/aiohomematic_support/client_local.py +0 -0
  82. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/pyproject.toml +0 -0
  83. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/setup.cfg +0 -0
  84. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_action.py +0 -0
  85. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_binary_sensor.py +0 -0
  86. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_button.py +0 -0
  87. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_calculated_support.py +0 -0
  88. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_central.py +0 -0
  89. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_central_pydevccu.py +0 -0
  90. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_climate.py +0 -0
  91. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_cover.py +0 -0
  92. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_decorator.py +0 -0
  93. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_device.py +0 -0
  94. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_entity.py +0 -0
  95. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_event.py +0 -0
  96. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_json_rpc.py +0 -0
  97. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_light.py +0 -0
  98. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_lock.py +0 -0
  99. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_number.py +0 -0
  100. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_select.py +0 -0
  101. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_sensor.py +0 -0
  102. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_siren.py +0 -0
  103. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_support.py +0 -0
  104. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_switch.py +0 -0
  105. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_text.py +0 -0
  106. {aiohomematic-2025.9.5 → aiohomematic-2025.9.6}/tests/test_valve.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.9.5
3
+ Version: 2025.9.6
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>
@@ -26,9 +26,13 @@ Requires-Dist: python-slugify>=8.0.0
26
26
  Requires-Dist: voluptuous>=0.14.0
27
27
  Dynamic: license-file
28
28
 
29
+ [![releasebadge]][release]
30
+ [![License][license-shield]](LICENSE.md)
31
+ [![GitHub Sponsors][sponsorsbadge]][sponsors]
32
+
29
33
  # AIO Homematic (hahomematic)
30
34
 
31
- A lightweight Python 3 library that powers Home Assistant integrations for controlling and monitoring [HomeMatic](https://www.eq-3.com/products/homematic.html) and [HomematicIP](https://www.homematic-ip.com/en/start.html) devices. Some third‑party devices/gateways (e.g., Bosch, Intertechno) may be supported as well.
35
+ A lightweight Python 3 library that powers Home Assistant integrations for controlling and monitoring [Homematic](https://www.eq-3.com/products/homematic.html) and [HomematicIP](https://www.homematic-ip.com/en/start.html) devices. Some third‑party devices/gateways (e.g., Bosch, Intertechno) may be supported as well.
32
36
 
33
37
  This project is the modern successor to [pyhomematic](https://github.com/danielperna84/pyhomematic), focusing on automatic entity creation, fewer manual device definitions, and faster startups.
34
38
 
@@ -53,7 +57,7 @@ Use the Home Assistant custom integration "Homematic(IP) Local", which is powere
53
57
 
54
58
  1. Prerequisites
55
59
  - Use latest version of Home Assistant.
56
- - A CCU3, OpenCCU/RaspberryMatic, or Homegear instance reachable from Home Assistant.
60
+ - A CCU3, OpenCCU, or Homegear instance reachable from Home Assistant.
57
61
  - For HomematicIP devices, ensure CCU firmware meets the minimum versions listed below.
58
62
  2. Install the integration
59
63
  - Add the custom repository and install: https://github.com/sukramj/homematicip_local
@@ -125,3 +129,9 @@ Example:
125
129
  - Home Assistant lifecycle (discovery, updates, teardown): [see](docs/homeassistant_lifecycle.md) for details on how the integration works and how to debug issues.
126
130
  - RSSI fix: [see](docs/rssi_fix.md) for how RSSI values are fixed for Home Assistant.
127
131
  - Sequence diagrams: [see](docs/sequence_diagrams.md) for a sequence diagram of how the library works.
132
+
133
+ [license-shield]: https://img.shields.io/github/license/SukramJ/aiohomematic.svg?style=for-the-badge
134
+ [release]: https://github.com/SukramJ/aiohomematic/releases
135
+ [releasebadge]: https://img.shields.io/github/v/release/SukramJ/aiohomematic?style=for-the-badge
136
+ [sponsorsbadge]: https://img.shields.io/github/sponsors/SukramJ?style=for-the-badge&label=GitHub%20Sponsors&color=green
137
+ [sponsors]: https://github.com/sponsors/SukramJ
@@ -1,6 +1,10 @@
1
+ [![releasebadge]][release]
2
+ [![License][license-shield]](LICENSE.md)
3
+ [![GitHub Sponsors][sponsorsbadge]][sponsors]
4
+
1
5
  # AIO Homematic (hahomematic)
2
6
 
3
- A lightweight Python 3 library that powers Home Assistant integrations for controlling and monitoring [HomeMatic](https://www.eq-3.com/products/homematic.html) and [HomematicIP](https://www.homematic-ip.com/en/start.html) devices. Some third‑party devices/gateways (e.g., Bosch, Intertechno) may be supported as well.
7
+ A lightweight Python 3 library that powers Home Assistant integrations for controlling and monitoring [Homematic](https://www.eq-3.com/products/homematic.html) and [HomematicIP](https://www.homematic-ip.com/en/start.html) devices. Some third‑party devices/gateways (e.g., Bosch, Intertechno) may be supported as well.
4
8
 
5
9
  This project is the modern successor to [pyhomematic](https://github.com/danielperna84/pyhomematic), focusing on automatic entity creation, fewer manual device definitions, and faster startups.
6
10
 
@@ -25,7 +29,7 @@ Use the Home Assistant custom integration "Homematic(IP) Local", which is powere
25
29
 
26
30
  1. Prerequisites
27
31
  - Use latest version of Home Assistant.
28
- - A CCU3, OpenCCU/RaspberryMatic, or Homegear instance reachable from Home Assistant.
32
+ - A CCU3, OpenCCU, or Homegear instance reachable from Home Assistant.
29
33
  - For HomematicIP devices, ensure CCU firmware meets the minimum versions listed below.
30
34
  2. Install the integration
31
35
  - Add the custom repository and install: https://github.com/sukramj/homematicip_local
@@ -97,3 +101,9 @@ Example:
97
101
  - Home Assistant lifecycle (discovery, updates, teardown): [see](docs/homeassistant_lifecycle.md) for details on how the integration works and how to debug issues.
98
102
  - RSSI fix: [see](docs/rssi_fix.md) for how RSSI values are fixed for Home Assistant.
99
103
  - Sequence diagrams: [see](docs/sequence_diagrams.md) for a sequence diagram of how the library works.
104
+
105
+ [license-shield]: https://img.shields.io/github/license/SukramJ/aiohomematic.svg?style=for-the-badge
106
+ [release]: https://github.com/SukramJ/aiohomematic/releases
107
+ [releasebadge]: https://img.shields.io/github/v/release/SukramJ/aiohomematic?style=for-the-badge
108
+ [sponsorsbadge]: https://img.shields.io/github/sponsors/SukramJ?style=for-the-badge&label=GitHub%20Sponsors&color=green
109
+ [sponsors]: https://github.com/sponsors/SukramJ
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  """
4
- AioHomematic: a Python 3 library to interact with HomeMatic and HomematicIP backends.
4
+ AioHomematic: a Python 3 library to interact with Homematic and HomematicIP backends.
5
5
 
6
6
  Public API at the top-level package is defined by __all__.
7
7
 
@@ -4,7 +4,7 @@
4
4
  Dynamic caches used at runtime by the central unit and clients.
5
5
 
6
6
  This module provides short-lived, in-memory caches that support robust and efficient
7
- communication with HomeMatic interfaces:
7
+ communication with Homematic interfaces:
8
8
 
9
9
  - CommandCache: Tracks recently sent commands and their values per data point,
10
10
  allowing suppression of immediate echo updates or reconciliation with incoming
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  """
4
- Persistent caches used to persist HomeMatic metadata between runs.
4
+ Persistent caches used to persist Homematic metadata between runs.
5
5
 
6
6
  This module provides on-disk caches that complement the short‑lived, in‑memory
7
7
  caches from aiohomematic.caches.dynamic. The goal is to minimize expensive data
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  """
4
- Parameter visibility rules and cache for HomeMatic data points.
4
+ Parameter visibility rules and cache for Homematic data points.
5
5
 
6
6
  This module determines which parameters should be created, shown, hidden,
7
7
  ignored, or un‑ignored for channels and devices. It centralizes the rules
@@ -1,12 +1,12 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  """
4
- Central unit and core orchestration for HomeMatic CCU and compatible backends.
4
+ Central unit and core orchestration for Homematic CCU and compatible backends.
5
5
 
6
6
  Overview
7
7
  --------
8
8
  This package provides the central coordination layer for aiohomematic. It models a
9
- HomeMatic CCU (or compatible backend such as Homegear) and orchestrates
9
+ Homematic CCU (or compatible backend such as Homegear) and orchestrates
10
10
  interfaces, devices, channels, data points, events, and background jobs.
11
11
 
12
12
  The central unit ties together the various submodules: caches, client adapters
@@ -818,18 +818,18 @@ class CentralUnit(LogContextMixin, PayloadMixin):
818
818
  return self._clients[interface_id]
819
819
 
820
820
  def get_channel(self, channel_address: str) -> Channel | None:
821
- """Return homematic channel."""
821
+ """Return Homematic channel."""
822
822
  if device := self.get_device(address=channel_address):
823
823
  return device.get_channel(channel_address=channel_address)
824
824
  return None
825
825
 
826
826
  def get_device(self, address: str) -> Device | None:
827
- """Return homematic device."""
827
+ """Return Homematic device."""
828
828
  d_address = get_device_address(address=address)
829
829
  return self._devices.get(d_address)
830
830
 
831
831
  def get_data_point_by_custom_id(self, custom_id: str) -> CallbackDataPoint | None:
832
- """Return homematic data_point by custom_id."""
832
+ """Return Homematic data_point by custom_id."""
833
833
  for dp in self.get_data_points(registered=True):
834
834
  if dp.custom_id == custom_id:
835
835
  return dp
@@ -1,12 +1,12 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  """
4
- Client adapters for communicating with HomeMatic CCU and compatible backends.
4
+ Client adapters for communicating with Homematic CCU and compatible backends.
5
5
 
6
6
  Overview
7
7
  --------
8
8
  This package provides client implementations that abstract the transport details of
9
- HomeMatic backends (e.g., CCU via JSON-RPC/XML-RPC or Homegear) and expose a
9
+ Homematic backends (e.g., CCU via JSON-RPC/XML-RPC or Homegear) and expose a
10
10
  consistent API used by the central module.
11
11
 
12
12
  Provided clients
@@ -997,7 +997,7 @@ class Client(ABC, LogContextMixin):
997
997
 
998
998
  @inspector
999
999
  async def update_device_firmware(self, device_address: str) -> bool:
1000
- """Update the firmware of a homematic device."""
1000
+ """Update the firmware of a Homematic device."""
1001
1001
  if device := self.central.get_device(address=device_address):
1002
1002
  _LOGGER.info(
1003
1003
  "UPDATE_DEVICE_FIRMWARE: Trying firmware update for %s",
@@ -1320,7 +1320,7 @@ class ClientJsonCCU(ClientCCU):
1320
1320
 
1321
1321
  @inspector(re_raise=False, measure_performance=True)
1322
1322
  async def list_devices(self) -> tuple[DeviceDescription, ...] | None:
1323
- """List devices of homematic backend."""
1323
+ """List devices of Homematic backend."""
1324
1324
  try:
1325
1325
  return await self._json_rpc_client.list_devices(interface=self.interface)
1326
1326
  except BaseHomematicException as bhexc:
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: MIT
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  """
4
- Asynchronous JSON-RPC client for HomeMatic CCU-compatible backends.
4
+ Asynchronous JSON-RPC client for Homematic CCU-compatible backends.
5
5
 
6
6
  Overview
7
7
  --------
@@ -106,7 +106,7 @@ _LOGGER: Final = logging.getLogger(__name__)
106
106
 
107
107
 
108
108
  class _JsonKey(StrEnum):
109
- """Enum for homematic json keys."""
109
+ """Enum for Homematic json keys."""
110
110
 
111
111
  ADDRESS = "address"
112
112
  CHANNEL_IDS = "channelIds"
@@ -138,7 +138,7 @@ class _JsonKey(StrEnum):
138
138
 
139
139
 
140
140
  class _JsonRpcMethod(StrEnum):
141
- """Enum for homematic json rpc methods types."""
141
+ """Enum for Homematic json rpc methods types."""
142
142
 
143
143
  CCU_GET_AUTH_ENABLED = "CCU.getAuthEnabled"
144
144
  CCU_GET_HTTPS_REDIRECT_ENABLED = "CCU.getHttpsRedirectEnabled"
@@ -52,7 +52,7 @@ _VERIFY_TLS: Final = "verify_tls"
52
52
 
53
53
 
54
54
  class _XmlRpcMethod(StrEnum):
55
- """Enum for homematic json rpc methods types."""
55
+ """Enum for Homematic json rpc methods types."""
56
56
 
57
57
  GET_VERSION = "getVersion"
58
58
  HOMEGEAR_INIT = "clientServerInitialized"
@@ -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.9.5"
22
+ VERSION: Final = "2025.9.6"
23
23
 
24
24
  # Detect test speedup mode via environment
25
25
  _TEST_SPEEDUP: Final = (
@@ -241,7 +241,7 @@ class DescriptionMarker(StrEnum):
241
241
 
242
242
 
243
243
  class DeviceFirmwareState(StrEnum):
244
- """Enum with homematic device firmware states."""
244
+ """Enum with Homematic device firmware states."""
245
245
 
246
246
  UNKNOWN = "UNKNOWN"
247
247
  UP_TO_DATE = "UP_TO_DATE"
@@ -284,7 +284,7 @@ class EventType(StrEnum):
284
284
 
285
285
 
286
286
  class Flag(IntEnum):
287
- """Enum with homematic flags."""
287
+ """Enum with Homematic flags."""
288
288
 
289
289
  VISIBLE = 1
290
290
  INTERNAL = 2
@@ -310,7 +310,7 @@ class Manufacturer(StrEnum):
310
310
 
311
311
 
312
312
  class Operations(IntEnum):
313
- """Enum with homematic operations."""
313
+ """Enum with Homematic operations."""
314
314
 
315
315
  NONE = 0 # not used
316
316
  READ = 1
@@ -319,7 +319,7 @@ class Operations(IntEnum):
319
319
 
320
320
 
321
321
  class CalulatedParameter(StrEnum):
322
- """Enum with calculated homematic parameters."""
322
+ """Enum with calculated Homematic parameters."""
323
323
 
324
324
  APPARENT_TEMPERATURE = "APPARENT_TEMPERATURE"
325
325
  DEW_POINT = "DEW_POINT"
@@ -329,7 +329,7 @@ class CalulatedParameter(StrEnum):
329
329
 
330
330
 
331
331
  class Parameter(StrEnum):
332
- """Enum with homematic parameters."""
332
+ """Enum with Homematic parameters."""
333
333
 
334
334
  ACOUSTIC_ALARM_ACTIVE = "ACOUSTIC_ALARM_ACTIVE"
335
335
  ACOUSTIC_ALARM_SELECTION = "ACOUSTIC_ALARM_SELECTION"
@@ -464,7 +464,7 @@ class ParamsetKey(StrEnum):
464
464
 
465
465
 
466
466
  class ProductGroup(StrEnum):
467
- """Enum with homematic product groups."""
467
+ """Enum with Homematic product groups."""
468
468
 
469
469
  HM = "BidCos-RF"
470
470
  HMIP = "HmIP-RF"
@@ -475,7 +475,7 @@ class ProductGroup(StrEnum):
475
475
 
476
476
 
477
477
  class RegaScript(StrEnum):
478
- """Enum with homematic rega scripts."""
478
+ """Enum with Homematic rega scripts."""
479
479
 
480
480
  FETCH_ALL_DEVICE_DATA: Final = "fetch_all_device_data.fn"
481
481
  GET_PROGRAM_DESCRIPTIONS: Final = "get_program_descriptions.fn"
@@ -486,7 +486,7 @@ class RegaScript(StrEnum):
486
486
 
487
487
 
488
488
  class Interface(StrEnum):
489
- """Enum with homematic interfaces."""
489
+ """Enum with Homematic interfaces."""
490
490
 
491
491
  BIDCOS_RF = "BidCos-RF"
492
492
  BIDCOS_WIRED = "BidCos-Wired"
@@ -517,7 +517,7 @@ class ProxyInitState(Enum):
517
517
 
518
518
 
519
519
  class RxMode(IntEnum):
520
- """Enum for homematic rx modes."""
520
+ """Enum for Homematic rx modes."""
521
521
 
522
522
  UNDEFINED = 0
523
523
  ALWAYS = 1
@@ -528,14 +528,14 @@ class RxMode(IntEnum):
528
528
 
529
529
 
530
530
  class CommandRxMode(StrEnum):
531
- """Enum for homematic rx modes for commands."""
531
+ """Enum for Homematic rx modes for commands."""
532
532
 
533
533
  BURST = "BURST"
534
534
  WAKEUP = "WAKEUP"
535
535
 
536
536
 
537
537
  class SysvarType(StrEnum):
538
- """Enum for homematic sysvar types."""
538
+ """Enum for Homematic sysvar types."""
539
539
 
540
540
  ALARM = "ALARM"
541
541
  FLOAT = "FLOAT"
@@ -547,7 +547,7 @@ class SysvarType(StrEnum):
547
547
 
548
548
 
549
549
  class ParameterType(StrEnum):
550
- """Enum for homematic parameter types."""
550
+ """Enum for Homematic parameter types."""
551
551
 
552
552
  ACTION = "ACTION" # Usually buttons, send Boolean to trigger
553
553
  BOOL = "BOOL"
@@ -2,7 +2,7 @@
2
2
  # Copyright (c) 2021-2025 Daniel Perna, SukramJ
3
3
  #!/usr/bin/python3
4
4
  """
5
- Commandline tool to query HomeMatic hubs via XML-RPC.
5
+ Commandline tool to query Homematic hubs via XML-RPC.
6
6
 
7
7
  Public API of this module is defined by __all__.
8
8
 
@@ -28,7 +28,7 @@ __all__ = ["main"]
28
28
  def main() -> None:
29
29
  """Start the cli."""
30
30
  parser = argparse.ArgumentParser(
31
- description="Commandline tool to query HomeMatic hubs via XML-RPC",
31
+ description="Commandline tool to query Homematic hubs via XML-RPC",
32
32
  )
33
33
  parser.add_argument("--version", action="version", version=__version__)
34
34
  parser.add_argument(
@@ -85,18 +85,18 @@ def main() -> None:
85
85
  "-a",
86
86
  required=True,
87
87
  type=str,
88
- help="Address of HomeMatic device, including channel",
88
+ help="Address of Homematic device, including channel",
89
89
  )
90
90
  parser.add_argument(
91
91
  "--paramset_key",
92
92
  default=ParamsetKey.VALUES,
93
93
  choices=[ParamsetKey.VALUES, ParamsetKey.MASTER],
94
- help="Paramset of HomeMatic device. Default: VALUES",
94
+ help="Paramset of Homematic device. Default: VALUES",
95
95
  )
96
96
  parser.add_argument(
97
97
  "--parameter",
98
98
  required=True,
99
- help="Parameter of HomeMatic device",
99
+ help="Parameter of Homematic device",
100
100
  )
101
101
  parser.add_argument(
102
102
  "--value",
@@ -159,7 +159,7 @@ class CalculatedDataPoint[ParameterT: GenericParameterType](BaseDataPoint):
159
159
 
160
160
  @property
161
161
  def hmtype(self) -> ParameterType:
162
- """Return the HomeMatic type."""
162
+ """Return the Homematic type."""
163
163
  return self._type
164
164
 
165
165
  @config_property
@@ -165,7 +165,7 @@ _SCHEDULE_DICT = dict[ScheduleProfile, PROFILE_DICT]
165
165
 
166
166
 
167
167
  class BaseCustomDpClimate(CustomDataPoint):
168
- """Base HomeMatic climate data_point."""
168
+ """Base Homematic climate data_point."""
169
169
 
170
170
  __slots__ = (
171
171
  "_dp_humidity",
@@ -690,13 +690,13 @@ class BaseCustomDpClimate(CustomDataPoint):
690
690
 
691
691
 
692
692
  class CustomDpSimpleRfThermostat(BaseCustomDpClimate):
693
- """Simple classic HomeMatic thermostat HM-CC-TC."""
693
+ """Simple classic Homematic thermostat HM-CC-TC."""
694
694
 
695
695
  __slots__ = ()
696
696
 
697
697
 
698
698
  class CustomDpRfThermostat(BaseCustomDpClimate):
699
- """Classic HomeMatic thermostat like HM-CC-RT-DN."""
699
+ """Classic Homematic thermostat like HM-CC-RT-DN."""
700
700
 
701
701
  __slots__ = (
702
702
  "_dp_auto_mode",
@@ -720,7 +720,7 @@ class CustomDpRfThermostat(BaseCustomDpClimate):
720
720
  group_no: int,
721
721
  custom_config: CustomConfig,
722
722
  ) -> None:
723
- """Initialize the climate rf thermostat."""
723
+ """Initialize the Homematic thermostat."""
724
724
  super().__init__(
725
725
  channel=channel,
726
726
  unique_id=unique_id,
@@ -92,7 +92,7 @@ class _StateChangeArg(StrEnum):
92
92
 
93
93
 
94
94
  class CustomDpCover(CustomDataPoint):
95
- """Class for HomeMatic cover data point."""
95
+ """Class for Homematic cover data point."""
96
96
 
97
97
  __slots__ = (
98
98
  "_command_processing_lock",
@@ -255,7 +255,7 @@ class CustomDpWindowDrive(CustomDpCover):
255
255
 
256
256
 
257
257
  class CustomDpBlind(CustomDpCover):
258
- """Class for HomeMatic blind data point."""
258
+ """Class for Homematic blind data point."""
259
259
 
260
260
  __slots__ = (
261
261
  "_dp_combined",
@@ -519,7 +519,7 @@ class CustomDpIpBlind(CustomDpBlind):
519
519
 
520
520
 
521
521
  class CustomDpGarage(CustomDataPoint):
522
- """Class for HomeMatic garage data point."""
522
+ """Class for Homematic garage data point."""
523
523
 
524
524
  __slots__ = (
525
525
  "_dp_door_command",
@@ -642,7 +642,7 @@ def make_rf_cover(
642
642
  channel: hmd.Channel,
643
643
  custom_config: CustomConfig,
644
644
  ) -> None:
645
- """Create HomeMatic classic cover data point."""
645
+ """Create Homematic classic cover data point."""
646
646
  hmed.make_custom_data_point(
647
647
  channel=channel,
648
648
  data_point_class=CustomDpCover,
@@ -694,7 +694,7 @@ def make_rf_blind(
694
694
  channel: hmd.Channel,
695
695
  custom_config: CustomConfig,
696
696
  ) -> None:
697
- """Create HomeMatic classic cover data point."""
697
+ """Create Homematic classic cover data point."""
698
698
  hmed.make_custom_data_point(
699
699
  channel=channel,
700
700
  data_point_class=CustomDpBlind,
@@ -707,7 +707,7 @@ def make_rf_window_drive(
707
707
  channel: hmd.Channel,
708
708
  custom_config: CustomConfig,
709
709
  ) -> None:
710
- """Create HomeMatic classic window drive data point."""
710
+ """Create Homematic classic window drive data point."""
711
711
  hmed.make_custom_data_point(
712
712
  channel=channel,
713
713
  data_point_class=CustomDpWindowDrive,
@@ -137,7 +137,7 @@ class LightOffArgs(TypedDict, total=False):
137
137
 
138
138
 
139
139
  class CustomDpDimmer(CustomDataPoint):
140
- """Base class for HomeMatic light data point."""
140
+ """Base class for Homematic light data point."""
141
141
 
142
142
  __slots__ = (
143
143
  "_dp_group_level",
@@ -299,7 +299,7 @@ class CustomDpDimmer(CustomDataPoint):
299
299
 
300
300
 
301
301
  class CustomDpColorDimmer(CustomDpDimmer):
302
- """Class for HomeMatic dimmer with color data point."""
302
+ """Class for Homematic dimmer with color data point."""
303
303
 
304
304
  __slots__ = ("_dp_color",)
305
305
 
@@ -337,7 +337,7 @@ class CustomDpColorDimmer(CustomDpDimmer):
337
337
 
338
338
 
339
339
  class CustomDpColorDimmerEffect(CustomDpColorDimmer):
340
- """Class for HomeMatic dimmer with color data point."""
340
+ """Class for Homematic dimmer with color data point."""
341
341
 
342
342
  __slots__ = ("_dp_effect",)
343
343
 
@@ -388,7 +388,7 @@ class CustomDpColorDimmerEffect(CustomDpColorDimmer):
388
388
 
389
389
 
390
390
  class CustomDpColorTempDimmer(CustomDpDimmer):
391
- """Class for HomeMatic dimmer with color temperature."""
391
+ """Class for Homematic dimmer with color temperature."""
392
392
 
393
393
  __slots__ = ("_dp_color_level",)
394
394
 
@@ -839,7 +839,7 @@ def make_rf_dimmer(
839
839
  channel: hmd.Channel,
840
840
  custom_config: CustomConfig,
841
841
  ) -> None:
842
- """Create HomeMatic classic dimmer data point."""
842
+ """Create Homematic classic dimmer data point."""
843
843
  hmed.make_custom_data_point(
844
844
  channel=channel,
845
845
  data_point_class=CustomDpDimmer,
@@ -852,7 +852,7 @@ def make_rf_dimmer_color(
852
852
  channel: hmd.Channel,
853
853
  custom_config: CustomConfig,
854
854
  ) -> None:
855
- """Create HomeMatic classic dimmer with color data point."""
855
+ """Create Homematic classic dimmer with color data point."""
856
856
  hmed.make_custom_data_point(
857
857
  channel=channel,
858
858
  data_point_class=CustomDpColorDimmer,
@@ -865,7 +865,7 @@ def make_rf_dimmer_color_fixed(
865
865
  channel: hmd.Channel,
866
866
  custom_config: CustomConfig,
867
867
  ) -> None:
868
- """Create HomeMatic classic dimmer with fixed color data point."""
868
+ """Create Homematic classic dimmer with fixed color data point."""
869
869
  hmed.make_custom_data_point(
870
870
  channel=channel,
871
871
  data_point_class=CustomDpColorDimmer,
@@ -878,7 +878,7 @@ def make_rf_dimmer_color_effect(
878
878
  channel: hmd.Channel,
879
879
  custom_config: CustomConfig,
880
880
  ) -> None:
881
- """Create HomeMatic classic dimmer and effect with color data point."""
881
+ """Create Homematic classic dimmer and effect with color data point."""
882
882
  hmed.make_custom_data_point(
883
883
  channel=channel,
884
884
  data_point_class=CustomDpColorDimmerEffect,
@@ -891,7 +891,7 @@ def make_rf_dimmer_color_temp(
891
891
  channel: hmd.Channel,
892
892
  custom_config: CustomConfig,
893
893
  ) -> None:
894
- """Create HomeMatic classic dimmer with color temperature data point."""
894
+ """Create Homematic classic dimmer with color temperature data point."""
895
895
  hmed.make_custom_data_point(
896
896
  channel=channel,
897
897
  data_point_class=CustomDpColorTempDimmer,
@@ -904,7 +904,7 @@ def make_rf_dimmer_with_virt_channel(
904
904
  channel: hmd.Channel,
905
905
  custom_config: CustomConfig,
906
906
  ) -> None:
907
- """Create HomeMatic classic dimmer data point."""
907
+ """Create Homematic classic dimmer data point."""
908
908
  hmed.make_custom_data_point(
909
909
  channel=channel,
910
910
  data_point_class=CustomDpDimmer,
@@ -203,7 +203,7 @@ class CustomDpButtonLock(BaseCustomDpLock):
203
203
 
204
204
 
205
205
  class CustomDpRfLock(BaseCustomDpLock):
206
- """Class for classic HomeMatic lock data point."""
206
+ """Class for classic Homematic lock data point."""
207
207
 
208
208
  __slots__ = (
209
209
  "_dp_direction",
@@ -299,7 +299,7 @@ def make_rf_button_lock(
299
299
  channel: hmd.Channel,
300
300
  custom_config: CustomConfig,
301
301
  ) -> None:
302
- """Create HomematicIP rf button lock data point."""
302
+ """Create Homematic button lock data point."""
303
303
  hmed.make_custom_data_point(
304
304
  channel=channel,
305
305
  data_point_class=CustomDpButtonLock,
@@ -312,7 +312,7 @@ def make_rf_lock(
312
312
  channel: hmd.Channel,
313
313
  custom_config: CustomConfig,
314
314
  ) -> None:
315
- """Create HomeMatic rf lock data point."""
315
+ """Create Homematic lock data point."""
316
316
  hmed.make_custom_data_point(
317
317
  channel=channel,
318
318
  data_point_class=CustomDpRfLock,
@@ -39,7 +39,7 @@ class SirenOnArgs(TypedDict, total=False):
39
39
 
40
40
 
41
41
  class BaseCustomDpSiren(CustomDataPoint):
42
- """Class for HomeMatic siren data point."""
42
+ """Class for Homematic siren data point."""
43
43
 
44
44
  __slots__ = ()
45
45
 
@@ -30,7 +30,7 @@ class _StateChangeArg(StrEnum):
30
30
 
31
31
 
32
32
  class CustomDpSwitch(CustomDataPoint):
33
- """Class for HomeMatic switch data point."""
33
+ """Class for Homematic switch data point."""
34
34
 
35
35
  __slots__ = (
36
36
  "_dp_group_state",
@@ -30,7 +30,7 @@ class _StateChangeArg(StrEnum):
30
30
 
31
31
 
32
32
  class CustomDpIpIrrigationValve(CustomDataPoint):
33
- """Class for HomeMatic irrigation valve data point."""
33
+ """Class for Homematic irrigation valve data point."""
34
34
 
35
35
  __slots__ = (
36
36
  "_dp_group_state",
@@ -4,7 +4,7 @@
4
4
  Core data point model for AioHomematic.
5
5
 
6
6
  This module defines the abstract base classes and concrete building blocks for
7
- representing HomeMatic parameters as data points, handling their lifecycle,
7
+ representing Homematic parameters as data points, handling their lifecycle,
8
8
  I/O, and event propagation.
9
9
 
10
10
  Highlights:
@@ -641,7 +641,7 @@ class BaseParameterDataPoint[
641
641
 
642
642
  @property
643
643
  def hmtype(self) -> ParameterType:
644
- """Return the HomeMatic type."""
644
+ """Return the Homematic type."""
645
645
  return self._type
646
646
 
647
647
  @property
@@ -3,7 +3,7 @@
3
3
  """
4
4
  Device and channel model for AioHomematic.
5
5
 
6
- This module implements the runtime representation of a HomeMatic device and its
6
+ This module implements the runtime representation of a Homematic device and its
7
7
  channels, including creation and lookup of data points/events, firmware and
8
8
  availability handling, link management, value caching, and exporting of device
9
9
  definitions for diagnostics.
@@ -104,13 +104,14 @@ class Device(LogContextMixin, PayloadMixin):
104
104
  "_address",
105
105
  "_cached_relevant_for_central_link_management",
106
106
  "_central",
107
- "_channel_groups",
107
+ "_channel_group",
108
108
  "_channels",
109
109
  "_client",
110
110
  "_description",
111
111
  "_device_updated_callbacks",
112
112
  "_firmware_update_callbacks",
113
113
  "_forced_availability",
114
+ "_group_channels",
114
115
  "_has_custom_data_point_definition",
115
116
  "_id",
116
117
  "_ignore_for_custom_data_point",
@@ -136,7 +137,8 @@ class Device(LogContextMixin, PayloadMixin):
136
137
  self._central: Final = central
137
138
  self._interface_id: Final = interface_id
138
139
  self._address: Final = device_address
139
- self._channel_groups: Final[dict[int | None, int]] = {}
140
+ self._channel_group: Final[dict[int | None, int]] = {}
141
+ self._group_channels: Final[dict[int, set[int | None]]] = {}
140
142
  self._id: Final = self._central.device_details.get_address_id(address=device_address)
141
143
  self._interface: Final = central.device_details.get_interface(address=device_address)
142
144
  self._client: Final = central.get_client(interface_id=interface_id)
@@ -305,7 +307,7 @@ class Device(LogContextMixin, PayloadMixin):
305
307
  @property
306
308
  def has_sub_devices(self) -> bool:
307
309
  """Return if device has multiple sub device channels."""
308
- return len(set(self._channel_groups.values())) > 1
310
+ return any(len(gcs) > 1 for gcs in self._group_channels.values())
309
311
 
310
312
  @property
311
313
  def id(self) -> str:
@@ -418,14 +420,16 @@ class Device(LogContextMixin, PayloadMixin):
418
420
  """Return th CONFIG_PENDING data_point."""
419
421
  return self.get_generic_data_point(channel_address=f"{self._address}:0", parameter=Parameter.CONFIG_PENDING)
420
422
 
421
- def add_channel_to_group(self, channel_no: int | None, group_no: int) -> None:
422
- """Add channel no group."""
423
- if group_no not in self._channel_groups:
424
- self._channel_groups[group_no] = group_no
425
- if channel_no not in self._channel_groups:
426
- self._channel_groups[channel_no] = group_no
427
- elif self._channel_groups[channel_no] != group_no:
428
- return
423
+ def add_channel_to_group(self, group_no: int, channel_no: int | None) -> None:
424
+ """Add channel to group."""
425
+ if group_no not in self._group_channels:
426
+ self._group_channels[group_no] = set()
427
+ self._group_channels[group_no].add(channel_no)
428
+
429
+ if group_no not in self._channel_group:
430
+ self._channel_group[group_no] = group_no
431
+ if channel_no not in self._channel_group:
432
+ self._channel_group[channel_no] = group_no
429
433
 
430
434
  @inspector
431
435
  async def create_central_links(self) -> None:
@@ -451,14 +455,14 @@ class Device(LogContextMixin, PayloadMixin):
451
455
 
452
456
  def get_channel_group_no(self, channel_no: int | None) -> int | None:
453
457
  """Return the group no of the channel."""
454
- return self._channel_groups.get(channel_no)
458
+ return self._channel_group.get(channel_no)
455
459
 
456
460
  def is_in_multi_channel_group(self, channel_no: int | None) -> bool:
457
461
  """Return if multiple channels are in the group."""
458
462
  if channel_no is None:
459
463
  return False
460
464
 
461
- return len([s for s, m in self._channel_groups.items() if m == self._channel_groups.get(channel_no)]) > 1
465
+ return len([s for s, m in self._channel_group.items() if m == self._channel_group.get(channel_no)]) > 1
462
466
 
463
467
  def get_channel(self, channel_address: str) -> Channel | None:
464
468
  """Get channel of device."""
@@ -615,7 +619,7 @@ class Device(LogContextMixin, PayloadMixin):
615
619
 
616
620
  @inspector
617
621
  async def update_firmware(self, refresh_after_update_intervals: tuple[int, ...]) -> bool:
618
- """Update the firmware of the homematic device."""
622
+ """Update the firmware of the Homematic device."""
619
623
  update_result = await self._client.update_device_firmware(device_address=self._address)
620
624
 
621
625
  async def refresh_data() -> None:
@@ -3,7 +3,7 @@
3
3
  """
4
4
  Event model for AioHomematic.
5
5
 
6
- This module defines the event data point hierarchy used to expose HomeMatic
6
+ This module defines the event data point hierarchy used to expose Homematic
7
7
  button presses, device errors, and impulse notifications to applications.
8
8
 
9
9
  Included classes:
@@ -133,7 +133,7 @@ class ProgramDpType(NamedTuple):
133
133
 
134
134
 
135
135
  class Hub:
136
- """The HomeMatic hub."""
136
+ """The Homematic hub."""
137
137
 
138
138
  __slots__ = (
139
139
  "_sema_fetch_sysvars",
@@ -143,7 +143,7 @@ class Hub:
143
143
  )
144
144
 
145
145
  def __init__(self, central: hmcu.CentralUnit) -> None:
146
- """Initialize HomeMatic hub."""
146
+ """Initialize Homematic hub."""
147
147
  self._sema_fetch_sysvars: Final = asyncio.Semaphore()
148
148
  self._sema_fetch_programs: Final = asyncio.Semaphore()
149
149
  self._central: Final = central
@@ -11,7 +11,7 @@ from aiohomematic.property_decorators import state_property
11
11
 
12
12
 
13
13
  class ProgramDpButton(GenericProgramDataPoint):
14
- """Class for a HomeMatic program button."""
14
+ """Class for a Homematic program button."""
15
15
 
16
16
  __slots__ = ()
17
17
 
@@ -34,7 +34,7 @@ from aiohomematic.support import PayloadMixin, parse_sys_var
34
34
 
35
35
 
36
36
  class GenericHubDataPoint(CallbackDataPoint, PayloadMixin):
37
- """Class for a HomeMatic system variable."""
37
+ """Class for a Homematic system variable."""
38
38
 
39
39
  __slots__ = (
40
40
  "_channel",
@@ -114,7 +114,7 @@ class GenericHubDataPoint(CallbackDataPoint, PayloadMixin):
114
114
 
115
115
 
116
116
  class GenericSysvarDataPoint(GenericHubDataPoint):
117
- """Class for a HomeMatic system variable."""
117
+ """Class for a Homematic system variable."""
118
118
 
119
119
  __slots__ = (
120
120
  "_current_value",
@@ -269,7 +269,7 @@ class GenericSysvarDataPoint(GenericHubDataPoint):
269
269
 
270
270
 
271
271
  class GenericProgramDataPoint(GenericHubDataPoint):
272
- """Class for a generic HomeMatic progran data point."""
272
+ """Class for a generic Homematic progran data point."""
273
273
 
274
274
  __slots__ = (
275
275
  "_pid",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.9.5
3
+ Version: 2025.9.6
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>
@@ -26,9 +26,13 @@ Requires-Dist: python-slugify>=8.0.0
26
26
  Requires-Dist: voluptuous>=0.14.0
27
27
  Dynamic: license-file
28
28
 
29
+ [![releasebadge]][release]
30
+ [![License][license-shield]](LICENSE.md)
31
+ [![GitHub Sponsors][sponsorsbadge]][sponsors]
32
+
29
33
  # AIO Homematic (hahomematic)
30
34
 
31
- A lightweight Python 3 library that powers Home Assistant integrations for controlling and monitoring [HomeMatic](https://www.eq-3.com/products/homematic.html) and [HomematicIP](https://www.homematic-ip.com/en/start.html) devices. Some third‑party devices/gateways (e.g., Bosch, Intertechno) may be supported as well.
35
+ A lightweight Python 3 library that powers Home Assistant integrations for controlling and monitoring [Homematic](https://www.eq-3.com/products/homematic.html) and [HomematicIP](https://www.homematic-ip.com/en/start.html) devices. Some third‑party devices/gateways (e.g., Bosch, Intertechno) may be supported as well.
32
36
 
33
37
  This project is the modern successor to [pyhomematic](https://github.com/danielperna84/pyhomematic), focusing on automatic entity creation, fewer manual device definitions, and faster startups.
34
38
 
@@ -53,7 +57,7 @@ Use the Home Assistant custom integration "Homematic(IP) Local", which is powere
53
57
 
54
58
  1. Prerequisites
55
59
  - Use latest version of Home Assistant.
56
- - A CCU3, OpenCCU/RaspberryMatic, or Homegear instance reachable from Home Assistant.
60
+ - A CCU3, OpenCCU, or Homegear instance reachable from Home Assistant.
57
61
  - For HomematicIP devices, ensure CCU firmware meets the minimum versions listed below.
58
62
  2. Install the integration
59
63
  - Add the custom repository and install: https://github.com/sukramj/homematicip_local
@@ -125,3 +129,9 @@ Example:
125
129
  - Home Assistant lifecycle (discovery, updates, teardown): [see](docs/homeassistant_lifecycle.md) for details on how the integration works and how to debug issues.
126
130
  - RSSI fix: [see](docs/rssi_fix.md) for how RSSI values are fixed for Home Assistant.
127
131
  - Sequence diagrams: [see](docs/sequence_diagrams.md) for a sequence diagram of how the library works.
132
+
133
+ [license-shield]: https://img.shields.io/github/license/SukramJ/aiohomematic.svg?style=for-the-badge
134
+ [release]: https://github.com/SukramJ/aiohomematic/releases
135
+ [releasebadge]: https://img.shields.io/github/v/release/SukramJ/aiohomematic?style=for-the-badge
136
+ [sponsorsbadge]: https://img.shields.io/github/sponsors/SukramJ?style=for-the-badge&label=GitHub%20Sponsors&color=green
137
+ [sponsors]: https://github.com/sponsors/SukramJ
File without changes