aiohomematic 2025.8.7__py3-none-any.whl → 2025.8.9__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.

@@ -671,10 +671,11 @@ class Device(PayloadMixin):
671
671
  """Provide some useful information."""
672
672
  return (
673
673
  f"address: {self._address}, "
674
- f"model: {len(self._model)}, "
674
+ f"model: {self._model}, "
675
675
  f"name: {self._name}, "
676
- f"generic_data_points: {len(self.generic_data_points)}, "
677
- f"custom_data_points: {len(self.custom_data_points)}, "
676
+ f"generic dps: {len(self.generic_data_points)}, "
677
+ f"calculated dps: {len(self.calculated_data_points)}, "
678
+ f"custom dps: {len(self.custom_data_points)}, "
678
679
  f"events: {len(self.generic_events)}"
679
680
  )
680
681
 
@@ -1077,8 +1078,9 @@ class Channel(PayloadMixin):
1077
1078
  return (
1078
1079
  f"address: {self._address}, "
1079
1080
  f"type: {self._type_name}, "
1080
- f"generic_data_points: {len(self._generic_data_points)}, "
1081
- f"custom_data_point: {self._custom_data_point is not None}, "
1081
+ f"generic dps: {len(self._generic_data_points)}, "
1082
+ f"calculated dps: {len(self._calculated_data_points)}, "
1083
+ f"custom dp: {self._custom_data_point is not None}, "
1082
1084
  f"events: {len(self._generic_events)}"
1083
1085
  )
1084
1086
 
@@ -1146,121 +1148,90 @@ class _ValueCache:
1146
1148
 
1147
1149
  async def get_value(
1148
1150
  self,
1149
- channel_address: str,
1150
- paramset_key: ParamsetKey,
1151
- parameter: str,
1151
+ dpk: DataPointKey,
1152
1152
  call_source: CallSource,
1153
1153
  direct_call: bool = False,
1154
1154
  ) -> Any:
1155
1155
  """Load data."""
1156
+
1156
1157
  async with self._sema_get_or_load_value:
1157
- if (
1158
- direct_call is False
1159
- and (
1160
- cached_value := self._get_value_from_cache(
1161
- channel_address=channel_address,
1162
- paramset_key=paramset_key,
1163
- parameter=parameter,
1164
- )
1165
- )
1166
- != NO_CACHE_ENTRY
1167
- ):
1158
+ if direct_call is False and (cached_value := self._get_value_from_cache(dpk=dpk)) != NO_CACHE_ENTRY:
1168
1159
  return NO_CACHE_ENTRY if cached_value == self._NO_VALUE_CACHE_ENTRY else cached_value
1169
1160
 
1170
- value_dict: dict[str, Any] = {parameter: self._NO_VALUE_CACHE_ENTRY}
1161
+ value_dict: dict[str, Any] = {dpk.parameter: self._NO_VALUE_CACHE_ENTRY}
1171
1162
  try:
1172
- value_dict = await self._get_values_for_cache(
1173
- channel_address=channel_address,
1174
- paramset_key=paramset_key,
1175
- parameter=parameter,
1176
- )
1163
+ value_dict = await self._get_values_for_cache(dpk=dpk)
1177
1164
  except BaseHomematicException as bhexc:
1178
1165
  _LOGGER.debug(
1179
1166
  "GET_OR_LOAD_VALUE: Failed to get data for %s, %s, %s, %s: %s",
1180
1167
  self._device.model,
1181
- channel_address,
1182
- parameter,
1168
+ dpk.channel_address,
1169
+ dpk.parameter,
1183
1170
  call_source,
1184
1171
  extract_exc_args(exc=bhexc),
1185
1172
  )
1186
1173
  for d_parameter, d_value in value_dict.items():
1187
1174
  self._add_entry_to_device_cache(
1188
- channel_address=channel_address,
1189
- paramset_key=paramset_key,
1190
- parameter=d_parameter,
1175
+ dpk=DataPointKey(
1176
+ interface_id=dpk.interface_id,
1177
+ channel_address=dpk.channel_address,
1178
+ paramset_key=dpk.paramset_key,
1179
+ parameter=d_parameter,
1180
+ ),
1191
1181
  value=d_value,
1192
1182
  )
1193
1183
  return (
1194
1184
  NO_CACHE_ENTRY
1195
- if (value := value_dict.get(parameter)) and value == self._NO_VALUE_CACHE_ENTRY
1185
+ if (value := value_dict.get(dpk.parameter)) and value == self._NO_VALUE_CACHE_ENTRY
1196
1186
  else value
1197
1187
  )
1198
1188
 
1199
- async def _get_values_for_cache(
1200
- self, channel_address: str, paramset_key: ParamsetKey, parameter: str
1201
- ) -> dict[str, Any]:
1189
+ async def _get_values_for_cache(self, dpk: DataPointKey) -> dict[str, Any]:
1202
1190
  """Return a value from CCU to store in cache."""
1203
1191
  if not self._device.available:
1204
1192
  _LOGGER.debug(
1205
1193
  "GET_VALUES_FOR_CACHE failed: device %s (%s) is not available", self._device.name, self._device.address
1206
1194
  )
1207
1195
  return {}
1208
- if paramset_key == ParamsetKey.VALUES:
1196
+ if dpk.paramset_key == ParamsetKey.VALUES:
1209
1197
  return {
1210
- parameter: await self._device.client.get_value(
1211
- channel_address=channel_address,
1212
- paramset_key=paramset_key,
1213
- parameter=parameter,
1198
+ dpk.parameter: await self._device.client.get_value(
1199
+ channel_address=dpk.channel_address,
1200
+ paramset_key=dpk.paramset_key,
1201
+ parameter=dpk.parameter,
1214
1202
  call_source=CallSource.HM_INIT,
1215
1203
  )
1216
1204
  }
1217
1205
  return await self._device.client.get_paramset(
1218
- address=channel_address, paramset_key=paramset_key, call_source=CallSource.HM_INIT
1206
+ address=dpk.channel_address, paramset_key=dpk.paramset_key, call_source=CallSource.HM_INIT
1219
1207
  )
1220
1208
 
1221
- def _add_entry_to_device_cache(
1222
- self, channel_address: str, paramset_key: ParamsetKey, parameter: str, value: Any
1223
- ) -> None:
1209
+ def _add_entry_to_device_cache(self, dpk: DataPointKey, value: Any) -> None:
1224
1210
  """Add value to cache."""
1225
- key = DataPointKey(
1226
- interface_id=self._device.interface_id,
1227
- channel_address=channel_address,
1228
- paramset_key=paramset_key,
1229
- parameter=parameter,
1230
- )
1231
1211
  # write value to cache even if an exception has occurred
1232
1212
  # to avoid repetitive calls to CCU within max_age
1233
- self._device_cache[key] = CacheEntry(value=value, refresh_at=datetime.now())
1213
+ self._device_cache[dpk] = CacheEntry(value=value, refresh_at=datetime.now())
1234
1214
 
1235
1215
  def _get_value_from_cache(
1236
1216
  self,
1237
- channel_address: str,
1238
- paramset_key: ParamsetKey,
1239
- parameter: str,
1217
+ dpk: DataPointKey,
1240
1218
  ) -> Any:
1241
1219
  """Load data from caches."""
1242
1220
  # Try to get data from central cache
1243
1221
  if (
1244
- paramset_key == ParamsetKey.VALUES
1222
+ dpk.paramset_key == ParamsetKey.VALUES
1245
1223
  and (
1246
1224
  global_value := self._device.central.data_cache.get_data(
1247
1225
  interface=self._device.interface,
1248
- channel_address=channel_address,
1249
- parameter=parameter,
1226
+ channel_address=dpk.channel_address,
1227
+ parameter=dpk.parameter,
1250
1228
  )
1251
1229
  )
1252
1230
  != NO_CACHE_ENTRY
1253
1231
  ):
1254
1232
  return global_value
1255
1233
 
1256
- # Try to get data from device cache
1257
- key = DataPointKey(
1258
- interface_id=self._device.interface_id,
1259
- channel_address=channel_address,
1260
- paramset_key=paramset_key,
1261
- parameter=parameter,
1262
- )
1263
- if (cache_entry := self._device_cache.get(key, CacheEntry.empty())) and cache_entry.is_valid:
1234
+ if (cache_entry := self._device_cache.get(dpk, CacheEntry.empty())) and cache_entry.is_valid:
1264
1235
  return cache_entry.value
1265
1236
  return NO_CACHE_ENTRY
1266
1237
 
@@ -289,21 +289,17 @@ class Hub:
289
289
 
290
290
  def _identify_missing_program_ids(self, programs: tuple[ProgramData, ...]) -> set[str]:
291
291
  """Identify missing programs."""
292
- return {
293
- program_dp.pid
294
- for program_dp in self._central.program_data_points
295
- if program_dp.pid not in [x.pid for x in programs]
296
- }
292
+ return {dp.pid for dp in self._central.program_data_points if dp.pid not in [x.pid for x in programs]}
297
293
 
298
294
  def _identify_missing_variable_ids(self, variables: tuple[SystemVariableData, ...]) -> set[str]:
299
295
  """Identify missing variables."""
300
296
  variable_ids: dict[str, bool] = {x.vid: x.extended_sysvar for x in variables}
301
297
  missing_variable_ids: list[str] = []
302
- for svdp in self._central.sysvar_data_points:
303
- if svdp.data_type == SysvarType.STRING:
298
+ for dp in self._central.sysvar_data_points:
299
+ if dp.data_type == SysvarType.STRING:
304
300
  continue
305
- if (vid := svdp.vid) is not None and (
306
- vid not in variable_ids or (svdp.is_extended is not variable_ids.get(vid))
301
+ if (vid := dp.vid) is not None and (
302
+ vid not in variable_ids or (dp.is_extended is not variable_ids.get(vid))
307
303
  ):
308
304
  missing_variable_ids.append(vid)
309
305
  return set(missing_variable_ids)
@@ -107,6 +107,10 @@ class GenericHubDataPoint(CallbackDataPoint, PayloadMixin):
107
107
  """Return, if the state is uncertain."""
108
108
  return self._state_uncertain
109
109
 
110
+ def _get_signature(self) -> str:
111
+ """Return the signature of the data_point."""
112
+ return f"{self._category}/{self.name}"
113
+
110
114
 
111
115
  class GenericSysvarDataPoint(GenericHubDataPoint):
112
116
  """Class for a HomeMatic system variable."""
@@ -96,6 +96,10 @@ class DpUpdate(CallbackDataPoint, PayloadMixin):
96
96
  return self._device.available_firmware
97
97
  return self._device.firmware
98
98
 
99
+ def _get_signature(self) -> str:
100
+ """Return the signature of the data_point."""
101
+ return f"{self._category}/{self._device.model}"
102
+
99
103
  def _get_path_data(self) -> DataPointPathData:
100
104
  """Return the path data of the data_point."""
101
105
  return DataPointPathData(
@@ -18,7 +18,6 @@ string sUse_Interface = "##interface##";
18
18
  string sDevId;
19
19
  string sChnId;
20
20
  string sDPId;
21
- string sDPId;
22
21
  var vDPValue;
23
22
  boolean bDPFirst = true;
24
23
  object oInterface = interfaces.Get(sUse_Interface);
@@ -28,41 +27,59 @@ if (oInterface) {
28
27
  integer iInterface_ID = interfaces.Get(sUse_Interface).ID();
29
28
  string sAllDevices = dom.GetObject(ID_DEVICES).EnumUsedIDs();
30
29
  foreach (sDevId, sAllDevices) {
31
- object oDevice = dom.GetObject(sDevId);
30
+ object oDevice = dom.GetObject(sDevId);
32
31
  if ((oDevice) && (oDevice.ReadyConfig()) && (oDevice.Interface() == iInterface_ID)) {
33
32
  foreach (sChnId, oDevice.Channels()) {
34
33
  object oChannel = dom.GetObject(sChnId);
35
- foreach(sDPId, oChannel.DPs().EnumUsedIDs()) {
36
- object oDP = dom.GetObject(sDPId);
37
- if (oDP && oDP.Timestamp()) {
38
- if (oDP.TypeName() != "VARDP") {
39
- if (bDPFirst) {
40
- bDPFirst = false;
41
- } else {
42
- WriteLine(',');
43
- }
44
- integer sValueType = oDP.ValueType();
45
- Write('"');
46
- WriteURL(oDP.Name());
47
- Write('":');
48
- if (sValueType == 20) {
49
- Write('"');
50
- WriteURL(oDP.Value());
51
- Write('"');
52
- } else {
53
- vDPValue = oDP.Value();
54
- if (sValueType == 2) {
55
- if (vDPValue) {
56
- Write("true");
34
+ if (oChannel) {
35
+ var oDPs = oChannel.DPs();
36
+ if (oDPs) {
37
+ foreach(sDPId, oDPs.EnumUsedIDs()) {
38
+ object oDP = dom.GetObject(sDPId);
39
+ if (oDP && oDP.Timestamp()) {
40
+ if (oDP.TypeName() != "VARDP") {
41
+ integer sValueType = oDP.ValueType();
42
+ boolean bHasValue = false;
43
+ string sValue;
44
+ string sID = oDP.Name().UriEncode();
45
+ if (sValueType == 20) {
46
+ sValue = oDP.Value().UriEncode();
47
+ bHasValue = true;
57
48
  } else {
58
- Write("false");
49
+ vDPValue = oDP.Value();
50
+ if (sValueType == 2) {
51
+ if (vDPValue) {
52
+ sValue = "true";
53
+ } else {
54
+ sValue = "false";
55
+ }
56
+ bHasValue = true;
57
+ } else {
58
+ if (vDPValue == "") {
59
+ sValue = "0";
60
+ } else {
61
+ sValue = vDPValue;
62
+ }
63
+ bHasValue = true;
64
+ }
65
+ }
66
+ if (bHasValue) {
67
+ if (bDPFirst) {
68
+ bDPFirst = false;
69
+ } else {
70
+ WriteLine(',');
71
+ }
72
+ Write('"');
73
+ Write(sID);
74
+ Write('":');
75
+ if (sValueType == 20) {
76
+ Write('"');
77
+ Write(sValue);
78
+ Write('"');
79
+ } else {
80
+ Write(sValue);
81
+ }
59
82
  }
60
- } else {
61
- if (vDPValue == "") {
62
- Write("0");
63
- } else {
64
- Write(vDPValue);
65
- }
66
83
  }
67
84
  }
68
85
  }
aiohomematic/support.py CHANGED
@@ -18,6 +18,8 @@ import ssl
18
18
  import sys
19
19
  from typing import Any, Final, cast
20
20
 
21
+ import orjson
22
+
21
23
  from aiohomematic import client as hmcl
22
24
  from aiohomematic.const import (
23
25
  ADDRESS_SEPARATOR,
@@ -430,9 +432,20 @@ def debug_enabled() -> bool:
430
432
 
431
433
 
432
434
  def hash_sha256(value: Any) -> str:
433
- """Hash a value with sha256."""
435
+ """
436
+ Hash a value with sha256.
437
+
438
+ Uses orjson to serialize the value with sorted keys for a fast and stable
439
+ representation. Falls back to the repr-based approach if
440
+ serialization fails (e.g., unsupported types).
441
+ """
434
442
  hasher = hashlib.sha256()
435
- hasher.update(repr(_make_value_hashable(value)).encode())
443
+ try:
444
+ data = orjson.dumps(value, option=orjson.OPT_SORT_KEYS | orjson.OPT_NON_STR_KEYS)
445
+ except Exception:
446
+ # Fallback: convert to a hashable representation and use repr()
447
+ data = repr(_make_value_hashable(value)).encode()
448
+ hasher.update(data)
436
449
  return base64.b64encode(hasher.digest()).decode()
437
450
 
438
451
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.8.7
3
+ Version: 2025.8.9
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,41 +1,41 @@
1
1
  aiohomematic/__init__.py,sha256=VoLXfPmEFWVOFseEusar-BcfKhQ8pBthrA7M6_QkWg8,1741
2
2
  aiohomematic/async_support.py,sha256=8KzftPu9CHRpxxXU8ElExYYadN9P6rSkMvLK5Ci2Xlo,5476
3
- aiohomematic/const.py,sha256=xUZI-AezJlVJRt2QttEmCPocURyYjHmYFaMpLhT2RFw,23474
3
+ aiohomematic/const.py,sha256=Bb4WaY4ISZutoJ9P7JJbXJ7BHaXqdRepkNiW35ER-i8,24234
4
4
  aiohomematic/context.py,sha256=4CNoLd4PQ8MsLED_3D-Gcxo4h2UNlyQNd7QUE_0uvBA,253
5
5
  aiohomematic/converter.py,sha256=eZ3iQPCfYZwqxQgUy4q6aMne_Bay-27f1HQuMRdabZ4,2922
6
6
  aiohomematic/decorators.py,sha256=YD7zX9jBN-F-NdfKGNn0STqR6cndpoBCMuXaBvgvam4,7088
7
7
  aiohomematic/exceptions.py,sha256=uMmbR-rWmCnseqmOPSHZ826YZ10uJrxG1c0w7VCYPZ0,4579
8
8
  aiohomematic/hmcli.py,sha256=9oeXjCy50hkjMj7t1c9Cw0bz-LnXzjheKQBQDyGQQRk,4582
9
9
  aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- aiohomematic/support.py,sha256=PgtFBHLVllnXS8AweQCNBiekL1__EgEAcGPjPNrqUi8,15741
10
+ aiohomematic/support.py,sha256=MTRICfoUDT54plMObB4joogwAzdJCcGo-0QHkmlP40g,16170
11
11
  aiohomematic/validator.py,sha256=Xxcmf2MzjIvzsDAfJsPR-cSN8S06sub-V3TCn6ronAs,1765
12
12
  aiohomematic/caches/__init__.py,sha256=Uco9Y5fVmIPm_iRoLPWJnJNYfs9PY6VL-Jmj_3cT3yE,391
13
- aiohomematic/caches/dynamic.py,sha256=CREQR87-I8rvvFOyrxaL9q161VKqEvyaRYi55fc-zos,21755
14
- aiohomematic/caches/persistent.py,sha256=pKWvzOoIB55iFtCD9RoufrxOPsorZU2QH5IcXlRujRY,19586
15
- aiohomematic/caches/visibility.py,sha256=mEOLz3WMzDtBp6ghh9Y0Gg_DUJBSH1SyqyCivFgY5wM,29843
16
- aiohomematic/central/__init__.py,sha256=DaEtE_0ODH5GO_HBJt1OzZ2fIDG8r1UhE8odPTTZo0k,84226
13
+ aiohomematic/caches/dynamic.py,sha256=rvqsLhImFy6J5a_ZJc705-_tDKyboZQNXNE2BlOrTGY,21460
14
+ aiohomematic/caches/persistent.py,sha256=ccdxTZztNRrDFTrlQTG6ad0g-NeJqgmZbyw5QhABa3s,19853
15
+ aiohomematic/caches/visibility.py,sha256=SBTVN3qxxh7m-d06BKtpHDCH8CWWsxDr5LC5vB3-JLo,31402
16
+ aiohomematic/central/__init__.py,sha256=LlTTbM0y8VNUAT5z-R2L1Jo6NVdlWynWXH1h7E2XUAA,84329
17
17
  aiohomematic/central/decorators.py,sha256=Lgc9SzvugZ45h_1anPjBNgzTjQ8BgDHnquE1PD48-XY,4899
18
18
  aiohomematic/central/xml_rpc_server.py,sha256=xwcb57ow7YEUS4By0HSBwzRSEY8kC9nZ-7hl4M-EWqI,9957
19
19
  aiohomematic/client/__init__.py,sha256=n2rNU3L1Xr453xsTCTM2mh5N1alp0yftAIienziB6ak,69753
20
20
  aiohomematic/client/json_rpc.py,sha256=HGgCXcp1uCfDkBdHlMNV8OD5O2PfWFRYNmiX5Pv1FO8,46463
21
21
  aiohomematic/client/xml_rpc.py,sha256=pUFdJZBtirNyNNyHbeMDOEh2mFkxQf_zrvjd56n1Lv4,8161
22
22
  aiohomematic/model/__init__.py,sha256=AbrppmY8X5rJkBV3c7Ggndk16Qvl-1S0uUWJqqxmXUE,5380
23
- aiohomematic/model/data_point.py,sha256=mMiUzGmZ_261iYV0FSCTCLGal7WTh69UqdMd_IfV0sg,39739
23
+ aiohomematic/model/data_point.py,sha256=Vykptu14k7q3uD3yRdQXj7g18DN5iBC2pT-8m0lsDzY,40110
24
24
  aiohomematic/model/decorators.py,sha256=sIxYsoyIE9aqbbrAnuFSvebLhNZC_DaMlEOBe6T_fRA,6718
25
- aiohomematic/model/device.py,sha256=8lCCdiYLInlASFEZAHLxEWzxF60qvQ7XemUnBjBq8co,52741
25
+ aiohomematic/model/device.py,sha256=1F0yhv7_DL1VnJrODV-oRGkZ-zaX7b5KB6PtXKVwhp8,51912
26
26
  aiohomematic/model/event.py,sha256=4dVuW3IBXkXcYhJUBtV8ax8dq4krtomA0wxbvXPuNCc,6935
27
27
  aiohomematic/model/support.py,sha256=fXaGvD6ywaOmDihIAHjn-z3AuIn0Q3Wiq7EqcxUV6uc,19630
28
- aiohomematic/model/update.py,sha256=r7Swejskx2Gg0F3zKaiZv5dBIuG49ZhvE3GlDG4PHB4,4880
29
- aiohomematic/model/calculated/__init__.py,sha256=hzVYpyyXWUIf0skSLTrOhaczVg6mCDpPg1KJsRGWukE,2734
28
+ aiohomematic/model/update.py,sha256=7fTkDwjX3J8R0sK3GhQku1poyJodRqxv_ZCihyZvHig,5028
29
+ aiohomematic/model/calculated/__init__.py,sha256=vvBAPphiZPnc-ZTIRJ0M4VsDPdxVqQWCA56p8AhAKIM,2731
30
30
  aiohomematic/model/calculated/climate.py,sha256=yu3mFBAO6Cb_r68v197uXseOl9P1jz7Dz0tUaCY-6FE,8436
31
- aiohomematic/model/calculated/data_point.py,sha256=-ZC10Iz5opXqs2nkiwerF3caMIMdWwS9fVwYYaagTE0,11268
31
+ aiohomematic/model/calculated/data_point.py,sha256=EVXclyuPqIWtyglk3NvCEB67nfW6P9CZumblSTSQe5M,11414
32
32
  aiohomematic/model/calculated/operating_voltage_level.py,sha256=F09jW2rFtjxrsR25xkN-uZxJAdw_dcDr8hv-xvTiBCs,13932
33
33
  aiohomematic/model/calculated/support.py,sha256=ht_KSFUT2Dze9wjw_o0Gp2-PGo4on0W0CZujhCWzwIk,6019
34
34
  aiohomematic/model/custom/__init__.py,sha256=6-jN7l6DPIUSCANw15SwNQFyL8aXxn8Me8m8fNHkWKc,5987
35
35
  aiohomematic/model/custom/climate.py,sha256=Sd3KofB1G085bKK1JKB7k4uaySD3W4SKbw-Fg9FH0PU,53930
36
36
  aiohomematic/model/custom/const.py,sha256=ifJgooQqo43qEqfPQTIcyY7IcUeFvM0-y4WvP-_HgXM,4882
37
37
  aiohomematic/model/custom/cover.py,sha256=aU8sSdKnGuiPBAO73GtmOMcYLoU7VmFldBxDf601dII,27474
38
- aiohomematic/model/custom/data_point.py,sha256=jpDpQlZs2iYeI4dms1kkhzAMa__f9Dacvf93E6ad5xs,13843
38
+ aiohomematic/model/custom/data_point.py,sha256=moms_MQiX4DYGDhDGVF-epIA_OiB9t4WvjPpWx1R7P4,14030
39
39
  aiohomematic/model/custom/definition.py,sha256=VQ8dROZSAVu-CarYc2jN_KrlvGI1kjhwUqD0ZR1qTUA,35402
40
40
  aiohomematic/model/custom/light.py,sha256=IGT98GlqRftNzZpFP8NR_aQG_EQHyr191O5xkcpVaz4,43843
41
41
  aiohomematic/model/custom/lock.py,sha256=6_xOeUFfVRJh_BjTY6RVLaCVmIozQo-uUMrbDqASt8g,11858
@@ -53,25 +53,25 @@ aiohomematic/model/generic/select.py,sha256=-DUuavyD7-CicNZboA_kAV4kBN6w7mtoP_5S
53
53
  aiohomematic/model/generic/sensor.py,sha256=dMjI0RSKIl6xI1VnTPFJe5HCUdfOKtfAXHLtX0Hwoiw,2171
54
54
  aiohomematic/model/generic/switch.py,sha256=bzJKvLmGN7yBoWSTZCjiXRnq2sBduKvRVGohBGrjKSE,1757
55
55
  aiohomematic/model/generic/text.py,sha256=ig-ilSa6CFlf65Sopg-E5jC9rK0Ma1vs2nzBxdprIpQ,772
56
- aiohomematic/model/hub/__init__.py,sha256=3LTVY_pPKdJsHBDx8BFzV0nQwDM9zDU-7JqSlsPU_Wg,13492
56
+ aiohomematic/model/hub/__init__.py,sha256=yTX2dLRMdVxyMMpbhDCf5ge6LisWWFUctWcusQsi3zE,13414
57
57
  aiohomematic/model/hub/binary_sensor.py,sha256=MG75YRZAkLOCs8ZVj2kr-EFgUte4v6dV_C3vdqZ-4jU,670
58
58
  aiohomematic/model/hub/button.py,sha256=3NWWQDjsQ4aIi3WGOVTWNi8Ry2shsvmqdgLNF6SvOGg,810
59
- aiohomematic/model/hub/data_point.py,sha256=44AXesJ6X9YGpNPDyDwHf6Z0VjB3thdgm040gILxxUc,10427
59
+ aiohomematic/model/hub/data_point.py,sha256=64fU-X9jaDx3ZHpzY1KfrFLbigNXus2muPMA6j4KLCw,10566
60
60
  aiohomematic/model/hub/number.py,sha256=auwUxR2J5rF_ZKSKSDo4XSiZUcXJ0uYUiCJO94_vmQM,1145
61
61
  aiohomematic/model/hub/select.py,sha256=UTng9oNf7y-x-2wMnd7UL8rZ0goyH8GsfQhz8MJrw8o,1579
62
62
  aiohomematic/model/hub/sensor.py,sha256=q_QWbkt2rycHeJJ5hlBGJJg0-Rfum8vrLA8BoZZyGq4,1110
63
63
  aiohomematic/model/hub/switch.py,sha256=W5iGOgL4A8BWFw5_rEYcfxyRVCnXIYy5tYt5sbpShCg,1312
64
64
  aiohomematic/model/hub/text.py,sha256=LGgFQNHgXreCIzMe3j21KFiOjliLv5a0xJrnUb1_P9k,908
65
- aiohomematic/rega_scripts/fetch_all_device_data.fn,sha256=GX9GDjWCfMgEPN6uP9RHD75IppcMth5NmRqVsQWUYJ4,3168
65
+ aiohomematic/rega_scripts/fetch_all_device_data.fn,sha256=7uxhHoelAOsH6yYr1n1M1XwIRgDmItiHnWIMhDYEimk,4373
66
66
  aiohomematic/rega_scripts/get_program_descriptions.fn,sha256=pGmj377MkqbZi6j-UBKQAsXTphwh1kDwDKqXij8zUBE,835
67
67
  aiohomematic/rega_scripts/get_serial.fn,sha256=t1oeo-sB_EuVeiY24PLcxFSkdQVgEWGXzpemJQZFybY,1079
68
68
  aiohomematic/rega_scripts/get_system_variable_descriptions.fn,sha256=UKXvC0_5lSApdQ2atJc0E5Stj5Zt3lqh0EcliokYu2c,849
69
69
  aiohomematic/rega_scripts/set_program_state.fn,sha256=0bnv7lUj8FMjDZBz325tDVP61m04cHjVj4kIOnUUgpY,279
70
70
  aiohomematic/rega_scripts/set_system_variable.fn,sha256=sTmr7vkPTPnPkor5cnLKlDvfsYRbGO1iq2z_2pMXq5E,383
71
- aiohomematic-2025.8.7.dist-info/licenses/LICENSE,sha256=cKEF-xEwJKQt28HpA6ppSzyqUJ6QF9g5OLacWMCuz8s,1078
71
+ aiohomematic-2025.8.9.dist-info/licenses/LICENSE,sha256=cKEF-xEwJKQt28HpA6ppSzyqUJ6QF9g5OLacWMCuz8s,1078
72
72
  aiohomematic_support/__init__.py,sha256=_0YtF4lTdC_k6-zrM2IefI0u0LMr_WA61gXAyeGLgbY,66
73
73
  aiohomematic_support/client_local.py,sha256=cvkO3tcxSJKy5ZLVdeqDbvSmeottxqZJNI4ccdxIVD4,12524
74
- aiohomematic-2025.8.7.dist-info/METADATA,sha256=7xFvDIMiRUkngGNYu4imUy23MU0Z58e6lIN4ZohRKxA,3249
75
- aiohomematic-2025.8.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
- aiohomematic-2025.8.7.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
77
- aiohomematic-2025.8.7.dist-info/RECORD,,
74
+ aiohomematic-2025.8.9.dist-info/METADATA,sha256=OWbH-zT7kqxp3hOk74OZ-TcyV8m_hLqzpCuvajxlCwg,3249
75
+ aiohomematic-2025.8.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
+ aiohomematic-2025.8.9.dist-info/top_level.txt,sha256=5TDRlUWQPThIUwQjOj--aUo4UA-ow4m0sNhnoCBi5n8,34
77
+ aiohomematic-2025.8.9.dist-info/RECORD,,