Skip to content

Commit

Permalink
Fix usage of master dps for bidcos climate devices (#2021)
Browse files Browse the repository at this point in the history
  • Loading branch information
SukramJ authored Jan 28, 2025
1 parent 5733c3f commit 2754b82
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 23 deletions.
2 changes: 2 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Version 2025.1.18 (2025-01-28)

- Add WEEK_PROGRAM_POINTER for bidcos climate devices
- Define schedule_channel_address for HM schedule usage
- Fix usage of master dps for bidcos climate devices

# Version 2025.1.17 (2025-01-26)

Expand Down
15 changes: 7 additions & 8 deletions hahomematic/caches/visibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,21 @@
Parameter.TEMPERATURE_MAXIMUM,
Parameter.TEMPERATURE_MINIMUM,
Parameter.TEMPERATURE_OFFSET,
Parameter.WEEK_PROGRAM_POINTER,
)

_RELEVANT_MASTER_PARAMSETS_BY_DEVICE: Final[Mapping[str, tuple[tuple[int | None, ...], tuple[Parameter, ...]]]] = {
"ALPHA-IP-RBG": ((1,), _CLIMATE_MASTER_PARAMETERS),
"HM-CC-RT-DN": (
(
None,
1,
),
(None,),
_CLIMATE_MASTER_PARAMETERS,
),
"HM-CC-VG-1": (
(
None,
1,
),
(None,),
_CLIMATE_MASTER_PARAMETERS,
),
"HM-TC-IT-WM-W-EU": (
(None,),
_CLIMATE_MASTER_PARAMETERS,
),
"HmIP-BWTH": ((1, 8), _CLIMATE_MASTER_PARAMETERS),
Expand Down
1 change: 1 addition & 0 deletions hahomematic/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,7 @@ class Parameter(StrEnum):
UPDATE_PENDING = "UPDATE_PENDING"
VALVE_STATE = "VALVE_STATE"
VOLTAGE = "VOLTAGE"
WEEK_PROGRAM_POINTER = "WEEK_PROGRAM_POINTER"
WIND_DIRECTION = "WIND_DIRECTION"
WIND_DIRECTION_RANGE = "WIND_DIRECTION_RANGE"
WIND_SPEED = "WIND_SPEED"
Expand Down
3 changes: 3 additions & 0 deletions hahomematic/model/custom/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,9 @@ def _init_data_point_fields(self) -> None:
self._dp_valve_state: DpSensor[int | None] = self._get_data_point(
field=Field.VALVE_STATE, data_point_type=DpSensor[int | None]
)
self._dp_week_program_pointer: DpSelect = self._get_data_point(
field=Field.WEEK_PROGRAM_POINTER, data_point_type=DpSelect
)

@state_property
def activity(self) -> ClimateActivity | None:
Expand Down
1 change: 1 addition & 0 deletions hahomematic/model/custom/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,4 @@ class Field(Enum):
TEMPERATURE_OFFSET = "temperature_offset"
VALVE_STATE = "valve_state"
VOLTAGE = "voltage"
WEEK_PROGRAM_POINTER = "week_program_pointer"
39 changes: 26 additions & 13 deletions hahomematic/model/custom/definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

_SCHEMA_FIELD_DETAILS = vol.Schema({vol.Required(Field): Parameter})

_SCHEMA_FIELD = vol.Schema({vol.Required(int): _SCHEMA_FIELD_DETAILS})
_SCHEMA_FIELD = vol.Schema({vol.Required(vol.Any(int, None)): _SCHEMA_FIELD_DETAILS})

_SCHEMA_DEVICE_GROUP = vol.Schema(
{
Expand Down Expand Up @@ -482,11 +482,16 @@
Field.CONTROL_MODE: Parameter.CONTROL_MODE,
Field.LOWERING_MODE: Parameter.LOWERING_MODE,
Field.MANU_MODE: Parameter.MANU_MODE,
Field.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE: Parameter.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE,
Field.SETPOINT: Parameter.SET_TEMPERATURE,
Field.TEMPERATURE_MAXIMUM: Parameter.TEMPERATURE_MAXIMUM,
Field.TEMPERATURE_MINIMUM: Parameter.TEMPERATURE_MINIMUM,
Field.TEMPERATURE_OFFSET: Parameter.TEMPERATURE_OFFSET,
},
CDPD.FIELDS: {
None: {
Field.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE: Parameter.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE,
Field.TEMPERATURE_MAXIMUM: Parameter.TEMPERATURE_MAXIMUM,
Field.TEMPERATURE_MINIMUM: Parameter.TEMPERATURE_MINIMUM,
Field.TEMPERATURE_OFFSET: Parameter.TEMPERATURE_OFFSET,
Field.WEEK_PROGRAM_POINTER: Parameter.WEEK_PROGRAM_POINTER,
}
},
CDPD.VISIBLE_REPEATABLE_FIELDS: {
Field.HUMIDITY: Parameter.ACTUAL_HUMIDITY,
Expand All @@ -508,17 +513,22 @@
Field.CONTROL_MODE: Parameter.CONTROL_MODE,
Field.LOWERING_MODE: Parameter.LOWERING_MODE,
Field.MANU_MODE: Parameter.MANU_MODE,
Field.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE: Parameter.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE,
Field.SETPOINT: Parameter.SET_TEMPERATURE,
Field.TEMPERATURE_MAXIMUM: Parameter.TEMPERATURE_MAXIMUM,
Field.TEMPERATURE_MINIMUM: Parameter.TEMPERATURE_MINIMUM,
Field.TEMPERATURE_OFFSET: Parameter.TEMPERATURE_OFFSET,
},
CDPD.FIELDS: {
None: {
Field.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE: Parameter.MIN_MAX_VALUE_NOT_RELEVANT_FOR_MANU_MODE,
Field.TEMPERATURE_MAXIMUM: Parameter.TEMPERATURE_MAXIMUM,
Field.TEMPERATURE_MINIMUM: Parameter.TEMPERATURE_MINIMUM,
Field.TEMPERATURE_OFFSET: Parameter.TEMPERATURE_OFFSET,
Field.WEEK_PROGRAM_POINTER: Parameter.WEEK_PROGRAM_POINTER,
}
},
CDPD.VISIBLE_REPEATABLE_FIELDS: {
Field.HUMIDITY: Parameter.ACTUAL_HUMIDITY,
Field.TEMPERATURE: Parameter.ACTUAL_TEMPERATURE,
},
CDPD.FIELDS: {
CDPD.VISIBLE_FIELDS: {
0: {
Field.VALVE_STATE: Parameter.VALVE_STATE,
},
Expand Down Expand Up @@ -716,12 +726,15 @@ def _get_device_group(device_profile: DeviceProfile, base_channel_no: int | None

def _rebase_data_point_dict(
data_point_dict: CDPD, group: Mapping[CDPD, Any], base_channel_no: int
) -> Mapping[int, Any]:
) -> Mapping[int | None, Any]:
"""Rebase data_point_dict with base_channel_no."""
new_fields = {}
new_fields: dict[int | None, Any] = {}
if fields := group.get(data_point_dict):
for channel_no, field in fields.items():
new_fields[channel_no + base_channel_no] = field
if channel_no is None:
new_fields[channel_no] = field
else:
new_fields[channel_no + base_channel_no] = field
return new_fields


Expand Down
4 changes: 2 additions & 2 deletions tests/test_central_pydevccu.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,15 +131,15 @@ async def test_central_full(central_unit_full) -> None:
) as fptr:
fptr.write(orjson.dumps(addresses, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS))

assert usage_types[DataPointUsage.NO_CREATE] == 4150
assert usage_types[DataPointUsage.NO_CREATE] == 4156
assert usage_types[DataPointUsage.CDP_PRIMARY] == 261
assert usage_types[DataPointUsage.DATA_POINT] == 3765
assert usage_types[DataPointUsage.CDP_VISIBLE] == 133
assert usage_types[DataPointUsage.CDP_SECONDARY] == 154

assert len(ce_channels) == 124
assert len(data_point_types) == 6
assert len(parameters) == 227
assert len(parameters) == 228

assert len(central_unit_full._devices) == 386
virtual_remotes = ["VCU4264293", "VCU0000057", "VCU0000001"]
Expand Down
1 change: 1 addition & 0 deletions tests/test_climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
"VCU5778428": "HmIP-HEATING.json",
"VCU0000054": "HM-CC-TC.json",
"VCU0000050": "HM-CC-RT-DN.json",
"VCU0000341": "HM-TC-IT-WM-W-EU.json",
}

# pylint: disable=protected-access
Expand Down

0 comments on commit 2754b82

Please sign in to comment.