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

@@ -2168,7 +2168,7 @@ class CentralConnectionState:
2168
2168
  return True
2169
2169
  if isinstance(issuer, BaseRpcProxy) and iid not in self._rpc_proxy_issues:
2170
2170
  self._rpc_proxy_issues.append(iid)
2171
- _LOGGER.debug("add_issue: add issue [%s] for %s", iid, issuer.interface_id)
2171
+ _LOGGER.debug("add_issue: add issue [%s] for RpcProxy", iid)
2172
2172
  return True
2173
2173
  return False
2174
2174
 
@@ -2178,9 +2178,9 @@ class CentralConnectionState:
2178
2178
  self._json_issues.remove(iid)
2179
2179
  _LOGGER.debug("remove_issue: removing issue [%s] for JsonRpcAioHttpClient", iid)
2180
2180
  return True
2181
- if isinstance(issuer, BaseRpcProxy) and issuer.interface_id in self._rpc_proxy_issues:
2181
+ if isinstance(issuer, BaseRpcProxy) and iid in self._rpc_proxy_issues:
2182
2182
  self._rpc_proxy_issues.remove(iid)
2183
- _LOGGER.debug("remove_issue: removing issue [%s] for %s", iid, issuer.interface_id)
2183
+ _LOGGER.debug("remove_issue: removing issue [%s] for RpcProxy", iid)
2184
2184
  return True
2185
2185
  return False
2186
2186
 
@@ -2188,7 +2188,7 @@ class CentralConnectionState:
2188
2188
  """Add issue to collection."""
2189
2189
  if isinstance(issuer, AioJsonRpcAioHttpClient):
2190
2190
  return iid in self._json_issues
2191
- if isinstance(issuer, (BaseRpcProxy)):
2191
+ if isinstance(issuer, BaseRpcProxy):
2192
2192
  return iid in self._rpc_proxy_issues
2193
2193
 
2194
2194
  def handle_exception_log(
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.25"
22
+ VERSION: Final = "2025.11.0"
23
23
 
24
24
  # Detect test speedup mode via environment
25
25
  _TEST_SPEEDUP: Final = (
@@ -191,6 +191,24 @@ class CalulatedParameter(StrEnum):
191
191
  VAPOR_CONCENTRATION = "VAPOR_CONCENTRATION"
192
192
 
193
193
 
194
+ class CDPD(StrEnum):
195
+ """Enum for custom data point definitions."""
196
+
197
+ ADDITIONAL_DPS = "additional_dps"
198
+ ALLOW_UNDEFINED_GENERIC_DPS = "allow_undefined_generic_dps"
199
+ DEFAULT_DPS = "default_dps"
200
+ DEVICE_DEFINITIONS = "device_definitions"
201
+ DEVICE_GROUP = "device_group"
202
+ FIELDS = "fields"
203
+ INCLUDE_DEFAULT_DPS = "include_default_dps"
204
+ PRIMARY_CHANNEL = "primary_channel"
205
+ REPEATABLE_FIELDS = "repeatable_fields"
206
+ SECONDARY_CHANNELS = "secondary_channels"
207
+ STATE_CHANNEL = "state_channel"
208
+ VISIBLE_FIELDS = "visible_fields"
209
+ VISIBLE_REPEATABLE_FIELDS = "visible_repeatable_fields"
210
+
211
+
194
212
  class CentralUnitState(StrEnum):
195
213
  """Enum with central unit states."""
196
214
 
@@ -209,13 +227,6 @@ class CommandRxMode(StrEnum):
209
227
  WAKEUP = "WAKEUP"
210
228
 
211
229
 
212
- class InternalCustomID(StrEnum):
213
- """Enum for Homematic internal custom IDs."""
214
-
215
- DEFAULT = "cid_default"
216
- MANU_TEMP = "cid_manu_temp"
217
-
218
-
219
230
  class DataOperationResult(Enum):
220
231
  """Enum with data operation results."""
221
232
 
@@ -256,6 +267,15 @@ class DataPointCategory(StrEnum):
256
267
  VALVE = "valve"
257
268
 
258
269
 
270
+ class DataPointKey(NamedTuple):
271
+ """Key for data points."""
272
+
273
+ interface_id: str
274
+ channel_address: str
275
+ paramset_key: ParamsetKey
276
+ parameter: str
277
+
278
+
259
279
  class DataPointUsage(StrEnum):
260
280
  """Enum with usage information."""
261
281
 
@@ -292,6 +312,41 @@ class DeviceFirmwareState(StrEnum):
292
312
  BACKGROUND_UPDATE_NOT_SUPPORTED = "BACKGROUND_UPDATE_NOT_SUPPORTED"
293
313
 
294
314
 
315
+ class DeviceProfile(StrEnum):
316
+ """Enum for device profiles."""
317
+
318
+ IP_BUTTON_LOCK = "IPButtonLock"
319
+ IP_COVER = "IPCover"
320
+ IP_DIMMER = "IPDimmer"
321
+ IP_DRG_DALI = "IPDRGDALI"
322
+ IP_FIXED_COLOR_LIGHT = "IPFixedColorLight"
323
+ IP_GARAGE = "IPGarage"
324
+ IP_HDM = "IPHdm"
325
+ IP_IRRIGATION_VALVE = "IPIrrigationValve"
326
+ IP_LOCK = "IPLock"
327
+ IP_RGBW_LIGHT = "IPRGBW"
328
+ IP_SIMPLE_FIXED_COLOR_LIGHT = "IPSimpleFixedColorLight"
329
+ IP_SIMPLE_FIXED_COLOR_LIGHT_WIRED = "IPSimpleFixedColorLightWired"
330
+ IP_SIREN = "IPSiren"
331
+ IP_SIREN_SMOKE = "IPSirenSmoke"
332
+ IP_SWITCH = "IPSwitch"
333
+ IP_THERMOSTAT = "IPThermostat"
334
+ IP_THERMOSTAT_GROUP = "IPThermostatGroup"
335
+ RF_BUTTON_LOCK = "RFButtonLock"
336
+ RF_COVER = "RfCover"
337
+ RF_DIMMER = "RfDimmer"
338
+ RF_DIMMER_COLOR = "RfDimmer_Color"
339
+ RF_DIMMER_COLOR_FIXED = "RfDimmer_Color_Fixed"
340
+ RF_DIMMER_COLOR_TEMP = "RfDimmer_Color_Temp"
341
+ RF_DIMMER_WITH_VIRT_CHANNEL = "RfDimmerWithVirtChannel"
342
+ RF_LOCK = "RfLock"
343
+ RF_SIREN = "RfSiren"
344
+ RF_SWITCH = "RfSwitch"
345
+ RF_THERMOSTAT = "RfThermostat"
346
+ RF_THERMOSTAT_GROUP = "RfThermostatGroup"
347
+ SIMPLE_RF_THERMOSTAT = "SimpleRfThermostat"
348
+
349
+
295
350
  class EventKey(StrEnum):
296
351
  """Enum with aiohomematic event keys."""
297
352
 
@@ -320,6 +375,94 @@ class EventType(StrEnum):
320
375
  KEYPRESS = "homematic.keypress"
321
376
 
322
377
 
378
+ class Field(Enum):
379
+ """Enum for fields."""
380
+
381
+ ACOUSTIC_ALARM_ACTIVE = "acoustic_alarm_active"
382
+ ACOUSTIC_ALARM_SELECTION = "acoustic_alarm_selection"
383
+ ACTIVE_PROFILE = "active_profile"
384
+ AUTO_MODE = "auto_mode"
385
+ BOOST_MODE = "boost_mode"
386
+ BUTTON_LOCK = "button_lock"
387
+ CHANNEL_COLOR = "channel_color"
388
+ COLOR = "color"
389
+ COLOR_BEHAVIOUR = "color_behaviour"
390
+ COLOR_LEVEL = "color_temp"
391
+ COLOR_TEMPERATURE = "color_temperature"
392
+ COMBINED_PARAMETER = "combined_parameter"
393
+ COMFORT_MODE = "comfort_mode"
394
+ CONCENTRATION = "concentration"
395
+ CONTROL_MODE = "control_mode"
396
+ CURRENT = "current"
397
+ DEVICE_OPERATION_MODE = "device_operation_mode"
398
+ DIRECTION = "direction"
399
+ DOOR_COMMAND = "door_command"
400
+ DOOR_STATE = "door_state"
401
+ DURATION = "duration"
402
+ DURATION_UNIT = "duration_unit"
403
+ DUTYCYCLE = "dutycycle"
404
+ DUTY_CYCLE = "duty_cycle"
405
+ EFFECT = "effect"
406
+ ENERGY_COUNTER = "energy_counter"
407
+ ERROR = "error"
408
+ FREQUENCY = "frequency"
409
+ GROUP_LEVEL = "group_level"
410
+ GROUP_LEVEL_2 = "group_level_2"
411
+ GROUP_STATE = "group_state"
412
+ HEATING_COOLING = "heating_cooling"
413
+ HEATING_VALVE_TYPE = "heating_valve_type"
414
+ HUE = "hue"
415
+ HUMIDITY = "humidity"
416
+ INHIBIT = "inhibit"
417
+ LEVEL = "level"
418
+ LEVEL_2 = "level_2"
419
+ LEVEL_COMBINED = "level_combined"
420
+ LOCK_STATE = "lock_state"
421
+ LOCK_TARGET_LEVEL = "lock_target_level"
422
+ LOWBAT = "lowbat"
423
+ LOWERING_MODE = "lowering_mode"
424
+ LOW_BAT = "low_bat"
425
+ LOW_BAT_LIMIT = "low_bat_limit"
426
+ MANU_MODE = "manu_mode"
427
+ MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE = "min_max_value_not_relevant_for_manu_mode"
428
+ ON_TIME_UNIT = "on_time_unit"
429
+ ON_TIME_VALUE = "on_time_value"
430
+ OPEN = "open"
431
+ OPERATING_VOLTAGE = "operating_voltage"
432
+ OPERATION_MODE = "channel_operation_mode"
433
+ OPTICAL_ALARM_ACTIVE = "optical_alarm_active"
434
+ OPTICAL_ALARM_SELECTION = "optical_alarm_selection"
435
+ OPTIMUM_START_STOP = "optimum_start_stop"
436
+ PARTY_MODE = "party_mode"
437
+ POWER = "power"
438
+ PROGRAM = "program"
439
+ RAMP_TIME_TO_OFF_UNIT = "ramp_time_to_off_unit"
440
+ RAMP_TIME_TO_OFF_VALUE = "ramp_time_to_off_value"
441
+ RAMP_TIME_UNIT = "ramp_time_unit"
442
+ RAMP_TIME_VALUE = "ramp_time_value"
443
+ RSSI_DEVICE = "rssi_device"
444
+ RSSI_PEER = "rssi_peer"
445
+ SABOTAGE = "sabotage"
446
+ SATURATION = "saturation"
447
+ SECTION = "section"
448
+ SETPOINT = "setpoint"
449
+ SET_POINT_MODE = "set_point_mode"
450
+ SMOKE_DETECTOR_ALARM_STATUS = "smoke_detector_alarm_status"
451
+ SMOKE_DETECTOR_COMMAND = "smoke_detector_command"
452
+ STATE = "state"
453
+ STOP = "stop"
454
+ SWITCH_MAIN = "switch_main"
455
+ SWITCH_V1 = "vswitch_1"
456
+ SWITCH_V2 = "vswitch_2"
457
+ TEMPERATURE = "temperature"
458
+ TEMPERATURE_MAXIMUM = "temperature_maximum"
459
+ TEMPERATURE_MINIMUM = "temperature_minimum"
460
+ TEMPERATURE_OFFSET = "temperature_offset"
461
+ VALVE_STATE = "valve_state"
462
+ VOLTAGE = "voltage"
463
+ WEEK_PROGRAM_POINTER = "week_program_pointer"
464
+
465
+
323
466
  class Flag(IntEnum):
324
467
  """Enum with Homematic flags."""
325
468
 
@@ -338,6 +481,13 @@ class ForcedDeviceAvailability(StrEnum):
338
481
  NOT_SET = "not_set"
339
482
 
340
483
 
484
+ class InternalCustomID(StrEnum):
485
+ """Enum for Homematic internal custom IDs."""
486
+
487
+ DEFAULT = "cid_default"
488
+ MANU_TEMP = "cid_manu_temp"
489
+
490
+
341
491
  class Manufacturer(StrEnum):
342
492
  """Enum with aiohomematic system events."""
343
493
 
@@ -491,6 +641,7 @@ class ParamsetKey(StrEnum):
491
641
  """Enum with paramset keys."""
492
642
 
493
643
  CALCULATED = "CALCULATED"
644
+ DUMMY = "DUMMY"
494
645
  LINK = "LINK"
495
646
  MASTER = "MASTER"
496
647
  SERVICE = "SERVICE"
@@ -547,6 +698,19 @@ class InterfaceEventType(StrEnum):
547
698
  UNKNOWN_PONG = "unknown_pong"
548
699
 
549
700
 
701
+ class ParameterType(StrEnum):
702
+ """Enum for Homematic parameter types."""
703
+
704
+ ACTION = "ACTION" # Usually buttons, send Boolean to trigger
705
+ BOOL = "BOOL"
706
+ DUMMY = "DUMMY"
707
+ ENUM = "ENUM"
708
+ FLOAT = "FLOAT"
709
+ INTEGER = "INTEGER"
710
+ STRING = "STRING"
711
+ EMPTY = ""
712
+
713
+
550
714
  class ProxyInitState(Enum):
551
715
  """Enum with proxy handling results."""
552
716
 
@@ -557,6 +721,13 @@ class ProxyInitState(Enum):
557
721
  DE_INIT_SKIPPED = 16
558
722
 
559
723
 
724
+ class RpcServerType(StrEnum):
725
+ """Enum for Homematic rpc server types."""
726
+
727
+ XML_RPC = "xml_rpc"
728
+ NONE = "none"
729
+
730
+
560
731
  class RxMode(IntEnum):
561
732
  """Enum for Homematic rx modes."""
562
733
 
@@ -590,25 +761,6 @@ class SysvarType(StrEnum):
590
761
  STRING = "STRING"
591
762
 
592
763
 
593
- class ParameterType(StrEnum):
594
- """Enum for Homematic parameter types."""
595
-
596
- ACTION = "ACTION" # Usually buttons, send Boolean to trigger
597
- BOOL = "BOOL"
598
- ENUM = "ENUM"
599
- FLOAT = "FLOAT"
600
- INTEGER = "INTEGER"
601
- STRING = "STRING"
602
- EMPTY = ""
603
-
604
-
605
- class RpcServerType(StrEnum):
606
- """Enum for Homematic rpc server types."""
607
-
608
- XML_RPC = "xml_rpc"
609
- NONE = "none"
610
-
611
-
612
764
  CLICK_EVENTS: Final[frozenset[Parameter]] = frozenset(
613
765
  {
614
766
  Parameter.PRESS,
@@ -632,15 +784,6 @@ DATA_POINT_EVENTS: Final[frozenset[EventType]] = frozenset(
632
784
  )
633
785
 
634
786
 
635
- class DataPointKey(NamedTuple):
636
- """Key for data points."""
637
-
638
- interface_id: str
639
- channel_address: str
640
- paramset_key: ParamsetKey
641
- parameter: str
642
-
643
-
644
787
  type DP_KEY_VALUE = tuple[DataPointKey, Any]
645
788
  type SYSVAR_TYPE = bool | float | int | str | None
646
789
 
@@ -22,8 +22,8 @@ from aiohomematic.const import (
22
22
  )
23
23
  from aiohomematic.model import device as hmd
24
24
  from aiohomematic.model.custom import definition as hmed
25
- from aiohomematic.model.data_point import BaseDataPoint, NoneTypeDataPoint
26
- from aiohomematic.model.generic import data_point as hmge
25
+ from aiohomematic.model.data_point import BaseDataPoint
26
+ from aiohomematic.model.generic import DpDummy, data_point as hmge
27
27
  from aiohomematic.model.support import (
28
28
  DataPointNameData,
29
29
  DataPointPathData,
@@ -104,7 +104,7 @@ class CalculatedDataPoint[ParameterT: GenericParameterType](BaseDataPoint):
104
104
  return cast(data_point_type, generic_data_point) # type: ignore[valid-type]
105
105
  return cast(
106
106
  data_point_type, # type:ignore[valid-type]
107
- NoneTypeDataPoint(),
107
+ DpDummy(channel=self._channel, param_field=parameter),
108
108
  )
109
109
 
110
110
  def _add_device_data_point[DataPointT: hmge.GenericDataPoint](
@@ -126,7 +126,7 @@ class CalculatedDataPoint[ParameterT: GenericParameterType](BaseDataPoint):
126
126
  return cast(data_point_type, generic_data_point) # type: ignore[valid-type]
127
127
  return cast(
128
128
  data_point_type, # type:ignore[valid-type]
129
- NoneTypeDataPoint(),
129
+ DpDummy(channel=self._channel, param_field=parameter),
130
130
  )
131
131
 
132
132
  @property
@@ -15,6 +15,8 @@ from aiohomematic.const import (
15
15
  SCHEDULER_PROFILE_PATTERN,
16
16
  SCHEDULER_TIME_PATTERN,
17
17
  DataPointCategory,
18
+ DeviceProfile,
19
+ Field,
18
20
  InternalCustomID,
19
21
  Parameter,
20
22
  ParamsetKey,
@@ -24,7 +26,6 @@ from aiohomematic.decorators import inspector
24
26
  from aiohomematic.exceptions import ClientException, ValidationException
25
27
  from aiohomematic.model import device as hmd
26
28
  from aiohomematic.model.custom import definition as hmed
27
- from aiohomematic.model.custom.const import DeviceProfile, Field
28
29
  from aiohomematic.model.custom.data_point import CustomDataPoint
29
30
  from aiohomematic.model.custom.support import CustomConfig
30
31
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -10,11 +10,10 @@ from enum import IntEnum, StrEnum
10
10
  import logging
11
11
  from typing import Any, Final
12
12
 
13
- from aiohomematic.const import DataPointCategory, DataPointUsage, Parameter
13
+ from aiohomematic.const import DataPointCategory, DataPointUsage, DeviceProfile, Field, Parameter
14
14
  from aiohomematic.converter import convert_hm_level_to_cpv
15
15
  from aiohomematic.model import device as hmd
16
16
  from aiohomematic.model.custom import definition as hmed
17
- from aiohomematic.model.custom.const import DeviceProfile, Field
18
17
  from aiohomematic.model.custom.data_point import CustomDataPoint
19
18
  from aiohomematic.model.custom.support import CustomConfig, ExtendedConfig
20
19
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -9,13 +9,21 @@ from datetime import datetime
9
9
  import logging
10
10
  from typing import Any, Final, cast
11
11
 
12
- from aiohomematic.const import CALLBACK_TYPE, INIT_DATETIME, CallSource, DataPointKey, DataPointUsage
12
+ from aiohomematic.const import (
13
+ CALLBACK_TYPE,
14
+ CDPD,
15
+ INIT_DATETIME,
16
+ CallSource,
17
+ DataPointKey,
18
+ DataPointUsage,
19
+ DeviceProfile,
20
+ Field,
21
+ )
13
22
  from aiohomematic.model import device as hmd
14
23
  from aiohomematic.model.custom import definition as hmed
15
- from aiohomematic.model.custom.const import CDPD, DeviceProfile, Field
16
24
  from aiohomematic.model.custom.support import CustomConfig
17
- from aiohomematic.model.data_point import BaseDataPoint, NoneTypeDataPoint
18
- from aiohomematic.model.generic import data_point as hmge
25
+ from aiohomematic.model.data_point import BaseDataPoint
26
+ from aiohomematic.model.generic import DpDummy, data_point as hmge
19
27
  from aiohomematic.model.support import (
20
28
  DataPointNameData,
21
29
  DataPointPathData,
@@ -317,7 +325,7 @@ class CustomDataPoint(BaseDataPoint):
317
325
  return cast(data_point_type, dp) # type: ignore[valid-type]
318
326
  return cast(
319
327
  data_point_type, # type:ignore[valid-type]
320
- NoneTypeDataPoint(),
328
+ DpDummy(channel=self._channel, param_field=field),
321
329
  )
322
330
 
323
331
  def has_data_point_key(self, *, data_point_keys: set[DataPointKey]) -> bool:
@@ -12,10 +12,9 @@ from typing import Any, Final, cast
12
12
  import voluptuous as vol
13
13
 
14
14
  from aiohomematic import support as hms, validator as val
15
- from aiohomematic.const import DataPointCategory, Parameter
15
+ from aiohomematic.const import CDPD, DataPointCategory, DeviceProfile, Field, Parameter
16
16
  from aiohomematic.exceptions import AioHomematicException
17
17
  from aiohomematic.model import device as hmd
18
- from aiohomematic.model.custom.const import CDPD, DeviceProfile, Field
19
18
  from aiohomematic.model.custom.support import CustomConfig
20
19
  from aiohomematic.model.support import generate_unique_id
21
20
  from aiohomematic.support import extract_exc_args
@@ -9,10 +9,9 @@ from enum import IntEnum, StrEnum
9
9
  import math
10
10
  from typing import Any, Final, TypedDict, Unpack
11
11
 
12
- from aiohomematic.const import DataPointCategory, DataPointUsage, Parameter
12
+ from aiohomematic.const import DataPointCategory, DataPointUsage, DeviceProfile, Field, Parameter
13
13
  from aiohomematic.model import device as hmd
14
14
  from aiohomematic.model.custom import definition as hmed
15
- from aiohomematic.model.custom.const import DeviceProfile, Field
16
15
  from aiohomematic.model.custom.data_point import CustomDataPoint
17
16
  from aiohomematic.model.custom.support import CustomConfig, ExtendedConfig
18
17
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -8,10 +8,9 @@ from abc import abstractmethod
8
8
  from collections.abc import Mapping
9
9
  from enum import StrEnum
10
10
 
11
- from aiohomematic.const import DataPointCategory, Parameter
11
+ from aiohomematic.const import DataPointCategory, DeviceProfile, Field, Parameter
12
12
  from aiohomematic.model import device as hmd
13
13
  from aiohomematic.model.custom import definition as hmed
14
- from aiohomematic.model.custom.const import DeviceProfile, Field
15
14
  from aiohomematic.model.custom.data_point import CustomDataPoint
16
15
  from aiohomematic.model.custom.support import CustomConfig, ExtendedConfig
17
16
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -9,11 +9,10 @@ from collections.abc import Mapping
9
9
  from enum import StrEnum
10
10
  from typing import Final, TypedDict, Unpack
11
11
 
12
- from aiohomematic.const import DataPointCategory
12
+ from aiohomematic.const import DataPointCategory, DeviceProfile, Field
13
13
  from aiohomematic.exceptions import ValidationException
14
14
  from aiohomematic.model import device as hmd
15
15
  from aiohomematic.model.custom import definition as hmed
16
- from aiohomematic.model.custom.const import DeviceProfile, Field
17
16
  from aiohomematic.model.custom.data_point import CustomDataPoint
18
17
  from aiohomematic.model.custom.support import CustomConfig
19
18
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -7,8 +7,7 @@ from __future__ import annotations
7
7
  from collections.abc import Callable, Mapping
8
8
  from dataclasses import dataclass
9
9
 
10
- from aiohomematic.const import Parameter
11
- from aiohomematic.model.custom.const import Field
10
+ from aiohomematic.const import Field, Parameter
12
11
 
13
12
 
14
13
  @dataclass(frozen=True, kw_only=True, slots=True)
@@ -9,10 +9,9 @@ from enum import StrEnum
9
9
  import logging
10
10
  from typing import Any, Final
11
11
 
12
- from aiohomematic.const import DataPointCategory, Parameter
12
+ from aiohomematic.const import DataPointCategory, DeviceProfile, Field, Parameter
13
13
  from aiohomematic.model import device as hmd
14
14
  from aiohomematic.model.custom import definition as hmed
15
- from aiohomematic.model.custom.const import DeviceProfile, Field
16
15
  from aiohomematic.model.custom.data_point import CustomDataPoint
17
16
  from aiohomematic.model.custom.support import CustomConfig, ExtendedConfig
18
17
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -9,10 +9,9 @@ from enum import StrEnum
9
9
  import logging
10
10
  from typing import Any, Final
11
11
 
12
- from aiohomematic.const import DataPointCategory
12
+ from aiohomematic.const import DataPointCategory, DeviceProfile, Field
13
13
  from aiohomematic.model import device as hmd
14
14
  from aiohomematic.model.custom import definition as hmed
15
- from aiohomematic.model.custom.const import DeviceProfile, Field
16
15
  from aiohomematic.model.custom.data_point import CustomDataPoint
17
16
  from aiohomematic.model.custom.support import CustomConfig
18
17
  from aiohomematic.model.data_point import CallParameterCollector, bind_collector
@@ -1121,28 +1121,3 @@ def bind_collector(
1121
1121
  return bind_wrapper # type: ignore[return-value]
1122
1122
 
1123
1123
  return bind_decorator
1124
-
1125
-
1126
- class NoneTypeDataPoint:
1127
- """DataPoint to return an empty value."""
1128
-
1129
- default: Any = None
1130
- hmtype: Any = None
1131
- is_valid: bool = False
1132
- max: Any = None
1133
- min: Any = None
1134
- unit: Any = None
1135
- value: Any = None
1136
- values: tuple[Any, ...] = ()
1137
- visible: Any = None
1138
- channel_operation_mode: str | None = None
1139
- is_hmtype = False
1140
-
1141
- async def send_value(
1142
- self,
1143
- *,
1144
- value: Any,
1145
- collector: CallParameterCollector | None = None,
1146
- do_validate: bool = True,
1147
- ) -> None:
1148
- """Send value dummy method."""
@@ -69,6 +69,7 @@ from aiohomematic.model.generic.action import DpAction
69
69
  from aiohomematic.model.generic.binary_sensor import DpBinarySensor
70
70
  from aiohomematic.model.generic.button import DpButton
71
71
  from aiohomematic.model.generic.data_point import GenericDataPoint
72
+ from aiohomematic.model.generic.dummy import DpDummy
72
73
  from aiohomematic.model.generic.number import BaseDpNumber, DpFloat, DpInteger
73
74
  from aiohomematic.model.generic.select import DpSelect
74
75
  from aiohomematic.model.generic.sensor import DpSensor
@@ -81,6 +82,7 @@ __all__ = [
81
82
  "DpAction",
82
83
  "DpBinarySensor",
83
84
  "DpButton",
85
+ "DpDummy",
84
86
  "DpFloat",
85
87
  "DpInteger",
86
88
  "DpSelect",
@@ -34,7 +34,7 @@ class GenericDataPoint[ParameterT: GenericParameterType, InputParameterT: Generi
34
34
  __slots__ = ("_cached_usage",)
35
35
 
36
36
  _validate_state_change: bool = True
37
- is_hmtype: Final = True
37
+ is_hmtype: bool = True
38
38
 
39
39
  def __init__(
40
40
  self,
@@ -0,0 +1,147 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2021-2025
3
+ """
4
+ Dummy generic data point (backend-detached placeholder).
5
+
6
+ This class derives from `GenericDataPoint` but overrides all methods that would
7
+ normally interact with the backend so it behaves like an inert data point that
8
+ uses safe default values only.
9
+ The DpDummy class is intended to be used as a placeholder for custom data
10
+ points that are not implemented in the backend.
11
+
12
+ Key properties:
13
+ - It never triggers backend I/O (no reads, no writes, no subscriptions).
14
+ - It always reports `usage = DataPointUsage.NO_CREATE` so it is not created as a
15
+ real entity.
16
+ - It is not readable or writable and does not require polling nor support
17
+ events.
18
+ - It exposes safe, static defaults for metadata and state.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from datetime import datetime
24
+ from typing import Any, cast
25
+
26
+ from aiohomematic.const import (
27
+ DP_KEY_VALUE,
28
+ INIT_DATETIME,
29
+ CallSource,
30
+ DataPointKey,
31
+ DataPointUsage,
32
+ Field,
33
+ ParameterData,
34
+ ParameterType,
35
+ ParamsetKey,
36
+ )
37
+ from aiohomematic.model import device as hmd
38
+ from aiohomematic.model.data_point import CallParameterCollector
39
+ from aiohomematic.model.generic.data_point import GenericDataPoint
40
+ from aiohomematic.model.support import DataPointNameData
41
+
42
+
43
+ class DpDummy(GenericDataPoint[Any, Any]):
44
+ """
45
+ Backend-detached `GenericDataPoint` using only default values.
46
+
47
+ All backend-touching operations are overridden to be no-ops.
48
+ """
49
+
50
+ __slots__ = ()
51
+
52
+ is_hmtype = False
53
+
54
+ def __init__(self, *, channel: hmd.Channel, param_field: str | Field) -> None:
55
+ """
56
+ Initialize the dummy data point.
57
+
58
+ We still call `super().__init__` to get a valid object layout, but all
59
+ runtime behavior that would contact the backend is disabled via
60
+ overrides below.
61
+ """
62
+
63
+ super().__init__(
64
+ channel=channel,
65
+ paramset_key=ParamsetKey.DUMMY,
66
+ parameter=f"DUMMY-{str(param_field)}",
67
+ parameter_data=ParameterData(
68
+ DEFAULT=None,
69
+ FLAGS=0,
70
+ ID="0",
71
+ MAX=None,
72
+ MIN=None,
73
+ OPERATIONS=0,
74
+ SPECIAL={},
75
+ TYPE=ParameterType.DUMMY,
76
+ UNIT="",
77
+ VALUE_LIST=(),
78
+ ),
79
+ )
80
+
81
+ # --- Metadata and identity -------------------------------------------
82
+ @property
83
+ def usage(self) -> DataPointUsage:
84
+ """Never create/ expose this data point as a real entity."""
85
+ return DataPointUsage.NO_CREATE
86
+
87
+ @property
88
+ def requires_polling(self) -> bool:
89
+ """Never poll from this data point."""
90
+ return False
91
+
92
+ @property
93
+ def state_uncertain(self) -> bool:
94
+ """Never report state uncertainty for this data point."""
95
+ return True
96
+
97
+ @property
98
+ def modified_at(self) -> datetime:
99
+ """Never report modification timestamp for this data point."""
100
+ return INIT_DATETIME
101
+
102
+ @property
103
+ def refreshed_at(self) -> datetime:
104
+ """Never report refresh timestamp for this data point."""
105
+ return INIT_DATETIME
106
+
107
+ @property
108
+ def dpk(self) -> DataPointKey:
109
+ """Return a stable placeholder data point key."""
110
+ # Return a stable placeholder key so equality/set operations are safe.
111
+ return cast(DataPointKey, ("", "", ""))
112
+
113
+ @property
114
+ def value(self) -> Any:
115
+ """Return the value of the data_point."""
116
+ return None
117
+
118
+ # Optional: provide a stable, recognizable name to aid debugging
119
+ def _get_data_point_name(self) -> DataPointNameData:
120
+ """Return a stable, recognizable name to aid debugging."""
121
+ name = super()._get_data_point_name()
122
+ # Replace parameter part with a dummy marker without touching address
123
+ return DataPointNameData(
124
+ device_name=f"DUMMY_{name.name}",
125
+ channel_name=f"DUMMY_{name.full_name}",
126
+ parameter_name=f"DUMMY_{name.parameter_name}",
127
+ )
128
+
129
+ # --- Backend interactions (all no-ops) --------------------------------
130
+ async def event(self, *, value: Any, received_at: datetime) -> None:
131
+ """Ignore backend events entirely."""
132
+ return
133
+
134
+ async def load_data_point_value(self, *, call_source: CallSource, direct_call: bool = False) -> None:
135
+ """Do not read from backend; keep defaults as-is."""
136
+ return
137
+
138
+ async def send_value(
139
+ self,
140
+ *,
141
+ value: Any,
142
+ collector: CallParameterCollector | None = None,
143
+ collector_order: int = 50,
144
+ do_validate: bool = True,
145
+ ) -> set[DP_KEY_VALUE]:
146
+ """Do not write to backend; accept but perform no operation."""
147
+ return set()
@@ -14,6 +14,7 @@ from typing import Any, Final
14
14
  from aiohomematic import central as hmcu
15
15
  from aiohomematic.const import (
16
16
  ADDRESS_SEPARATOR,
17
+ CDPD,
17
18
  PROGRAM_ADDRESS,
18
19
  PROGRAM_SET_PATH_ROOT,
19
20
  PROGRAM_STATE_PATH_ROOT,
@@ -32,7 +33,6 @@ from aiohomematic.const import (
32
33
  ParameterType,
33
34
  )
34
35
  from aiohomematic.model import device as hmd
35
- from aiohomematic.model.custom.const import CDPD
36
36
  from aiohomematic.support import to_bool
37
37
 
38
38
  __all__ = [
@@ -49,6 +49,7 @@ import orjson
49
49
  from slugify import slugify
50
50
 
51
51
  from aiohomematic import central as hmcu
52
+ from aiohomematic.async_support import loop_check
52
53
  from aiohomematic.const import (
53
54
  ADDRESS_SEPARATOR,
54
55
  FILE_DEVICES,
@@ -977,10 +978,11 @@ def _now() -> int:
977
978
  return int(datetime.now(tz=UTC).timestamp())
978
979
 
979
980
 
980
- async def cleanup_files(*, central_name: str, storage_directory: str) -> None:
981
+ @loop_check
982
+ def cleanup_files(*, central_name: str, storage_directory: str) -> None:
981
983
  """Clean up the used files."""
982
984
  loop = asyncio.get_running_loop()
983
985
  cache_dir = _get_file_path(storage_directory=storage_directory, sub_directory=SUB_DIRECTORY_CACHE)
984
- loop.call_soon_threadsafe(delete_file, cache_dir, f"{central_name}*.json".lower())
986
+ loop.run_in_executor(None, delete_file, cache_dir, f"{central_name}*.json".lower())
985
987
  session_dir = _get_file_path(storage_directory=storage_directory, sub_directory=SUB_DIRECTORY_SESSION)
986
- loop.call_soon_threadsafe(delete_file, session_dir, f"{central_name}*.json".lower())
988
+ loop.run_in_executor(None, delete_file, session_dir, f"{central_name}*.json".lower())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiohomematic
3
- Version: 2025.10.25
3
+ Version: 2025.11.0
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=Uo9CIoil0Arl3GwtgMZAwM8jhcgoBKcZEgj8cXYlswY,2258
2
2
  aiohomematic/async_support.py,sha256=Fg6RLD7Irt1mTwXbLkfphJbfd7oU_Svhp23i3Bb4Q7k,8762
3
- aiohomematic/const.py,sha256=qS6qjW8szpJYt1hudHJG7zokHp_PjoO1-u65Z5-TsXU,27482
3
+ aiohomematic/const.py,sha256=6qiR3_-TOCSYez2gifBu0CeeEciol_7D4CmXj_5C0lc,32278
4
4
  aiohomematic/context.py,sha256=hGE-iPcPt21dY-1MZar-Hyh9YaKL-VS42xjrulIVyRQ,429
5
5
  aiohomematic/converter.py,sha256=FiHU71M5RZ7N5FXJYh2CN14s63-PM-SHdb0cJ_CLx54,3602
6
6
  aiohomematic/decorators.py,sha256=cSW0aF3PzrW_qW6H0sjRNH9eqO8ysqhXZDgJ2OJTZM4,11038
@@ -10,7 +10,7 @@ aiohomematic/property_decorators.py,sha256=v8O_6hW5plpD1-Cmhbb-6t_RfAl8wD4TskWt7
10
10
  aiohomematic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  aiohomematic/support.py,sha256=F8jiuRgw3Dn7v2kPBvFTHFGI4nJzybd3eQIQEK4Y6XI,21056
12
12
  aiohomematic/validator.py,sha256=qX5janicu4jLrAVzKoyWgXe1XU4EOjk5-QhNFL4awTQ,3541
13
- aiohomematic/central/__init__.py,sha256=UmPIumAjMLCfkbaMic_jvdH2V1feP0uqcsdS9ji14jo,96600
13
+ aiohomematic/central/__init__.py,sha256=m3LqORD2BHr_SjhVd53Ge_DMKpJR_VYqNtFFw1oyxbA,96552
14
14
  aiohomematic/central/decorators.py,sha256=ja0d5MujL-Kfv399XIPRgiUxeyf67HwNWAuD7nmFJzg,6902
15
15
  aiohomematic/central/rpc_server.py,sha256=EhvBy8oMjBTR8MvH5QXo3lvlsCNJrvu6B85_CAg6sG8,10742
16
16
  aiohomematic/client/__init__.py,sha256=TYeVOGNVsGSCoaL1v9z1F8Sfx-Aq7zzz-yComAnnh8E,74365
@@ -18,33 +18,33 @@ aiohomematic/client/_rpc_errors.py,sha256=IaYjX60mpBJ43gDCJjuUSVraamy5jXHTRjOnut
18
18
  aiohomematic/client/json_rpc.py,sha256=82uVldmvNEB_F9BA_2oA55UmThRJRW2wRTPbcJiBvQg,51580
19
19
  aiohomematic/client/rpc_proxy.py,sha256=Am-MTLCVtQDPm2AOjVy1Bb4uulwdV2J6172SQRjdbso,11844
20
20
  aiohomematic/model/__init__.py,sha256=gUYa8ROWSbXjZTWUTmINZ1bbYAxGkVpA-onxaJN2Iso,5436
21
- aiohomematic/model/data_point.py,sha256=PqxMmKDqpUpkPO48WxNC5xeC9dPso5u8lQcKxwjusnw,41578
21
+ aiohomematic/model/data_point.py,sha256=oPS48r-saBHs1_gZ6XRAwTZv3Bes8Ad1FVapu8BLavM,41005
22
22
  aiohomematic/model/device.py,sha256=gK-4truXJMNJcU6vCIW7xV2rYHsrRCLtyM89xS2-g5I,52884
23
23
  aiohomematic/model/event.py,sha256=iyRW5569nttjGUa9iBeLHACviwVims2HiXrQFEz259M,6849
24
- aiohomematic/model/support.py,sha256=MQJVuE1C043VRs7t7Ld7kZ1quMmIDNXjzwNKW1LQtEs,19622
24
+ aiohomematic/model/support.py,sha256=vDQyVsiHy6Xhm_VXtqFQPm65A7qkDHSkzt-qoxDbu8I,19583
25
25
  aiohomematic/model/update.py,sha256=R3uUA61m-UQNNGkRod3vES66AgkPKay_CPyyrd-nqVI,5140
26
26
  aiohomematic/model/calculated/__init__.py,sha256=JNtxK4-XZeyR6MxfKVPdcF6ezQliQYTWEDoeOChumaE,2966
27
27
  aiohomematic/model/calculated/climate.py,sha256=rm9b4rCrmsZAA5_dzP6YRtahdveI97581_EnC4utqpg,10499
28
- aiohomematic/model/calculated/data_point.py,sha256=1LluGPB4YHfyC7gAXEBYi2Hqg9SP8Z_WCz3HLGJxNe0,11506
28
+ aiohomematic/model/calculated/data_point.py,sha256=Pyo66uOkKVJ3aA5_TjDpiLJIVjAuUQx1o7Ot-YI8h0A,11564
29
29
  aiohomematic/model/calculated/operating_voltage_level.py,sha256=99A8HvahVS4IxpgK1dsgQXHfeubU7JI2c0ObagbnSNQ,13505
30
30
  aiohomematic/model/calculated/support.py,sha256=GBD35_OR3TEAWo5ADeH_gk2Ebw9pHOtOnOS7umCkXB0,7989
31
31
  aiohomematic/model/custom/__init__.py,sha256=JxJXyr2CgKlj-jc1xQ14lbMT76vvswfLUecwj8RJCXA,6073
32
- aiohomematic/model/custom/climate.py,sha256=OnkZKxJKInrP52Tqu_hPcDDZbyL0wTMaIjWuBJ3th_k,57292
33
- aiohomematic/model/custom/const.py,sha256=s4iqhwvt8x41h4-CtMCyXwryGHuBNbhBrcJ5zGVRFJU,4939
34
- aiohomematic/model/custom/cover.py,sha256=KQzLEoPkKgZ2oi2oblUrGReQnT_0WAuseWAxu_xH5_Y,29035
35
- aiohomematic/model/custom/data_point.py,sha256=c0R7r6uAAZjxW01eUmmeHEe9doKtZYwZfUJbspMLjEM,14102
36
- aiohomematic/model/custom/definition.py,sha256=lZX7nSFxbXL0SHCZQFpLBSs6NbVx8fNdDV6tPCHsy00,35759
37
- aiohomematic/model/custom/light.py,sha256=_WDRxjEG8pjFKEjs_8pFiIyCykPRdSfi7SULk7srccA,44426
38
- aiohomematic/model/custom/lock.py,sha256=iJY8jiJA_HRynpbeACEQ_kzwiXOfAaT2IcF1FbXc0xY,11974
39
- aiohomematic/model/custom/siren.py,sha256=iaCJuRWiQH-r_ckhPZGRfmzxI8PddBBA5z_Jo78f1qI,9763
40
- aiohomematic/model/custom/support.py,sha256=FPhC3kp7blJu4jWHWAmXUXv4JWJu5nhQkrr8dyYxFas,1431
41
- aiohomematic/model/custom/switch.py,sha256=u4zbda4MFz_rmyuIvTgQC6Gi1XDWvX5EsOhP2NiQy38,6941
42
- aiohomematic/model/custom/valve.py,sha256=K42YSlG6610reWo3S6lo070WvEN2InVA8MsMpXltRLs,4220
43
- aiohomematic/model/generic/__init__.py,sha256=-4yben7G-QKBWMWpusrLkGo65a4IXIPYoiGu49T_KMM,7653
32
+ aiohomematic/model/custom/climate.py,sha256=PTiFyd486bjop4Q-ZTjDcANJNA1HBMDGCvvVL86xWSc,57257
33
+ aiohomematic/model/custom/cover.py,sha256=28_TshEMiuusWsAMcNEvFWcqLNjAlxwMS1bLVmGTZjQ,28992
34
+ aiohomematic/model/custom/data_point.py,sha256=vaUcUjaHanWbTQlq1K-mhI2uM0vT-MzmkZibuerlDX8,14116
35
+ aiohomematic/model/custom/definition.py,sha256=N9ZcLT7uglBlsFU1ZQJcL94LFAZK23sm3kAxws3tNkM,35716
36
+ aiohomematic/model/custom/light.py,sha256=THyBdYRNzAMOH0VpCn3Ui9BJo-NtgLBWxXmTZrx_IY4,44383
37
+ aiohomematic/model/custom/lock.py,sha256=7GYRyLsGv6JkPKWFTfsTP8Xheb3TCo4LktqcZQXxJTQ,11931
38
+ aiohomematic/model/custom/siren.py,sha256=Qi1jd6kGskfgyQP7lrczN6KEaJ3V40Pf-DUNpTUwTPI,9720
39
+ aiohomematic/model/custom/support.py,sha256=t0HxBo-zXdW-ju6ROfY9SuB2uXKqV0jFej_4QTIsH7w,1388
40
+ aiohomematic/model/custom/switch.py,sha256=I1rWgQqljPtMtc7fYWfWPKDdoHDZHXxiCmu6Gxe_bw4,6898
41
+ aiohomematic/model/custom/valve.py,sha256=tAQ0V-eCJCAoEgO1LFzZD4_tvBVojM8VipmOGTyGqe0,4177
42
+ aiohomematic/model/generic/__init__.py,sha256=gx6ohi35PvIHsj8HK_fbftoT_JCmo6l10tzk-syMsZw,7721
44
43
  aiohomematic/model/generic/action.py,sha256=VDFCAkX0TkXV4xh3ya0AUIKnjOKF_rEobI6qdW5mAOQ,975
45
44
  aiohomematic/model/generic/binary_sensor.py,sha256=yABUafcBmPHLNAkdj_malYroBZc5UaunYLhmRtS2nGU,865
46
45
  aiohomematic/model/generic/button.py,sha256=3ahmj1BJZfdh6h6YV-urC8UwcKRp94QPOQtsF0fBI3Y,718
47
- aiohomematic/model/generic/data_point.py,sha256=eUOB8H-7PPKcjV8BKVPYlme519ppI1-odWslxQGcI-k,6062
46
+ aiohomematic/model/generic/data_point.py,sha256=sU_vnTiiprbWacODSRo0-CT4b7650rAXy-21uQXZ1V0,6061
47
+ aiohomematic/model/generic/dummy.py,sha256=HjvR_citnjnN1A7YToKdCSdbgB1072TK40sOWVC2nBw,4742
48
48
  aiohomematic/model/generic/number.py,sha256=WNu4EB_npDZ8f7RrCrab1g9KzRtG8dziUvNQApEKXYk,2656
49
49
  aiohomematic/model/generic/select.py,sha256=-CXHdvzwWGp74t5UVdIWOFhlcW7bf0hcuGriBl7EWXk,1516
50
50
  aiohomematic/model/generic/sensor.py,sha256=ueqXw9bkFFJeD_mer6idpMTGFg6rweDEUNOgqsF22NA,2240
@@ -67,11 +67,11 @@ aiohomematic/rega_scripts/set_program_state.fn,sha256=0bnv7lUj8FMjDZBz325tDVP61m
67
67
  aiohomematic/rega_scripts/set_system_variable.fn,sha256=sTmr7vkPTPnPkor5cnLKlDvfsYRbGO1iq2z_2pMXq5E,383
68
68
  aiohomematic/store/__init__.py,sha256=PHwF_tw_zL20ODwLywHgpOLWrghQo_BMZzeiQSXN1Fc,1081
69
69
  aiohomematic/store/dynamic.py,sha256=3i8oajVhfTeckAuOhwTyIxrd-eb1fl5VxEdK3NPfisw,22323
70
- aiohomematic/store/persistent.py,sha256=SBL8AhqUzpoPtJ50GkLYHwvRJS52fBWqNPjgvykxbY8,40233
70
+ aiohomematic/store/persistent.py,sha256=6ZcOxFJtl7cLCacuHMRVnTPxmrhT4uxTwzHiR_7Xm1g,40291
71
71
  aiohomematic/store/visibility.py,sha256=ZaqxN_FIsvpYZvCZWu0YSlWLtrFmAfUYILBYIXxPJZs,31622
72
- aiohomematic-2025.10.25.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
73
- aiohomematic-2025.10.25.dist-info/METADATA,sha256=I3qrHxmZ2K1HTKCLARxj444R9y0PrOuhhmJ4UavC8vM,7950
74
- aiohomematic-2025.10.25.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
- aiohomematic-2025.10.25.dist-info/entry_points.txt,sha256=tzk3wIE-hXNhLEiefCCDhIiRT7DYY9MePAwGw-kPmWI,57
76
- aiohomematic-2025.10.25.dist-info/top_level.txt,sha256=iGUvt1N-E72vKRq7Anpp62HwkQngStrUK0JfL1zj1TE,13
77
- aiohomematic-2025.10.25.dist-info/RECORD,,
72
+ aiohomematic-2025.11.0.dist-info/licenses/LICENSE,sha256=q-B0xpREuZuvKsmk3_iyVZqvZ-vJcWmzMZpeAd0RqtQ,1083
73
+ aiohomematic-2025.11.0.dist-info/METADATA,sha256=XCRP6iXQHgEx3a_xrI4qz1VCZJDShuC43ApdyjtLuhw,7949
74
+ aiohomematic-2025.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ aiohomematic-2025.11.0.dist-info/entry_points.txt,sha256=tzk3wIE-hXNhLEiefCCDhIiRT7DYY9MePAwGw-kPmWI,57
76
+ aiohomematic-2025.11.0.dist-info/top_level.txt,sha256=iGUvt1N-E72vKRq7Anpp62HwkQngStrUK0JfL1zj1TE,13
77
+ aiohomematic-2025.11.0.dist-info/RECORD,,
@@ -1,148 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (c) 2021-2025
3
- """Constants used by aiohomematic custom data points."""
4
-
5
- from __future__ import annotations
6
-
7
- from enum import Enum, StrEnum
8
-
9
-
10
- class DeviceProfile(StrEnum):
11
- """Enum for device profiles."""
12
-
13
- IP_BUTTON_LOCK = "IPButtonLock"
14
- IP_COVER = "IPCover"
15
- IP_DIMMER = "IPDimmer"
16
- IP_DRG_DALI = "IPDRGDALI"
17
- IP_FIXED_COLOR_LIGHT = "IPFixedColorLight"
18
- IP_GARAGE = "IPGarage"
19
- IP_HDM = "IPHdm"
20
- IP_IRRIGATION_VALVE = "IPIrrigationValve"
21
- IP_LOCK = "IPLock"
22
- IP_RGBW_LIGHT = "IPRGBW"
23
- IP_SIMPLE_FIXED_COLOR_LIGHT = "IPSimpleFixedColorLight"
24
- IP_SIMPLE_FIXED_COLOR_LIGHT_WIRED = "IPSimpleFixedColorLightWired"
25
- IP_SIREN = "IPSiren"
26
- IP_SIREN_SMOKE = "IPSirenSmoke"
27
- IP_SWITCH = "IPSwitch"
28
- IP_THERMOSTAT = "IPThermostat"
29
- IP_THERMOSTAT_GROUP = "IPThermostatGroup"
30
- RF_BUTTON_LOCK = "RFButtonLock"
31
- RF_COVER = "RfCover"
32
- RF_DIMMER = "RfDimmer"
33
- RF_DIMMER_COLOR = "RfDimmer_Color"
34
- RF_DIMMER_COLOR_FIXED = "RfDimmer_Color_Fixed"
35
- RF_DIMMER_COLOR_TEMP = "RfDimmer_Color_Temp"
36
- RF_DIMMER_WITH_VIRT_CHANNEL = "RfDimmerWithVirtChannel"
37
- RF_LOCK = "RfLock"
38
- RF_SIREN = "RfSiren"
39
- RF_SWITCH = "RfSwitch"
40
- RF_THERMOSTAT = "RfThermostat"
41
- RF_THERMOSTAT_GROUP = "RfThermostatGroup"
42
- SIMPLE_RF_THERMOSTAT = "SimpleRfThermostat"
43
-
44
-
45
- class CDPD(StrEnum):
46
- """Enum for custom data point definitions."""
47
-
48
- ADDITIONAL_DPS = "additional_dps"
49
- ALLOW_UNDEFINED_GENERIC_DPS = "allow_undefined_generic_dps"
50
- DEFAULT_DPS = "default_dps"
51
- DEVICE_DEFINITIONS = "device_definitions"
52
- DEVICE_GROUP = "device_group"
53
- FIELDS = "fields"
54
- INCLUDE_DEFAULT_DPS = "include_default_dps"
55
- PRIMARY_CHANNEL = "primary_channel"
56
- REPEATABLE_FIELDS = "repeatable_fields"
57
- SECONDARY_CHANNELS = "secondary_channels"
58
- STATE_CHANNEL = "state_channel"
59
- VISIBLE_FIELDS = "visible_fields"
60
- VISIBLE_REPEATABLE_FIELDS = "visible_repeatable_fields"
61
-
62
-
63
- class Field(Enum):
64
- """Enum for fields."""
65
-
66
- ACOUSTIC_ALARM_ACTIVE = "acoustic_alarm_active"
67
- ACOUSTIC_ALARM_SELECTION = "acoustic_alarm_selection"
68
- ACTIVE_PROFILE = "active_profile"
69
- AUTO_MODE = "auto_mode"
70
- BOOST_MODE = "boost_mode"
71
- BUTTON_LOCK = "button_lock"
72
- CHANNEL_COLOR = "channel_color"
73
- COLOR = "color"
74
- COLOR_BEHAVIOUR = "color_behaviour"
75
- COLOR_LEVEL = "color_temp"
76
- COLOR_TEMPERATURE = "color_temperature"
77
- COMBINED_PARAMETER = "combined_parameter"
78
- COMFORT_MODE = "comfort_mode"
79
- CONCENTRATION = "concentration"
80
- CONTROL_MODE = "control_mode"
81
- CURRENT = "current"
82
- DEVICE_OPERATION_MODE = "device_operation_mode"
83
- DIRECTION = "direction"
84
- DOOR_COMMAND = "door_command"
85
- DOOR_STATE = "door_state"
86
- DURATION = "duration"
87
- DURATION_UNIT = "duration_unit"
88
- DUTYCYCLE = "dutycycle"
89
- DUTY_CYCLE = "duty_cycle"
90
- EFFECT = "effect"
91
- ENERGY_COUNTER = "energy_counter"
92
- ERROR = "error"
93
- FREQUENCY = "frequency"
94
- GROUP_LEVEL = "group_level"
95
- GROUP_LEVEL_2 = "group_level_2"
96
- GROUP_STATE = "group_state"
97
- HEATING_COOLING = "heating_cooling"
98
- HEATING_VALVE_TYPE = "heating_valve_type"
99
- HUE = "hue"
100
- HUMIDITY = "humidity"
101
- INHIBIT = "inhibit"
102
- LEVEL = "level"
103
- LEVEL_2 = "level_2"
104
- LEVEL_COMBINED = "level_combined"
105
- LOCK_STATE = "lock_state"
106
- LOCK_TARGET_LEVEL = "lock_target_level"
107
- LOWBAT = "lowbat"
108
- LOWERING_MODE = "lowering_mode"
109
- LOW_BAT = "low_bat"
110
- LOW_BAT_LIMIT = "low_bat_limit"
111
- MANU_MODE = "manu_mode"
112
- MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE = "min_max_value_not_relevant_for_manu_mode"
113
- ON_TIME_UNIT = "on_time_unit"
114
- ON_TIME_VALUE = "on_time_value"
115
- OPEN = "open"
116
- OPERATING_VOLTAGE = "operating_voltage"
117
- OPERATION_MODE = "channel_operation_mode"
118
- OPTICAL_ALARM_ACTIVE = "optical_alarm_active"
119
- OPTICAL_ALARM_SELECTION = "optical_alarm_selection"
120
- OPTIMUM_START_STOP = "optimum_start_stop"
121
- PARTY_MODE = "party_mode"
122
- POWER = "power"
123
- PROGRAM = "program"
124
- RAMP_TIME_TO_OFF_UNIT = "ramp_time_to_off_unit"
125
- RAMP_TIME_TO_OFF_VALUE = "ramp_time_to_off_value"
126
- RAMP_TIME_UNIT = "ramp_time_unit"
127
- RAMP_TIME_VALUE = "ramp_time_value"
128
- RSSI_DEVICE = "rssi_device"
129
- RSSI_PEER = "rssi_peer"
130
- SABOTAGE = "sabotage"
131
- SATURATION = "saturation"
132
- SECTION = "section"
133
- SETPOINT = "setpoint"
134
- SET_POINT_MODE = "set_point_mode"
135
- SMOKE_DETECTOR_ALARM_STATUS = "smoke_detector_alarm_status"
136
- SMOKE_DETECTOR_COMMAND = "smoke_detector_command"
137
- STATE = "state"
138
- STOP = "stop"
139
- SWITCH_MAIN = "switch_main"
140
- SWITCH_V1 = "vswitch_1"
141
- SWITCH_V2 = "vswitch_2"
142
- TEMPERATURE = "temperature"
143
- TEMPERATURE_MAXIMUM = "temperature_maximum"
144
- TEMPERATURE_MINIMUM = "temperature_minimum"
145
- TEMPERATURE_OFFSET = "temperature_offset"
146
- VALVE_STATE = "valve_state"
147
- VOLTAGE = "voltage"
148
- WEEK_PROGRAM_POINTER = "week_program_pointer"