core/homeassistant/components/lamarzocco/select.py

120 lines
3.7 KiB
Python

"""Select platform for La Marzocco espresso machines."""
from collections.abc import Callable, Coroutine
from dataclasses import dataclass
from typing import Any
from lmcloud.const import MachineModel, PrebrewMode, SteamLevel
from lmcloud.lm_machine import LaMarzoccoMachine
from lmcloud.models import LaMarzoccoMachineConfig
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import LaMarzoccoConfigEntry
from .entity import LaMarzoccoEntity, LaMarzoccoEntityDescription
STEAM_LEVEL_HA_TO_LM = {
"1": SteamLevel.LEVEL_1,
"2": SteamLevel.LEVEL_2,
"3": SteamLevel.LEVEL_3,
}
STEAM_LEVEL_LM_TO_HA = {
SteamLevel.LEVEL_1: "1",
SteamLevel.LEVEL_2: "2",
SteamLevel.LEVEL_3: "3",
}
PREBREW_MODE_HA_TO_LM = {
"disabled": PrebrewMode.DISABLED,
"prebrew": PrebrewMode.PREBREW,
"preinfusion": PrebrewMode.PREINFUSION,
}
PREBREW_MODE_LM_TO_HA = {
PrebrewMode.DISABLED: "disabled",
PrebrewMode.PREBREW: "prebrew",
PrebrewMode.PREINFUSION: "preinfusion",
}
@dataclass(frozen=True, kw_only=True)
class LaMarzoccoSelectEntityDescription(
LaMarzoccoEntityDescription,
SelectEntityDescription,
):
"""Description of a La Marzocco select entity."""
current_option_fn: Callable[[LaMarzoccoMachineConfig], str]
select_option_fn: Callable[[LaMarzoccoMachine, str], Coroutine[Any, Any, bool]]
ENTITIES: tuple[LaMarzoccoSelectEntityDescription, ...] = (
LaMarzoccoSelectEntityDescription(
key="steam_temp_select",
translation_key="steam_temp_select",
options=["1", "2", "3"],
select_option_fn=lambda machine, option: machine.set_steam_level(
STEAM_LEVEL_HA_TO_LM[option]
),
current_option_fn=lambda config: STEAM_LEVEL_LM_TO_HA[config.steam_level],
supported_fn=lambda coordinator: coordinator.device.model
== MachineModel.LINEA_MICRA,
),
LaMarzoccoSelectEntityDescription(
key="prebrew_infusion_select",
translation_key="prebrew_infusion_select",
entity_category=EntityCategory.CONFIG,
options=["disabled", "prebrew", "preinfusion"],
select_option_fn=lambda machine, option: machine.set_prebrew_mode(
PREBREW_MODE_HA_TO_LM[option]
),
current_option_fn=lambda config: PREBREW_MODE_LM_TO_HA[config.prebrew_mode],
supported_fn=lambda coordinator: coordinator.device.model
in (
MachineModel.GS3_AV,
MachineModel.LINEA_MICRA,
MachineModel.LINEA_MINI,
),
),
)
async def async_setup_entry(
hass: HomeAssistant,
entry: LaMarzoccoConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up select entities."""
coordinator = entry.runtime_data
async_add_entities(
LaMarzoccoSelectEntity(coordinator, description)
for description in ENTITIES
if description.supported_fn(coordinator)
)
class LaMarzoccoSelectEntity(LaMarzoccoEntity, SelectEntity):
"""La Marzocco select entity."""
entity_description: LaMarzoccoSelectEntityDescription
@property
def current_option(self) -> str:
"""Return the current selected option."""
return str(
self.entity_description.current_option_fn(self.coordinator.device.config)
)
async def async_select_option(self, option: str) -> None:
"""Change the selected option."""
if option != self.current_option:
await self.entity_description.select_option_fn(
self.coordinator.device, option
)
self.async_write_ha_state()