mirror of
https://github.com/home-assistant/core.git
synced 2026-02-05 06:45:57 +01:00
433 lines
13 KiB
Python
433 lines
13 KiB
Python
"""Select platform for Compit integration."""
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from compit_inext_api.consts import CompitParameter
|
|
|
|
from homeassistant.components.select import SelectEntity, SelectEntityDescription
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.device_registry import DeviceInfo
|
|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
|
|
|
from .const import DOMAIN, MANUFACTURER_NAME
|
|
from .coordinator import CompitConfigEntry, CompitDataUpdateCoordinator
|
|
|
|
PARALLEL_UPDATES = 0
|
|
|
|
|
|
@dataclass(frozen=True, kw_only=True)
|
|
class CompitDeviceDescription:
|
|
"""Class to describe a Compit device."""
|
|
|
|
name: str
|
|
"""Name of the device."""
|
|
|
|
parameters: dict[CompitParameter, SelectEntityDescription]
|
|
"""Parameters of the device."""
|
|
|
|
|
|
DESCRIPTIONS: dict[CompitParameter, SelectEntityDescription] = {
|
|
CompitParameter.LANGUAGE: SelectEntityDescription(
|
|
key=CompitParameter.LANGUAGE.value,
|
|
translation_key="language",
|
|
options=[
|
|
"polish",
|
|
"english",
|
|
],
|
|
),
|
|
CompitParameter.AEROKONFBYPASS: SelectEntityDescription(
|
|
key=CompitParameter.AEROKONFBYPASS.value,
|
|
translation_key="aero_by_pass",
|
|
options=[
|
|
"off",
|
|
"auto",
|
|
"on",
|
|
],
|
|
),
|
|
CompitParameter.NANO_MODE: SelectEntityDescription(
|
|
key=CompitParameter.NANO_MODE.value,
|
|
translation_key="nano_work_mode",
|
|
options=[
|
|
"manual_3",
|
|
"manual_2",
|
|
"manual_1",
|
|
"manual_0",
|
|
"schedule",
|
|
"christmas",
|
|
"out_of_home",
|
|
],
|
|
),
|
|
CompitParameter.R900_OPERATING_MODE: SelectEntityDescription(
|
|
key=CompitParameter.R900_OPERATING_MODE.value,
|
|
translation_key="operating_mode",
|
|
options=[
|
|
"disabled",
|
|
"eco",
|
|
"hybrid",
|
|
],
|
|
),
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE: SelectEntityDescription(
|
|
key=CompitParameter.SOLAR_COMP_OPERATING_MODE.value,
|
|
translation_key="solarcomp_operating_mode",
|
|
options=[
|
|
"auto",
|
|
"de_icing",
|
|
"holiday",
|
|
"disabled",
|
|
],
|
|
),
|
|
CompitParameter.R490_OPERATING_MODE: SelectEntityDescription(
|
|
key=CompitParameter.R490_OPERATING_MODE.value,
|
|
translation_key="operating_mode",
|
|
options=[
|
|
"disabled",
|
|
"eco",
|
|
"hybrid",
|
|
],
|
|
),
|
|
CompitParameter.WORK_MODE: SelectEntityDescription(
|
|
key=CompitParameter.WORK_MODE.value,
|
|
translation_key="work_mode",
|
|
options=[
|
|
"winter",
|
|
"summer",
|
|
"cooling",
|
|
],
|
|
),
|
|
CompitParameter.R470_OPERATING_MODE: SelectEntityDescription(
|
|
key=CompitParameter.R470_OPERATING_MODE.value,
|
|
translation_key="operating_mode",
|
|
options=[
|
|
"disabled",
|
|
"auto",
|
|
"eco",
|
|
],
|
|
),
|
|
CompitParameter.HEATING_SOURCE_OF_CORRECTION: SelectEntityDescription(
|
|
key=CompitParameter.HEATING_SOURCE_OF_CORRECTION.value,
|
|
translation_key="heating_source_of_correction",
|
|
options=[
|
|
"no_corrections",
|
|
"schedule",
|
|
"thermostat",
|
|
"nano_nr_1",
|
|
"nano_nr_2",
|
|
"nano_nr_3",
|
|
"nano_nr_4",
|
|
"nano_nr_5",
|
|
],
|
|
),
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1: SelectEntityDescription(
|
|
key=CompitParameter.BIOMAX_MIXER_MODE_ZONE_1.value,
|
|
translation_key="mixer_mode_zone",
|
|
options=[
|
|
"disabled",
|
|
"without_thermostat",
|
|
"schedule",
|
|
"thermostat",
|
|
"nano_nr_1",
|
|
"nano_nr_2",
|
|
"nano_nr_3",
|
|
"nano_nr_4",
|
|
"nano_nr_5",
|
|
],
|
|
translation_placeholders={"zone": "1"},
|
|
),
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_2: SelectEntityDescription(
|
|
key=CompitParameter.BIOMAX_MIXER_MODE_ZONE_2.value,
|
|
translation_key="mixer_mode_zone",
|
|
options=[
|
|
"disabled",
|
|
"without_thermostat",
|
|
"schedule",
|
|
"thermostat",
|
|
"nano_nr_1",
|
|
"nano_nr_2",
|
|
"nano_nr_3",
|
|
"nano_nr_4",
|
|
"nano_nr_5",
|
|
],
|
|
translation_placeholders={"zone": "2"},
|
|
),
|
|
CompitParameter.DHW_CIRCULATION_MODE: SelectEntityDescription(
|
|
key=CompitParameter.DHW_CIRCULATION_MODE.value,
|
|
translation_key="dhw_circulation",
|
|
options=[
|
|
"disabled",
|
|
"constant",
|
|
"schedule",
|
|
],
|
|
),
|
|
CompitParameter.BIOMAX_HEATING_SOURCE_OF_CORRECTION: SelectEntityDescription(
|
|
key=CompitParameter.BIOMAX_HEATING_SOURCE_OF_CORRECTION.value,
|
|
translation_key="heating_source_of_correction",
|
|
options=[
|
|
"disabled",
|
|
"no_corrections",
|
|
"schedule",
|
|
"thermostat",
|
|
"nano_nr_1",
|
|
"nano_nr_2",
|
|
"nano_nr_3",
|
|
"nano_nr_4",
|
|
"nano_nr_5",
|
|
],
|
|
),
|
|
CompitParameter.MIXER_MODE: SelectEntityDescription(
|
|
key=CompitParameter.MIXER_MODE.value,
|
|
translation_key="mixer_mode",
|
|
options=[
|
|
"no_corrections",
|
|
"schedule",
|
|
"thermostat",
|
|
"nano_nr_1",
|
|
"nano_nr_2",
|
|
"nano_nr_3",
|
|
"nano_nr_4",
|
|
"nano_nr_5",
|
|
],
|
|
),
|
|
CompitParameter.R480_OPERATING_MODE: SelectEntityDescription(
|
|
key=CompitParameter.R480_OPERATING_MODE.value,
|
|
translation_key="operating_mode",
|
|
options=[
|
|
"disabled",
|
|
"eco",
|
|
"hybrid",
|
|
],
|
|
),
|
|
CompitParameter.BUFFER_MODE: SelectEntityDescription(
|
|
key=CompitParameter.BUFFER_MODE.value,
|
|
translation_key="buffer_mode",
|
|
options=[
|
|
"schedule",
|
|
"manual",
|
|
"disabled",
|
|
],
|
|
),
|
|
}
|
|
|
|
|
|
DEVICE_DEFINITIONS: dict[int, CompitDeviceDescription] = {
|
|
223: CompitDeviceDescription(
|
|
name="Nano Color 2",
|
|
parameters={
|
|
CompitParameter.LANGUAGE: DESCRIPTIONS[CompitParameter.LANGUAGE],
|
|
CompitParameter.AEROKONFBYPASS: DESCRIPTIONS[
|
|
CompitParameter.AEROKONFBYPASS
|
|
],
|
|
},
|
|
),
|
|
12: CompitDeviceDescription(
|
|
name="Nano Color",
|
|
parameters={
|
|
CompitParameter.LANGUAGE: DESCRIPTIONS[CompitParameter.LANGUAGE],
|
|
CompitParameter.AEROKONFBYPASS: DESCRIPTIONS[
|
|
CompitParameter.AEROKONFBYPASS
|
|
],
|
|
},
|
|
),
|
|
7: CompitDeviceDescription(
|
|
name="Nano One",
|
|
parameters={
|
|
CompitParameter.LANGUAGE: DESCRIPTIONS[CompitParameter.LANGUAGE],
|
|
CompitParameter.NANO_MODE: DESCRIPTIONS[CompitParameter.NANO_MODE],
|
|
},
|
|
),
|
|
224: CompitDeviceDescription(
|
|
name="R 900",
|
|
parameters={
|
|
CompitParameter.R900_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.R900_OPERATING_MODE
|
|
],
|
|
},
|
|
),
|
|
45: CompitDeviceDescription(
|
|
name="SolarComp971",
|
|
parameters={
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE
|
|
],
|
|
},
|
|
),
|
|
99: CompitDeviceDescription(
|
|
name="SolarComp971C",
|
|
parameters={
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE
|
|
],
|
|
},
|
|
),
|
|
44: CompitDeviceDescription(
|
|
name="SolarComp 951",
|
|
parameters={
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.SOLAR_COMP_OPERATING_MODE
|
|
],
|
|
},
|
|
),
|
|
92: CompitDeviceDescription(
|
|
name="r490",
|
|
parameters={
|
|
CompitParameter.R490_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.R490_OPERATING_MODE
|
|
],
|
|
CompitParameter.WORK_MODE: DESCRIPTIONS[CompitParameter.WORK_MODE],
|
|
},
|
|
),
|
|
34: CompitDeviceDescription(
|
|
name="r470",
|
|
parameters={
|
|
CompitParameter.R470_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.R470_OPERATING_MODE
|
|
],
|
|
CompitParameter.HEATING_SOURCE_OF_CORRECTION: DESCRIPTIONS[
|
|
CompitParameter.HEATING_SOURCE_OF_CORRECTION
|
|
],
|
|
},
|
|
),
|
|
201: CompitDeviceDescription(
|
|
name="BioMax775",
|
|
parameters={
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1: DESCRIPTIONS[
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1
|
|
],
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_2: DESCRIPTIONS[
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_2
|
|
],
|
|
CompitParameter.DHW_CIRCULATION_MODE: DESCRIPTIONS[
|
|
CompitParameter.DHW_CIRCULATION_MODE
|
|
],
|
|
},
|
|
),
|
|
36: CompitDeviceDescription(
|
|
name="BioMax742",
|
|
parameters={
|
|
CompitParameter.BIOMAX_HEATING_SOURCE_OF_CORRECTION: DESCRIPTIONS[
|
|
CompitParameter.BIOMAX_HEATING_SOURCE_OF_CORRECTION
|
|
],
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1: DESCRIPTIONS[
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1
|
|
],
|
|
CompitParameter.DHW_CIRCULATION_MODE: DESCRIPTIONS[
|
|
CompitParameter.DHW_CIRCULATION_MODE
|
|
],
|
|
},
|
|
),
|
|
75: CompitDeviceDescription(
|
|
name="BioMax772",
|
|
parameters={
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1: DESCRIPTIONS[
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_1
|
|
],
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_2: DESCRIPTIONS[
|
|
CompitParameter.BIOMAX_MIXER_MODE_ZONE_2
|
|
],
|
|
CompitParameter.DHW_CIRCULATION_MODE: DESCRIPTIONS[
|
|
CompitParameter.DHW_CIRCULATION_MODE
|
|
],
|
|
},
|
|
),
|
|
5: CompitDeviceDescription(
|
|
name="R350 T3",
|
|
parameters={
|
|
CompitParameter.MIXER_MODE: DESCRIPTIONS[CompitParameter.MIXER_MODE],
|
|
},
|
|
),
|
|
215: CompitDeviceDescription(
|
|
name="R480",
|
|
parameters={
|
|
CompitParameter.R480_OPERATING_MODE: DESCRIPTIONS[
|
|
CompitParameter.R480_OPERATING_MODE
|
|
],
|
|
CompitParameter.BUFFER_MODE: DESCRIPTIONS[CompitParameter.BUFFER_MODE],
|
|
},
|
|
),
|
|
}
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: CompitConfigEntry,
|
|
async_add_devices: AddConfigEntryEntitiesCallback,
|
|
) -> None:
|
|
"""Set up Compit select entities from a config entry."""
|
|
|
|
coordinator = entry.runtime_data
|
|
select_entities = []
|
|
for device_id, device in coordinator.connector.all_devices.items():
|
|
device_definition = DEVICE_DEFINITIONS.get(device.definition.code)
|
|
|
|
if not device_definition:
|
|
continue
|
|
|
|
for code, entity_description in device_definition.parameters.items():
|
|
param = next(
|
|
(p for p in device.state.params if p.code == entity_description.key),
|
|
None,
|
|
)
|
|
|
|
if param is None:
|
|
continue
|
|
|
|
select_entities.append(
|
|
CompitSelect(
|
|
coordinator,
|
|
device_id,
|
|
device_definition.name,
|
|
code,
|
|
entity_description,
|
|
)
|
|
)
|
|
|
|
async_add_devices(select_entities)
|
|
|
|
|
|
class CompitSelect(CoordinatorEntity[CompitDataUpdateCoordinator], SelectEntity):
|
|
"""Representation of a Compit select entity."""
|
|
|
|
def __init__(
|
|
self,
|
|
coordinator: CompitDataUpdateCoordinator,
|
|
device_id: int,
|
|
device_name: str,
|
|
parameter_code: CompitParameter,
|
|
entity_description: SelectEntityDescription,
|
|
) -> None:
|
|
"""Initialize the select entity."""
|
|
super().__init__(coordinator)
|
|
self.device_id = device_id
|
|
self.entity_description = entity_description
|
|
self._attr_has_entity_name = True
|
|
self._attr_unique_id = f"{device_id}_{entity_description.key}"
|
|
self._attr_device_info = DeviceInfo(
|
|
identifiers={(DOMAIN, str(device_id))},
|
|
name=device_name,
|
|
manufacturer=MANUFACTURER_NAME,
|
|
model=device_name,
|
|
)
|
|
self.parameter_code = parameter_code
|
|
|
|
@property
|
|
def available(self) -> bool:
|
|
"""Return if entity is available."""
|
|
return (
|
|
super().available
|
|
and self.coordinator.connector.get_device(self.device_id) is not None
|
|
)
|
|
|
|
@property
|
|
def current_option(self) -> str | None:
|
|
"""Return the current option."""
|
|
return self.coordinator.connector.get_current_option(
|
|
self.device_id, self.parameter_code
|
|
)
|
|
|
|
async def async_select_option(self, option: str) -> None:
|
|
"""Change the selected option."""
|
|
await self.coordinator.connector.select_device_option(
|
|
self.device_id, self.parameter_code, option
|
|
)
|
|
self.async_write_ha_state()
|