aiohomematic 2025.10.6__py3-none-any.whl → 2025.10.8__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/central/__init__.py +1 -1
- aiohomematic/central/rpc_server.py +7 -5
- aiohomematic/client/__init__.py +1 -1
- aiohomematic/const.py +3 -1
- aiohomematic/model/calculated/__init__.py +20 -3
- aiohomematic/model/calculated/climate.py +58 -0
- aiohomematic/model/calculated/support.py +40 -2
- aiohomematic/model/device.py +1 -4
- aiohomematic/support.py +4 -5
- {aiohomematic-2025.10.6.dist-info → aiohomematic-2025.10.8.dist-info}/METADATA +1 -1
- {aiohomematic-2025.10.6.dist-info → aiohomematic-2025.10.8.dist-info}/RECORD +14 -14
- {aiohomematic-2025.10.6.dist-info → aiohomematic-2025.10.8.dist-info}/WHEEL +0 -0
- {aiohomematic-2025.10.6.dist-info → aiohomematic-2025.10.8.dist-info}/licenses/LICENSE +0 -0
- {aiohomematic-2025.10.6.dist-info → aiohomematic-2025.10.8.dist-info}/top_level.txt +0 -0
aiohomematic/central/__init__.py
CHANGED
|
@@ -1068,7 +1068,7 @@ class CentralUnit(LogContextMixin, PayloadMixin):
|
|
|
1068
1068
|
)
|
|
1069
1069
|
return
|
|
1070
1070
|
client = self._clients[interface_id]
|
|
1071
|
-
if (device_descriptions := await client.
|
|
1071
|
+
if (device_descriptions := await client.get_all_device_descriptions(device_address=address)) is None:
|
|
1072
1072
|
_LOGGER.warning(
|
|
1073
1073
|
"ADD_NEW_DEVICES_MANUALLY failed: No device description found for address %s on interface_id %s",
|
|
1074
1074
|
address,
|
|
@@ -12,7 +12,7 @@ from __future__ import annotations
|
|
|
12
12
|
import contextlib
|
|
13
13
|
import logging
|
|
14
14
|
import threading
|
|
15
|
-
from typing import Any, Final
|
|
15
|
+
from typing import Any, Final, cast
|
|
16
16
|
from xmlrpc.server import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer
|
|
17
17
|
|
|
18
18
|
from aiohomematic import central as hmcu
|
|
@@ -175,7 +175,7 @@ class RpcServer(threading.Thread):
|
|
|
175
175
|
"""RPC server thread to handle messages from the backend."""
|
|
176
176
|
|
|
177
177
|
_initialized: bool = False
|
|
178
|
-
_instances: Final[dict[tuple[str, int],
|
|
178
|
+
_instances: Final[dict[tuple[str, int], RpcServer]] = {}
|
|
179
179
|
|
|
180
180
|
def __init__(
|
|
181
181
|
self,
|
|
@@ -190,9 +190,10 @@ class RpcServer(threading.Thread):
|
|
|
190
190
|
self._listen_ip_addr: Final = ip_addr
|
|
191
191
|
self._listen_port: Final[int] = find_free_port() if port == PORT_ANY else port
|
|
192
192
|
self._address: Final[tuple[str, int]] = (ip_addr, self._listen_port)
|
|
193
|
-
threading.Thread.__init__(self, name=f"RpcServer {ip_addr}:{self._listen_port}")
|
|
194
193
|
self._centrals: Final[dict[str, hmcu.CentralUnit]] = {}
|
|
195
194
|
self._simple_rpc_server: SimpleXMLRPCServer
|
|
195
|
+
self._instances[self._address] = self
|
|
196
|
+
threading.Thread.__init__(self, name=f"RpcServer {ip_addr}:{self._listen_port}")
|
|
196
197
|
|
|
197
198
|
def run(self) -> None:
|
|
198
199
|
"""Run the RPC-Server thread."""
|
|
@@ -266,8 +267,9 @@ class XmlRpcServer(RpcServer):
|
|
|
266
267
|
) -> None:
|
|
267
268
|
"""Init XmlRPC server."""
|
|
268
269
|
|
|
270
|
+
if self._initialized:
|
|
271
|
+
return
|
|
269
272
|
super().__init__(ip_addr=ip_addr, port=port)
|
|
270
|
-
self._instances[self._address] = self
|
|
271
273
|
self._simple_rpc_server = HomematicXMLRPCServer(
|
|
272
274
|
addr=self._address,
|
|
273
275
|
requestHandler=RequestHandler,
|
|
@@ -283,7 +285,7 @@ class XmlRpcServer(RpcServer):
|
|
|
283
285
|
if (rpc := cls._instances.get((ip_addr, port))) is None:
|
|
284
286
|
_LOGGER.debug("Creating XmlRpc server")
|
|
285
287
|
return super().__new__(cls)
|
|
286
|
-
return rpc
|
|
288
|
+
return cast(XmlRpcServer, rpc)
|
|
287
289
|
|
|
288
290
|
|
|
289
291
|
def create_xml_rpc_server(*, ip_addr: str = IP_ANY_V4, port: int = PORT_ANY) -> XmlRpcServer:
|
aiohomematic/client/__init__.py
CHANGED
|
@@ -507,7 +507,7 @@ class Client(ABC, LogContextMixin):
|
|
|
507
507
|
return None
|
|
508
508
|
|
|
509
509
|
@inspector(re_raise=False)
|
|
510
|
-
async def
|
|
510
|
+
async def get_all_device_descriptions(self, *, device_address: str) -> tuple[DeviceDescription, ...] | None:
|
|
511
511
|
"""Get all device descriptions from the backend."""
|
|
512
512
|
all_device_description: list[DeviceDescription] = []
|
|
513
513
|
if main_dd := await self.get_device_description(device_address=device_address):
|
aiohomematic/const.py
CHANGED
|
@@ -19,7 +19,7 @@ import sys
|
|
|
19
19
|
from types import MappingProxyType
|
|
20
20
|
from typing import Any, Final, NamedTuple, Required, TypeAlias, TypedDict
|
|
21
21
|
|
|
22
|
-
VERSION: Final = "2025.10.
|
|
22
|
+
VERSION: Final = "2025.10.8"
|
|
23
23
|
|
|
24
24
|
# Detect test speedup mode via environment
|
|
25
25
|
_TEST_SPEEDUP: Final = (
|
|
@@ -179,6 +179,8 @@ class CalulatedParameter(StrEnum):
|
|
|
179
179
|
|
|
180
180
|
APPARENT_TEMPERATURE = "APPARENT_TEMPERATURE"
|
|
181
181
|
DEW_POINT = "DEW_POINT"
|
|
182
|
+
DEW_POINT_SPREAD = "DEW_POINT_SPREAD"
|
|
183
|
+
ENTHALPY = "ENTHALPY"
|
|
182
184
|
FROST_POINT = "FROST_POINT"
|
|
183
185
|
OPERATING_VOLTAGE_LEVEL = "OPERATING_VOLTAGE_LEVEL"
|
|
184
186
|
VAPOR_CONCENTRATION = "VAPOR_CONCENTRATION"
|
|
@@ -24,7 +24,7 @@ Factory:
|
|
|
24
24
|
normal read-only data points.
|
|
25
25
|
|
|
26
26
|
Modules/classes:
|
|
27
|
-
- ApparentTemperature, DewPoint, FrostPoint, VaporConcentration: Climate-related
|
|
27
|
+
- ApparentTemperature, DewPoint, DewPointSpread, Enthalphy, FrostPoint, VaporConcentration: Climate-related
|
|
28
28
|
sensors implemented in climate.py using well-known formulas (see
|
|
29
29
|
aiohomematic.model.calculated.support for details and references).
|
|
30
30
|
- OperatingVoltageLevel: Interprets battery/voltage values and exposes a human
|
|
@@ -41,7 +41,14 @@ from typing import Final
|
|
|
41
41
|
|
|
42
42
|
from aiohomematic.decorators import inspector
|
|
43
43
|
from aiohomematic.model import device as hmd
|
|
44
|
-
from aiohomematic.model.calculated.climate import
|
|
44
|
+
from aiohomematic.model.calculated.climate import (
|
|
45
|
+
ApparentTemperature,
|
|
46
|
+
DewPoint,
|
|
47
|
+
DewPointSpread,
|
|
48
|
+
Enthalpy,
|
|
49
|
+
FrostPoint,
|
|
50
|
+
VaporConcentration,
|
|
51
|
+
)
|
|
45
52
|
from aiohomematic.model.calculated.data_point import CalculatedDataPoint
|
|
46
53
|
from aiohomematic.model.calculated.operating_voltage_level import OperatingVoltageLevel
|
|
47
54
|
|
|
@@ -49,13 +56,23 @@ __all__ = [
|
|
|
49
56
|
"ApparentTemperature",
|
|
50
57
|
"CalculatedDataPoint",
|
|
51
58
|
"DewPoint",
|
|
59
|
+
"DewPointSpread",
|
|
60
|
+
"Enthalpy",
|
|
52
61
|
"FrostPoint",
|
|
53
62
|
"OperatingVoltageLevel",
|
|
54
63
|
"VaporConcentration",
|
|
55
64
|
"create_calculated_data_points",
|
|
56
65
|
]
|
|
57
66
|
|
|
58
|
-
_CALCULATED_DATA_POINTS: Final = (
|
|
67
|
+
_CALCULATED_DATA_POINTS: Final = (
|
|
68
|
+
ApparentTemperature,
|
|
69
|
+
DewPoint,
|
|
70
|
+
DewPointSpread,
|
|
71
|
+
Enthalpy,
|
|
72
|
+
FrostPoint,
|
|
73
|
+
OperatingVoltageLevel,
|
|
74
|
+
VaporConcentration,
|
|
75
|
+
)
|
|
59
76
|
_LOGGER: Final = logging.getLogger(__name__)
|
|
60
77
|
|
|
61
78
|
|
|
@@ -13,6 +13,8 @@ from aiohomematic.model.calculated.data_point import CalculatedDataPoint
|
|
|
13
13
|
from aiohomematic.model.calculated.support import (
|
|
14
14
|
calculate_apparent_temperature,
|
|
15
15
|
calculate_dew_point,
|
|
16
|
+
calculate_dew_point_spread,
|
|
17
|
+
calculate_enthalpy,
|
|
16
18
|
calculate_frost_point,
|
|
17
19
|
calculate_vapor_concentration,
|
|
18
20
|
)
|
|
@@ -141,6 +143,62 @@ class DewPoint(BaseClimateSensor):
|
|
|
141
143
|
return None
|
|
142
144
|
|
|
143
145
|
|
|
146
|
+
class DewPointSpread(BaseClimateSensor):
|
|
147
|
+
"""Implementation of a calculated sensor for dew point spread."""
|
|
148
|
+
|
|
149
|
+
__slots__ = ()
|
|
150
|
+
|
|
151
|
+
_calculated_parameter = CalulatedParameter.DEW_POINT_SPREAD
|
|
152
|
+
|
|
153
|
+
def __init__(self, *, channel: hmd.Channel) -> None:
|
|
154
|
+
"""Initialize the data point."""
|
|
155
|
+
super().__init__(channel=channel)
|
|
156
|
+
self._unit = "K"
|
|
157
|
+
|
|
158
|
+
@staticmethod
|
|
159
|
+
def is_relevant_for_model(*, channel: hmd.Channel) -> bool:
|
|
160
|
+
"""Return if this calculated data point is relevant for the model."""
|
|
161
|
+
return _is_relevant_for_model_temperature_and_humidity(channel=channel)
|
|
162
|
+
|
|
163
|
+
@state_property
|
|
164
|
+
def value(self) -> float | None:
|
|
165
|
+
"""Return the value."""
|
|
166
|
+
if self._dp_temperature.value is not None and self._dp_humidity.value is not None:
|
|
167
|
+
return calculate_dew_point_spread(
|
|
168
|
+
temperature=self._dp_temperature.value,
|
|
169
|
+
humidity=self._dp_humidity.value,
|
|
170
|
+
)
|
|
171
|
+
return None
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class Enthalpy(BaseClimateSensor):
|
|
175
|
+
"""Implementation of a calculated sensor for enthalpy."""
|
|
176
|
+
|
|
177
|
+
__slots__ = ()
|
|
178
|
+
|
|
179
|
+
_calculated_parameter = CalulatedParameter.ENTHALPY
|
|
180
|
+
|
|
181
|
+
def __init__(self, *, channel: hmd.Channel) -> None:
|
|
182
|
+
"""Initialize the data point."""
|
|
183
|
+
super().__init__(channel=channel)
|
|
184
|
+
self._unit = "kJ/kg"
|
|
185
|
+
|
|
186
|
+
@staticmethod
|
|
187
|
+
def is_relevant_for_model(*, channel: hmd.Channel) -> bool:
|
|
188
|
+
"""Return if this calculated data point is relevant for the model."""
|
|
189
|
+
return _is_relevant_for_model_temperature_and_humidity(channel=channel)
|
|
190
|
+
|
|
191
|
+
@state_property
|
|
192
|
+
def value(self) -> float | None:
|
|
193
|
+
"""Return the value."""
|
|
194
|
+
if self._dp_temperature.value is not None and self._dp_humidity.value is not None:
|
|
195
|
+
return calculate_enthalpy(
|
|
196
|
+
temperature=self._dp_temperature.value,
|
|
197
|
+
humidity=self._dp_humidity.value,
|
|
198
|
+
)
|
|
199
|
+
return None
|
|
200
|
+
|
|
201
|
+
|
|
144
202
|
class FrostPoint(BaseClimateSensor):
|
|
145
203
|
"""Implementation of a calculated sensor for frost point."""
|
|
146
204
|
|
|
@@ -16,9 +16,47 @@ from typing import Final
|
|
|
16
16
|
|
|
17
17
|
from aiohomematic.support import extract_exc_args
|
|
18
18
|
|
|
19
|
+
_DEFAULT_PRESSURE_HPA: Final = 1013.25
|
|
19
20
|
_LOGGER: Final = logging.getLogger(__name__)
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
def calculate_dew_point_spread(*, temperature: float, humidity: int) -> float | None:
|
|
24
|
+
"""
|
|
25
|
+
Calculate the dew point spread.
|
|
26
|
+
|
|
27
|
+
Dew point spread = Difference between current air temperature and dew point.
|
|
28
|
+
Specifies the safety margin against condensation(K).
|
|
29
|
+
"""
|
|
30
|
+
if dew_point := calculate_dew_point(temperature=temperature, humidity=humidity):
|
|
31
|
+
return round(temperature - dew_point, 2)
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def calculate_enthalpy(
|
|
36
|
+
*, temperature: float, humidity: int, pressure_hPa: float = _DEFAULT_PRESSURE_HPA
|
|
37
|
+
) -> float | None:
|
|
38
|
+
"""
|
|
39
|
+
Calculate the enthalpy based on temperature and humidity.
|
|
40
|
+
|
|
41
|
+
Calculates the specific enthalpy of humid air in kJ/kg (relative to dry air).
|
|
42
|
+
temperature: Air temperature in °C
|
|
43
|
+
humidity: Relative humidity in %
|
|
44
|
+
pressure_hPa: Air pressure (default: 1013.25 hPa)
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
# Saturation vapor pressure according to Magnus in hPa
|
|
49
|
+
e_s = 6.112 * math.exp((17.62 * temperature) / (243.12 + temperature))
|
|
50
|
+
e = humidity / 100.0 * e_s # aktueller Dampfdruck in hPa
|
|
51
|
+
|
|
52
|
+
# Mixing ratio (g water / kg dry air)
|
|
53
|
+
r = 622 * e / (pressure_hPa - e)
|
|
54
|
+
|
|
55
|
+
# Specific enthalpy (kJ/kg dry air)
|
|
56
|
+
h = 1.006 * temperature + r * (2501 + 1.86 * temperature) / 1000 # in kJ/kg
|
|
57
|
+
return round(h, 2)
|
|
58
|
+
|
|
59
|
+
|
|
22
60
|
def _calculate_heat_index(*, temperature: float, humidity: int) -> float:
|
|
23
61
|
"""
|
|
24
62
|
Calculate the Heat Index (feels like temperature) based on the NOAA equation.
|
|
@@ -158,10 +196,10 @@ def calculate_dew_point(*, temperature: float, humidity: int) -> float | None:
|
|
|
158
196
|
def calculate_frost_point(*, temperature: float, humidity: int) -> float | None:
|
|
159
197
|
"""Calculate the frost point."""
|
|
160
198
|
try:
|
|
161
|
-
if (
|
|
199
|
+
if (dew_point := calculate_dew_point(temperature=temperature, humidity=humidity)) is None:
|
|
162
200
|
return None
|
|
163
201
|
t = temperature + 273.15
|
|
164
|
-
td =
|
|
202
|
+
td = dew_point + 273.15
|
|
165
203
|
|
|
166
204
|
return round((td + (2671.02 / ((2954.61 / t) + 2.193665 * math.log(t) - 13.3448)) - t) - 273.15, 1)
|
|
167
205
|
except ValueError as verr:
|
aiohomematic/model/device.py
CHANGED
|
@@ -1338,10 +1338,7 @@ class _DefinitionExporter:
|
|
|
1338
1338
|
def perform_save() -> DataOperationResult:
|
|
1339
1339
|
if not check_or_create_directory(directory=file_dir):
|
|
1340
1340
|
return DataOperationResult.NO_SAVE # pragma: no cover
|
|
1341
|
-
with open(
|
|
1342
|
-
file=os.path.join(file_dir, filename),
|
|
1343
|
-
mode="wb",
|
|
1344
|
-
) as fptr:
|
|
1341
|
+
with open(file=os.path.join(file_dir, filename), mode="wb") as fptr:
|
|
1345
1342
|
fptr.write(orjson.dumps(data, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS))
|
|
1346
1343
|
return DataOperationResult.SAVE_SUCCESS
|
|
1347
1344
|
|
aiohomematic/support.py
CHANGED
|
@@ -43,6 +43,7 @@ from aiohomematic.const import (
|
|
|
43
43
|
NO_CACHE_ENTRY,
|
|
44
44
|
PRIMARY_CLIENT_CANDIDATE_INTERFACES,
|
|
45
45
|
TIMEOUT,
|
|
46
|
+
UTF_8,
|
|
46
47
|
CommandRxMode,
|
|
47
48
|
DeviceDescription,
|
|
48
49
|
ParamsetKey,
|
|
@@ -526,9 +527,9 @@ def hash_sha256(*, value: Any) -> str:
|
|
|
526
527
|
data = orjson.dumps(value, option=orjson.OPT_SORT_KEYS | orjson.OPT_NON_STR_KEYS)
|
|
527
528
|
except Exception:
|
|
528
529
|
# Fallback: convert to a hashable representation and use repr()
|
|
529
|
-
data = repr(_make_value_hashable(value=value)).encode()
|
|
530
|
+
data = repr(_make_value_hashable(value=value)).encode(encoding=UTF_8)
|
|
530
531
|
hasher.update(data)
|
|
531
|
-
return base64.b64encode(hasher.digest()).decode()
|
|
532
|
+
return base64.b64encode(hasher.digest()).decode(encoding=UTF_8)
|
|
532
533
|
|
|
533
534
|
|
|
534
535
|
def _make_value_hashable(*, value: Any) -> Any:
|
|
@@ -632,9 +633,7 @@ def log_boundary_error(
|
|
|
632
633
|
log_message += f" {message}"
|
|
633
634
|
|
|
634
635
|
if log_context:
|
|
635
|
-
log_message += (
|
|
636
|
-
f" ctx={orjson.dumps(_safe_log_context(context=log_context), option=orjson.OPT_SORT_KEYS).decode()}"
|
|
637
|
-
)
|
|
636
|
+
log_message += f" ctx={orjson.dumps(_safe_log_context(context=log_context), option=orjson.OPT_SORT_KEYS).decode(encoding=UTF_8)}"
|
|
638
637
|
|
|
639
638
|
# Choose level if not provided:
|
|
640
639
|
if (chosen_level := level) is None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiohomematic
|
|
3
|
-
Version: 2025.10.
|
|
3
|
+
Version: 2025.10.8
|
|
4
4
|
Summary: Homematic interface for Home Assistant running on Python 3.
|
|
5
5
|
Home-page: https://github.com/sukramj/aiohomematic
|
|
6
6
|
Author-email: SukramJ <sukramj@icloud.com>, Daniel Perna <danielperna84@gmail.com>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
aiohomematic/__init__.py,sha256=ngULK_anZQwwUUCVcberBdVjguYfboiuG9VoueKy9fA,2283
|
|
2
2
|
aiohomematic/async_support.py,sha256=BeNKaDrFsRA5-_uAFzmyyKPqlImfSs58C22Nqd5dZAg,7887
|
|
3
|
-
aiohomematic/const.py,sha256=
|
|
3
|
+
aiohomematic/const.py,sha256=cUITpwnRyO-gGI7iJH2pFO3vV1fb0tbFZ2-kQjby0L0,26711
|
|
4
4
|
aiohomematic/context.py,sha256=M7gkA7KFT0dp35gzGz2dzKVXu1PP0sAnepgLlmjyRS4,451
|
|
5
5
|
aiohomematic/converter.py,sha256=gaNHe-WEiBStZMuuRz9iGn3Mo_CGz1bjgLtlYBJJAko,3624
|
|
6
6
|
aiohomematic/decorators.py,sha256=M4n_VSyqmsUgQQQv_-3JWQxYPbS6KEkhCS8OzAfaVKo,11060
|
|
@@ -8,30 +8,30 @@ aiohomematic/exceptions.py,sha256=8Uu3rADawhYlAz6y4J52aJ-wKok8Z7YbUYUwWeGMKhs,50
|
|
|
8
8
|
aiohomematic/hmcli.py,sha256=qNstNDX6q8t3mJFCGlXlmRVobGabntrPtFi3kchf1Eg,4933
|
|
9
9
|
aiohomematic/property_decorators.py,sha256=56lHGATgRtaFkIK_IXcR2tBW9mIVITcCwH5KOw575GA,17162
|
|
10
10
|
aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
aiohomematic/support.py,sha256=
|
|
11
|
+
aiohomematic/support.py,sha256=TSzKKSVY6_fj_3hGvdmIIqSHzXQSmYVXV4A2WdBTPqQ,22863
|
|
12
12
|
aiohomematic/validator.py,sha256=HUikmo-SFksehFBAdZmBv4ajy0XkjgvXvcCfbexnzZo,3563
|
|
13
13
|
aiohomematic/caches/__init__.py,sha256=_gI30tbsWgPRaHvP6cRxOQr6n9bYZzU-jp1WbHhWg-A,470
|
|
14
14
|
aiohomematic/caches/dynamic.py,sha256=0hOu-WoYUc9_3fofMeg_OjlYS-quD4uTyDI6zd5W4Do,22553
|
|
15
15
|
aiohomematic/caches/persistent.py,sha256=xUMjvu5Vthz9W0LLllSbcqTADZvVV025b4VnPzrPnis,20604
|
|
16
16
|
aiohomematic/caches/visibility.py,sha256=8lTO-jfAUzd90atUOK8rKMrzRa__m083RAoEovg0Q0o,31676
|
|
17
|
-
aiohomematic/central/__init__.py,sha256=
|
|
17
|
+
aiohomematic/central/__init__.py,sha256=z6_VqPDaVnnHFdqNmdeMMqzolxIF-Ef-K_sB9dOikD0,92660
|
|
18
18
|
aiohomematic/central/decorators.py,sha256=NUMSsQ_Or6gno4LzagrNMXeBtmbBbYyoIlMI0TFp1_E,6908
|
|
19
|
-
aiohomematic/central/rpc_server.py,sha256=
|
|
20
|
-
aiohomematic/client/__init__.py,sha256=
|
|
19
|
+
aiohomematic/central/rpc_server.py,sha256=wf2KG-cj_wIdgfRHY3GIFFzOenJbz8MfUGLdF1drd3k,10971
|
|
20
|
+
aiohomematic/client/__init__.py,sha256=2oqhX9JjWrQ3Bxz4JR1Y53DjpNDlNQ9sEIa6z8Mm-88,73858
|
|
21
21
|
aiohomematic/client/_rpc_errors.py,sha256=-NPtGvkQPJ4V2clDxv1tKy09M9JZm61pUCeki9DDh6s,2984
|
|
22
22
|
aiohomematic/client/json_rpc.py,sha256=7p8j6uhS0y2LuJVtobQqwtpOA_AsC5HqEdGB0T8ZSu4,50177
|
|
23
23
|
aiohomematic/client/rpc_proxy.py,sha256=v0YyhfQ_qylQpqGvGtylJtG3_tIk9PN6tWMHkki4D48,10705
|
|
24
24
|
aiohomematic/model/__init__.py,sha256=KO7gas_eEzm67tODKqWTs0617CSGeKKjOWOlDbhRo_Q,5458
|
|
25
25
|
aiohomematic/model/data_point.py,sha256=Ml8AOQ1RcRezTYWiGBlIXwcTLolQMX5Cyb-O7GtNDm4,41586
|
|
26
|
-
aiohomematic/model/device.py,sha256=
|
|
26
|
+
aiohomematic/model/device.py,sha256=NZ5J5Snu03gMVlGlFYW7meGLT0XV4Fvz-SlqfPXkWOA,52895
|
|
27
27
|
aiohomematic/model/event.py,sha256=82H8M_QNMCCC29mP3R16alJyKWS3Hb3aqY_aFMSqCvo,6874
|
|
28
28
|
aiohomematic/model/support.py,sha256=l5E9Oon20nkGWOSEmbYtqQbpbh6-H4rIk8xtEtk5Fcg,19657
|
|
29
29
|
aiohomematic/model/update.py,sha256=5F39xNz9B2GKJ8TvJHPMC-Wu97HfkiiMawjnHEYMnoA,5156
|
|
30
|
-
aiohomematic/model/calculated/__init__.py,sha256=
|
|
31
|
-
aiohomematic/model/calculated/climate.py,sha256=
|
|
30
|
+
aiohomematic/model/calculated/__init__.py,sha256=_n-qWnG4FDs-arTEfWbsXfLK4LGic4pM8kFQgCqtPMI,2988
|
|
31
|
+
aiohomematic/model/calculated/climate.py,sha256=tDYbO7BajBgc8MpId2jGnrHJNQbxWDTGZoEQnb9WRL8,10521
|
|
32
32
|
aiohomematic/model/calculated/data_point.py,sha256=oTN8y3B9weh7CX3ZFiDyZFgvX77iUwge-acg49pd1sI,11609
|
|
33
33
|
aiohomematic/model/calculated/operating_voltage_level.py,sha256=ZrOPdNoWQ5QLr4yzMRsoPG3UuJKRkBUHfchIrpKZU4o,13527
|
|
34
|
-
aiohomematic/model/calculated/support.py,sha256=
|
|
34
|
+
aiohomematic/model/calculated/support.py,sha256=v7Wz0efL2XmjRY48IKFX1P2HbbPQUVVU9iXwdaao0D4,8011
|
|
35
35
|
aiohomematic/model/custom/__init__.py,sha256=UzczqjsUqWvS9ZaqKeb6elbjb2y5W3cgFPB0YQUHaeM,6095
|
|
36
36
|
aiohomematic/model/custom/climate.py,sha256=zSLQUY_tU7tDlbM-vW15BGuyWRjcR_DyqOwSg1_Vmfw,57217
|
|
37
37
|
aiohomematic/model/custom/const.py,sha256=Kh1pnab6nmwbaY43CfXQy3yrWpPwsrQdl1Ea2aZ6aw0,4961
|
|
@@ -69,10 +69,10 @@ aiohomematic/rega_scripts/get_serial.fn,sha256=t1oeo-sB_EuVeiY24PLcxFSkdQVgEWGXz
|
|
|
69
69
|
aiohomematic/rega_scripts/get_system_variable_descriptions.fn,sha256=UKXvC0_5lSApdQ2atJc0E5Stj5Zt3lqh0EcliokYu2c,849
|
|
70
70
|
aiohomematic/rega_scripts/set_program_state.fn,sha256=0bnv7lUj8FMjDZBz325tDVP61m04cHjVj4kIOnUUgpY,279
|
|
71
71
|
aiohomematic/rega_scripts/set_system_variable.fn,sha256=sTmr7vkPTPnPkor5cnLKlDvfsYRbGO1iq2z_2pMXq5E,383
|
|
72
|
-
aiohomematic-2025.10.
|
|
72
|
+
aiohomematic-2025.10.8.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=nFeYkoX_EXXIwbrpL_5peYQG-934D0ASN6kflYp0_4I,12819
|
|
75
|
-
aiohomematic-2025.10.
|
|
76
|
-
aiohomematic-2025.10.
|
|
77
|
-
aiohomematic-2025.10.
|
|
78
|
-
aiohomematic-2025.10.
|
|
75
|
+
aiohomematic-2025.10.8.dist-info/METADATA,sha256=NidjXklk-E_9ym54IQr5kTTx5lCDVNhUx5Ep3bIfwyc,7603
|
|
76
|
+
aiohomematic-2025.10.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
77
|
+
aiohomematic-2025.10.8.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
|
|
78
|
+
aiohomematic-2025.10.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|