aiohomematic 2025.9.4__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.4 → aiohomematic-2025.9.6}/PKG-INFO +14 -4
  2. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/README.md +13 -3
  3. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/__init__.py +1 -1
  4. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/caches/dynamic.py +1 -1
  5. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/caches/persistent.py +1 -1
  6. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/caches/visibility.py +1 -1
  7. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/central/__init__.py +5 -5
  8. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/client/__init__.py +4 -4
  9. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/client/json_rpc.py +3 -3
  10. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/client/xml_rpc.py +5 -14
  11. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/const.py +13 -13
  12. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/hmcli.py +5 -5
  13. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/data_point.py +1 -1
  14. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/climate.py +4 -4
  15. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/cover.py +6 -6
  16. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/definition.py +1 -1
  17. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/light.py +10 -10
  18. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/lock.py +3 -3
  19. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/siren.py +1 -1
  20. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/switch.py +1 -1
  21. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/valve.py +1 -1
  22. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/data_point.py +2 -2
  23. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/device.py +19 -15
  24. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/event.py +1 -1
  25. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/__init__.py +2 -2
  26. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/button.py +1 -1
  27. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/data_point.py +3 -3
  28. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic.egg-info/PKG-INFO +14 -4
  29. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/LICENSE +0 -0
  30. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/async_support.py +0 -0
  31. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/caches/__init__.py +0 -0
  32. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/central/decorators.py +0 -0
  33. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/central/xml_rpc_server.py +0 -0
  34. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/client/_rpc_errors.py +0 -0
  35. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/context.py +0 -0
  36. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/converter.py +0 -0
  37. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/decorators.py +0 -0
  38. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/exceptions.py +0 -0
  39. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/__init__.py +0 -0
  40. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/__init__.py +0 -0
  41. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/climate.py +0 -0
  42. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/operating_voltage_level.py +0 -0
  43. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/calculated/support.py +0 -0
  44. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/__init__.py +0 -0
  45. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/const.py +0 -0
  46. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/data_point.py +0 -0
  47. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/custom/support.py +0 -0
  48. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/__init__.py +0 -0
  49. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/action.py +0 -0
  50. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/binary_sensor.py +0 -0
  51. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/button.py +0 -0
  52. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/data_point.py +0 -0
  53. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/number.py +0 -0
  54. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/select.py +0 -0
  55. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/sensor.py +0 -0
  56. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/switch.py +0 -0
  57. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/generic/text.py +0 -0
  58. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/binary_sensor.py +0 -0
  59. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/number.py +0 -0
  60. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/select.py +0 -0
  61. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/sensor.py +0 -0
  62. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/switch.py +0 -0
  63. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/hub/text.py +0 -0
  64. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/support.py +0 -0
  65. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/model/update.py +0 -0
  66. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/property_decorators.py +0 -0
  67. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/py.typed +0 -0
  68. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/fetch_all_device_data.fn +0 -0
  69. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/get_program_descriptions.fn +0 -0
  70. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/get_serial.fn +0 -0
  71. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/get_system_variable_descriptions.fn +0 -0
  72. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/set_program_state.fn +0 -0
  73. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/rega_scripts/set_system_variable.fn +0 -0
  74. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/support.py +0 -0
  75. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic/validator.py +0 -0
  76. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic.egg-info/SOURCES.txt +0 -0
  77. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic.egg-info/dependency_links.txt +0 -0
  78. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic.egg-info/requires.txt +0 -0
  79. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic.egg-info/top_level.txt +0 -0
  80. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic_support/__init__.py +0 -0
  81. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/aiohomematic_support/client_local.py +0 -0
  82. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/pyproject.toml +0 -0
  83. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/setup.cfg +0 -0
  84. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_action.py +0 -0
  85. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_binary_sensor.py +0 -0
  86. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_button.py +0 -0
  87. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_calculated_support.py +0 -0
  88. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_central.py +0 -0
  89. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_central_pydevccu.py +0 -0
  90. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_climate.py +0 -0
  91. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_cover.py +0 -0
  92. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_decorator.py +0 -0
  93. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_device.py +0 -0
  94. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_entity.py +0 -0
  95. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_event.py +0 -0
  96. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_json_rpc.py +0 -0
  97. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_light.py +0 -0
  98. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_lock.py +0 -0
  99. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_number.py +0 -0
  100. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_select.py +0 -0
  101. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_sensor.py +0 -0
  102. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_siren.py +0 -0
  103. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_support.py +0 -0
  104. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_switch.py +0 -0
  105. {aiohomematic-2025.9.4 → aiohomematic-2025.9.6}/tests/test_text.py +0 -0
  106. {aiohomematic-2025.9.4 → 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.4
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
@@ -64,7 +68,7 @@ Use the Home Assistant custom integration "Homematic(IP) Local", which is powere
64
68
  - Always enter credentials.
65
69
  - Choose which interfaces to enable (HM, HmIP, Virtual). Default ports are typically 2001 (HM), 2010 (HmIP), 9292 (Virtual).
66
70
  4. Network callbacks
67
- - The integration needs to receive XML‑RPC callbacks from the CCU. Make sure Home Assistant is reachable from the CCU (no NAT/firewall blocking). Callbacks ar only required for special network setups.
71
+ - The integration needs to receive XML‑RPC callbacks from the CCU. Make sure Home Assistant is reachable from the CCU (no NAT/firewall blocking). Callbacks are only required for special network setups.
68
72
  5. Verify
69
73
  - After setup, devices should appear under Devices & Services → Homematic(IP) Local. Discovery may take a few seconds after the first connection while paramsets are fetched and cached for faster restarts.
70
74
 
@@ -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
@@ -36,7 +40,7 @@ Use the Home Assistant custom integration "Homematic(IP) Local", which is powere
36
40
  - Always enter credentials.
37
41
  - Choose which interfaces to enable (HM, HmIP, Virtual). Default ports are typically 2001 (HM), 2010 (HmIP), 9292 (Virtual).
38
42
  4. Network callbacks
39
- - The integration needs to receive XML‑RPC callbacks from the CCU. Make sure Home Assistant is reachable from the CCU (no NAT/firewall blocking). Callbacks ar only required for special network setups.
43
+ - The integration needs to receive XML‑RPC callbacks from the CCU. Make sure Home Assistant is reachable from the CCU (no NAT/firewall blocking). Callbacks are only required for special network setups.
40
44
  5. Verify
41
45
  - After setup, devices should appear under Devices & Services → Homematic(IP) Local. Discovery may take a few seconds after the first connection while paramsets are fetched and cached for faster restarts.
42
46
 
@@ -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"
@@ -42,8 +42,7 @@ from aiohomematic.exceptions import (
42
42
  NoConnectionException,
43
43
  UnsupportedException,
44
44
  )
45
- from aiohomematic.property_decorators import hm_property
46
- from aiohomematic.support import LogContextMixin, extract_exc_args, get_tls_context, log_boundary_error
45
+ from aiohomematic.support import extract_exc_args, get_tls_context, log_boundary_error
47
46
 
48
47
  _LOGGER: Final = logging.getLogger(__name__)
49
48
 
@@ -53,7 +52,7 @@ _VERIFY_TLS: Final = "verify_tls"
53
52
 
54
53
 
55
54
  class _XmlRpcMethod(StrEnum):
56
- """Enum for homematic json rpc methods types."""
55
+ """Enum for Homematic json rpc methods types."""
57
56
 
58
57
  GET_VERSION = "getVersion"
59
58
  HOMEGEAR_INIT = "clientServerInitialized"
@@ -84,7 +83,7 @@ _OS_ERROR_CODES: Final[dict[int, str]] = {
84
83
 
85
84
 
86
85
  # noinspection PyProtectedMember,PyUnresolvedReferences
87
- class XmlRpcProxy(xmlrpc.client.ServerProxy, LogContextMixin):
86
+ class XmlRpcProxy(xmlrpc.client.ServerProxy):
88
87
  """ServerProxy implementation with ThreadPoolExecutor when request is executing."""
89
88
 
90
89
  def __init__(
@@ -107,6 +106,8 @@ class XmlRpcProxy(xmlrpc.client.ServerProxy, LogContextMixin):
107
106
  self._supported_methods: tuple[str, ...] = ()
108
107
  if self._tls:
109
108
  kwargs[_CONTEXT] = get_tls_context(self._verify_tls)
109
+ # Due to magic method the log_context must be defined manually.
110
+ self.log_context: Final[Mapping[str, Any]] = {"interface_id": self._interface_id, "tls": self._tls}
110
111
  xmlrpc.client.ServerProxy.__init__( # type: ignore[misc]
111
112
  self,
112
113
  encoding=ISO_8859_1,
@@ -121,21 +122,11 @@ class XmlRpcProxy(xmlrpc.client.ServerProxy, LogContextMixin):
121
122
  supported_methods.append(_XmlRpcMethod.PING)
122
123
  self._supported_methods = tuple(supported_methods)
123
124
 
124
- @hm_property(log_context=True)
125
- def interface_id(self) -> str:
126
- """Return the interface_id."""
127
- return self._interface_id
128
-
129
125
  @property
130
126
  def supported_methods(self) -> tuple[str, ...]:
131
127
  """Return the supported methods."""
132
128
  return self._supported_methods
133
129
 
134
- @hm_property(log_context=True)
135
- def tls(self) -> bool:
136
- """Return tls."""
137
- return self._tls
138
-
139
130
  async def __async_request(self, *args, **kwargs): # type: ignore[no-untyped-def]
140
131
  """Call method on server side."""
141
132
  parent = xmlrpc.client.ServerProxy
@@ -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.4"
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,
@@ -714,7 +714,7 @@ def get_default_data_points() -> Mapping[int | tuple[int, ...], tuple[Parameter,
714
714
  def get_include_default_data_points(device_profile: DeviceProfile) -> bool:
715
715
  """Return if default data points should be included."""
716
716
  device = _get_device_definition(device_profile)
717
- return device.get(CDPD.INCLUDE_DEFAULT_DPS, DEFAULT_INCLUDE_DEFAULT_DPS)
717
+ return bool(device.get(CDPD.INCLUDE_DEFAULT_DPS, DEFAULT_INCLUDE_DEFAULT_DPS))
718
718
 
719
719
 
720
720
  def _get_device_definition(device_profile: DeviceProfile) -> Mapping[CDPD, Any]:
@@ -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,