aiohomematic 2025.9.4__py3-none-any.whl → 2025.9.6__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.
- aiohomematic/__init__.py +1 -1
- aiohomematic/caches/dynamic.py +1 -1
- aiohomematic/caches/persistent.py +1 -1
- aiohomematic/caches/visibility.py +1 -1
- aiohomematic/central/__init__.py +5 -5
- aiohomematic/client/__init__.py +4 -4
- aiohomematic/client/json_rpc.py +3 -3
- aiohomematic/client/xml_rpc.py +5 -14
- aiohomematic/const.py +13 -13
- aiohomematic/hmcli.py +5 -5
- aiohomematic/model/calculated/data_point.py +1 -1
- aiohomematic/model/custom/climate.py +4 -4
- aiohomematic/model/custom/cover.py +6 -6
- aiohomematic/model/custom/definition.py +1 -1
- aiohomematic/model/custom/light.py +10 -10
- aiohomematic/model/custom/lock.py +3 -3
- aiohomematic/model/custom/siren.py +1 -1
- aiohomematic/model/custom/switch.py +1 -1
- aiohomematic/model/custom/valve.py +1 -1
- aiohomematic/model/data_point.py +2 -2
- aiohomematic/model/device.py +19 -15
- aiohomematic/model/event.py +1 -1
- aiohomematic/model/hub/__init__.py +2 -2
- aiohomematic/model/hub/button.py +1 -1
- aiohomematic/model/hub/data_point.py +3 -3
- {aiohomematic-2025.9.4.dist-info → aiohomematic-2025.9.6.dist-info}/METADATA +14 -4
- {aiohomematic-2025.9.4.dist-info → aiohomematic-2025.9.6.dist-info}/RECORD +30 -30
- {aiohomematic-2025.9.4.dist-info → aiohomematic-2025.9.6.dist-info}/WHEEL +0 -0
- {aiohomematic-2025.9.4.dist-info → aiohomematic-2025.9.6.dist-info}/licenses/LICENSE +0 -0
- {aiohomematic-2025.9.4.dist-info → aiohomematic-2025.9.6.dist-info}/top_level.txt +0 -0
aiohomematic/__init__.py
CHANGED
|
@@ -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
|
|
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
|
|
aiohomematic/caches/dynamic.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
aiohomematic/central/__init__.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
aiohomematic/client/__init__.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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:
|
aiohomematic/client/json_rpc.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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"
|
aiohomematic/client/xml_rpc.py
CHANGED
|
@@ -42,8 +42,7 @@ from aiohomematic.exceptions import (
|
|
|
42
42
|
NoConnectionException,
|
|
43
43
|
UnsupportedException,
|
|
44
44
|
)
|
|
45
|
-
from aiohomematic.
|
|
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
|
|
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
|
|
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
|
aiohomematic/const.py
CHANGED
|
@@ -19,7 +19,7 @@ import sys
|
|
|
19
19
|
from types import MappingProxyType
|
|
20
20
|
from typing import Any, Final, NamedTuple, Required, TypeAlias, TypedDict
|
|
21
21
|
|
|
22
|
-
VERSION: Final = "2025.9.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
550
|
+
"""Enum for Homematic parameter types."""
|
|
551
551
|
|
|
552
552
|
ACTION = "ACTION" # Usually buttons, send Boolean to trigger
|
|
553
553
|
BOOL = "BOOL"
|
aiohomematic/hmcli.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
693
|
+
"""Simple classic Homematic thermostat HM-CC-TC."""
|
|
694
694
|
|
|
695
695
|
__slots__ = ()
|
|
696
696
|
|
|
697
697
|
|
|
698
698
|
class CustomDpRfThermostat(BaseCustomDpClimate):
|
|
699
|
-
"""Classic
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
315
|
+
"""Create Homematic lock data point."""
|
|
316
316
|
hmed.make_custom_data_point(
|
|
317
317
|
channel=channel,
|
|
318
318
|
data_point_class=CustomDpRfLock,
|
aiohomematic/model/data_point.py
CHANGED
|
@@ -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
|
|
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
|
|
644
|
+
"""Return the Homematic type."""
|
|
645
645
|
return self._type
|
|
646
646
|
|
|
647
647
|
@property
|
aiohomematic/model/device.py
CHANGED
|
@@ -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
|
|
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
|
-
"
|
|
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.
|
|
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(
|
|
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
|
|
422
|
-
"""Add channel
|
|
423
|
-
if group_no not in self.
|
|
424
|
-
self.
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
aiohomematic/model/event.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
aiohomematic/model/hub/button.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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.
|
|
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 [
|
|
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
|
|
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
|
|
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,49 +1,49 @@
|
|
|
1
|
-
aiohomematic/__init__.py,sha256=
|
|
1
|
+
aiohomematic/__init__.py,sha256=ngULK_anZQwwUUCVcberBdVjguYfboiuG9VoueKy9fA,2283
|
|
2
2
|
aiohomematic/async_support.py,sha256=Xc55KkIV0h8rf936QKyU4OHSZsPEZ8TwuV8gVveeRh8,6106
|
|
3
|
-
aiohomematic/const.py,sha256=
|
|
3
|
+
aiohomematic/const.py,sha256=i2nEfaKtXDf-jfi5MU_teMG8XkQJIbPbopg_tWnW05E,25411
|
|
4
4
|
aiohomematic/context.py,sha256=M7gkA7KFT0dp35gzGz2dzKVXu1PP0sAnepgLlmjyRS4,451
|
|
5
5
|
aiohomematic/converter.py,sha256=QTOL8_B6SoCoqLuRSkjtOlfa7BVFSvOfnSBrDngiinA,3558
|
|
6
6
|
aiohomematic/decorators.py,sha256=oHEFSJoJVd-h9RYb6NLTJ60erkpRHPYv7EEipKn1a9Q,10636
|
|
7
7
|
aiohomematic/exceptions.py,sha256=o_H3Z0A2TQ0irNxUM9u8bmivq0L_mwPCB7nhxEawDxE,5018
|
|
8
|
-
aiohomematic/hmcli.py,sha256=
|
|
8
|
+
aiohomematic/hmcli.py,sha256=qNstNDX6q8t3mJFCGlXlmRVobGabntrPtFi3kchf1Eg,4933
|
|
9
9
|
aiohomematic/property_decorators.py,sha256=TN07L9uAos2hB7aqaSIRPziYowWWJXSDFnZqxg0WFhs,16201
|
|
10
10
|
aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
aiohomematic/support.py,sha256=EKTkzx4Dd-NT5OdN-Cfg75pECYWQ9l-Me5t_2Bl5PPM,20315
|
|
12
12
|
aiohomematic/validator.py,sha256=vChkYQ9dGKCQEigiBMnoeyPkCJDJlIm6DSgR1gmeHH0,3545
|
|
13
13
|
aiohomematic/caches/__init__.py,sha256=_gI30tbsWgPRaHvP6cRxOQr6n9bYZzU-jp1WbHhWg-A,470
|
|
14
|
-
aiohomematic/caches/dynamic.py,sha256=
|
|
15
|
-
aiohomematic/caches/persistent.py,sha256=
|
|
16
|
-
aiohomematic/caches/visibility.py,sha256=
|
|
17
|
-
aiohomematic/central/__init__.py,sha256=
|
|
14
|
+
aiohomematic/caches/dynamic.py,sha256=ANZUbkueQBeKC8Jwd44LH6qdt6qBCPWgzB5J0aHGUJw,21334
|
|
15
|
+
aiohomematic/caches/persistent.py,sha256=od1hqoXopGw53gSVvd3rmT_40KuutSY43MUPKj1HAvU,19932
|
|
16
|
+
aiohomematic/caches/visibility.py,sha256=xCks7f-bTZjwlxvwBU31wh23U0GOnz76Hy1kVqweW7g,31481
|
|
17
|
+
aiohomematic/central/__init__.py,sha256=3UdYf-nvnRgdeQH92v8vGwIk_J_DXT8JPDG14PskXKw,86167
|
|
18
18
|
aiohomematic/central/decorators.py,sha256=Sl-cMDhreiAOKkIHiei-QbIOcvbWGVX-QwB5bLeohak,6904
|
|
19
19
|
aiohomematic/central/xml_rpc_server.py,sha256=pOqOuTp1Yy5Wlqs5E-L9f_UNW8j9HSE5XMAPCdXJchI,10407
|
|
20
|
-
aiohomematic/client/__init__.py,sha256=
|
|
20
|
+
aiohomematic/client/__init__.py,sha256=YuVD_FNh2Q_9SiDtGTM0T--ycT3hzCgkZM_W9AOOuTg,70106
|
|
21
21
|
aiohomematic/client/_rpc_errors.py,sha256=ZPFZJ4t0tE4RVAae4L7hE9earutMwB5BFfB2NArLp9E,2975
|
|
22
|
-
aiohomematic/client/json_rpc.py,sha256=
|
|
23
|
-
aiohomematic/client/xml_rpc.py,sha256
|
|
22
|
+
aiohomematic/client/json_rpc.py,sha256=s9EOWlVed-xerRFXOQToPGAW-0p_BuOuwjvL4TZD2Ok,49393
|
|
23
|
+
aiohomematic/client/xml_rpc.py,sha256=-JQpIt3_6ehpn6uhDqPWW7e2X8-D9EVS3X6-CJpxN4E,9475
|
|
24
24
|
aiohomematic/model/__init__.py,sha256=cqL5v5HNxlzrgLziAPf8sGU72fDneiaLTioIGcLfhTU,5442
|
|
25
|
-
aiohomematic/model/data_point.py,sha256=
|
|
26
|
-
aiohomematic/model/device.py,sha256=
|
|
27
|
-
aiohomematic/model/event.py,sha256=
|
|
25
|
+
aiohomematic/model/data_point.py,sha256=8k60CalDaixvpxfhPpNkHgQyEHuIqRRqamFeMcYB2TE,40894
|
|
26
|
+
aiohomematic/model/device.py,sha256=GT3eUoEiSRd9GpREOfxHN3XCffs9pPE-U7o8p639IkU,52340
|
|
27
|
+
aiohomematic/model/event.py,sha256=omesSQ18e1tCIjjTIYTmeqwtItzjTYR3fy90-oZi4ic,6837
|
|
28
28
|
aiohomematic/model/support.py,sha256=4VQsOlkJuPhq0hLHKt5LB43YgbITjnyJMwucUYGghzM,19616
|
|
29
29
|
aiohomematic/model/update.py,sha256=QVYFhaEqtHZhZ8yGPXEx2hPMne8WAc_SkVaQ0J20oQw,5138
|
|
30
30
|
aiohomematic/model/calculated/__init__.py,sha256=pk56FYa0MNyN0MTsejSy6RdQjOUCKAqzwWSzN6_ENmk,2808
|
|
31
31
|
aiohomematic/model/calculated/climate.py,sha256=0BhrsiVS74_6jo24I8Cg9WzVAD5od3IqgiwTM0ao2n0,8518
|
|
32
|
-
aiohomematic/model/calculated/data_point.py,sha256=
|
|
32
|
+
aiohomematic/model/calculated/data_point.py,sha256=4b0uGuI_HYb4MkykrtSHpw7XVzrj_vVMNd-8RQcQSkg,11530
|
|
33
33
|
aiohomematic/model/calculated/operating_voltage_level.py,sha256=urlCkHjisCJ-DO6tUE0evfp45tPwsYcb81_2uoHYxS0,13521
|
|
34
34
|
aiohomematic/model/calculated/support.py,sha256=K-oUSSH6k6_J7zZ9cwxt6qIfArWd-SBWo93LuZUs1_s,6674
|
|
35
35
|
aiohomematic/model/custom/__init__.py,sha256=1sWRrAjHnHSakdrrlNW4_SZ2rg5g2WjGdI4X2PUg_h0,6064
|
|
36
|
-
aiohomematic/model/custom/climate.py,sha256=
|
|
36
|
+
aiohomematic/model/custom/climate.py,sha256=V6DD6hZjjS65MaXJcRZUD92Gg93IhIBmp-Yjghlo5Yw,53986
|
|
37
37
|
aiohomematic/model/custom/const.py,sha256=Kh1pnab6nmwbaY43CfXQy3yrWpPwsrQdl1Ea2aZ6aw0,4961
|
|
38
|
-
aiohomematic/model/custom/cover.py,sha256=
|
|
38
|
+
aiohomematic/model/custom/cover.py,sha256=8coWxSyFgsDKoTQIvu0czfiVufobtkHgQdlp4ocAqu8,28555
|
|
39
39
|
aiohomematic/model/custom/data_point.py,sha256=d7B8gfyDDZf8HW3f0ofeHYF32GE8kgnQ0DZYSUbLHxY,14112
|
|
40
|
-
aiohomematic/model/custom/definition.py,sha256=
|
|
41
|
-
aiohomematic/model/custom/light.py,sha256=
|
|
42
|
-
aiohomematic/model/custom/lock.py,sha256=
|
|
43
|
-
aiohomematic/model/custom/siren.py,sha256=
|
|
40
|
+
aiohomematic/model/custom/definition.py,sha256=qDUijmDLuu9Oe837WBdpEPrfVwVZW98H7eVbD2kerW4,35487
|
|
41
|
+
aiohomematic/model/custom/light.py,sha256=P_v0ZWy0mHqluYVIsqMR7Zo1SGHdyGK_3H-GlQnHhs8,44173
|
|
42
|
+
aiohomematic/model/custom/lock.py,sha256=lIlsVLmsDWZIRzeQA5yVOQGk1YvE7qkzbFuEQk1uRG4,11932
|
|
43
|
+
aiohomematic/model/custom/siren.py,sha256=X4oqXTPLg7MfV7NL6AtJ7QMn2MVoO_TptgFRA8n9yXg,9729
|
|
44
44
|
aiohomematic/model/custom/support.py,sha256=UvencsvCwgpm4iqRNRt5KRs560tyw1NhYP5ZaqmCT2k,1453
|
|
45
|
-
aiohomematic/model/custom/switch.py,sha256=
|
|
46
|
-
aiohomematic/model/custom/valve.py,sha256=
|
|
45
|
+
aiohomematic/model/custom/switch.py,sha256=IlJv9pHPWpiax5P0EG5aRxcVWE85_h8MoNTuVxhKkvc,6872
|
|
46
|
+
aiohomematic/model/custom/valve.py,sha256=aXjIlDDhLJjv5SF2W8TKvnuN1ObutRm5H7rhYAypkUc,4229
|
|
47
47
|
aiohomematic/model/generic/__init__.py,sha256=goR2uBBGizm-A5Vvd7ii9Ai3OihBl3hIztmAEI3ceVQ,7611
|
|
48
48
|
aiohomematic/model/generic/action.py,sha256=5SPWVliRqXlPgtb2bI6le0-V6JR5krzw8z_0FaOXu5U,994
|
|
49
49
|
aiohomematic/model/generic/binary_sensor.py,sha256=U5GvfRYbhwe0jRmaedD4LVZ_24SyyPbVr74HEfZXoxE,887
|
|
@@ -54,10 +54,10 @@ aiohomematic/model/generic/select.py,sha256=kxN5BR85Yli7kQF2DYkGiLnTgcY9LBJWI7MM
|
|
|
54
54
|
aiohomematic/model/generic/sensor.py,sha256=dWff7yBJfJSjoD4rcYdmH5HhaRCUEKfPFfOu4T1LrPo,2253
|
|
55
55
|
aiohomematic/model/generic/switch.py,sha256=oaXhECjSPT1WUdItEFTEbOLNCFZlaaqYByEHtL3GpTY,1833
|
|
56
56
|
aiohomematic/model/generic/text.py,sha256=vtNV7YxZuxF6LzNRKRAeOtSQtPQxPaEd560OFaVR13U,854
|
|
57
|
-
aiohomematic/model/hub/__init__.py,sha256=
|
|
57
|
+
aiohomematic/model/hub/__init__.py,sha256=h2HfIkXejJLpXcOTW0VvRbVO70WGYMod6ax3lwrbw1c,13462
|
|
58
58
|
aiohomematic/model/hub/binary_sensor.py,sha256=Z4o-zghHSc83ZHUUCtHqWEGueD9K1Fe0JEt_xJNdx_Y,752
|
|
59
|
-
aiohomematic/model/hub/button.py,sha256=
|
|
60
|
-
aiohomematic/model/hub/data_point.py,sha256
|
|
59
|
+
aiohomematic/model/hub/button.py,sha256=XMnoImnz5vDybxfrP4GWDp2M5gEMG71d8ba1YzVYAnE,890
|
|
60
|
+
aiohomematic/model/hub/data_point.py,sha256=cfcnr9pxE101Syd5i9cmDc4H9svVQ4R6c3QsLCdWvZM,10552
|
|
61
61
|
aiohomematic/model/hub/number.py,sha256=O5KrBU4nfZaxw2Pi2AmWAwQo8V_x79xrdt8ukoPme5Q,1222
|
|
62
62
|
aiohomematic/model/hub/select.py,sha256=My6flvM7Lmt5hF-Szx4a4X1KZZPkQ5lCVPCXTLuqBbQ,1659
|
|
63
63
|
aiohomematic/model/hub/sensor.py,sha256=cIr-7bsbOLBxnH33EHQ6D42vc61abO4QYLWLzkm1T10,1192
|
|
@@ -69,10 +69,10 @@ aiohomematic/rega_scripts/get_serial.fn,sha256=t1oeo-sB_EuVeiY24PLcxFSkdQVgEWGXz
|
|
|
69
69
|
aiohomematic/rega_scripts/get_system_variable_descriptions.fn,sha256=UKXvC0_5lSApdQ2atJc0E5Stj5Zt3lqh0EcliokYu2c,849
|
|
70
70
|
aiohomematic/rega_scripts/set_program_state.fn,sha256=0bnv7lUj8FMjDZBz325tDVP61m04cHjVj4kIOnUUgpY,279
|
|
71
71
|
aiohomematic/rega_scripts/set_system_variable.fn,sha256=sTmr7vkPTPnPkor5cnLKlDvfsYRbGO1iq2z_2pMXq5E,383
|
|
72
|
-
aiohomematic-2025.9.
|
|
72
|
+
aiohomematic-2025.9.6.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
|
|
73
73
|
aiohomematic_support/__init__.py,sha256=_0YtF4lTdC_k6-zrM2IefI0u0LMr_WA61gXAyeGLgbY,66
|
|
74
74
|
aiohomematic_support/client_local.py,sha256=kWzrIeyrvSQx1qVX9_L1bgaFr9aPRDm3E3p82eqkFvo,12538
|
|
75
|
-
aiohomematic-2025.9.
|
|
76
|
-
aiohomematic-2025.9.
|
|
77
|
-
aiohomematic-2025.9.
|
|
78
|
-
aiohomematic-2025.9.
|
|
75
|
+
aiohomematic-2025.9.6.dist-info/METADATA,sha256=m6owNyPSBWFIvkzZ4Ra1f-6x9STJXhy3RJA18N3o0wA,7602
|
|
76
|
+
aiohomematic-2025.9.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
77
|
+
aiohomematic-2025.9.6.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
|
|
78
|
+
aiohomematic-2025.9.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|