mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
Home connect program select entities (#126157)
* Home connect selector for programs * Mark program switches as deprecated * Simplified translation keys * Improvements for program select entity * Revert mark program switches as deprecated * Return `None` if program is `None` or empty string * Fix program format * Use `is` instead of `==` * Program selector entity selects program instead of start the selected program * Fix typo * Active and selected program * Added ServiceValidationError * Delete unnecessary `service` param at tests * Use full program keys * Fix again typos in programs states * Use map for translations * Add error handling for when the selected program is not registered on the program map * Reverse map for programs and translation keys * Remove stale string * Log only once that the program is not part of the official Home Connect API specification * pop programs * Move `RE_CAMEL_CASE` to a better place * Added warning if updated program is not valid * Stale test function name * Improve log about unknown program at update * Add underscore before numbers in translation keys * Added suggested changes Co-authored-by: Martin Hjelmare <marhje52@gmail.com> * Use target for adding an executor job * Apply suggestions from code review * Clean whitespace --------- Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
parent
b2537a45e0
commit
c2d6599736
@ -4,6 +4,7 @@ from __future__ import annotations
|
||||
|
||||
from datetime import timedelta
|
||||
import logging
|
||||
import re
|
||||
from typing import Any, cast
|
||||
|
||||
from requests import HTTPError
|
||||
@ -44,6 +45,8 @@ type HomeConnectConfigEntry = ConfigEntry[api.ConfigEntryAuth]
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
RE_CAMEL_CASE = re.compile(r"(?<!^)(?=[A-Z])|(?=\d)(?<=\D)")
|
||||
|
||||
SCAN_INTERVAL = timedelta(minutes=1)
|
||||
|
||||
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
|
||||
@ -85,6 +88,7 @@ PLATFORMS = [
|
||||
Platform.BINARY_SENSOR,
|
||||
Platform.LIGHT,
|
||||
Platform.NUMBER,
|
||||
Platform.SELECT,
|
||||
Platform.SENSOR,
|
||||
Platform.SWITCH,
|
||||
Platform.TIME,
|
||||
@ -336,3 +340,14 @@ def get_dict_from_home_connect_error(err: api.HomeConnectError) -> dict[str, Any
|
||||
if len(err.args) > 0 and isinstance(err.args[0], str)
|
||||
else "?",
|
||||
}
|
||||
|
||||
|
||||
def bsh_key_to_translation_key(bsh_key: str) -> str:
|
||||
"""Convert a BSH key to a translation key format.
|
||||
|
||||
This function takes a BSH key, such as `Dishcare.Dishwasher.Program.Eco50`,
|
||||
and converts it to a translation key format, such as `dishcare_dishwasher_bsh_key_eco50`.
|
||||
"""
|
||||
return "_".join(
|
||||
RE_CAMEL_CASE.sub("_", split) for split in bsh_key.split(".")
|
||||
).lower()
|
||||
|
@ -5,10 +5,23 @@ DOMAIN = "home_connect"
|
||||
OAUTH2_AUTHORIZE = "https://api.home-connect.com/security/oauth/authorize"
|
||||
OAUTH2_TOKEN = "https://api.home-connect.com/security/oauth/token"
|
||||
|
||||
APPLIANCES_WITH_PROGRAMS = (
|
||||
"CleaningRobot",
|
||||
"CoffeeMaker",
|
||||
"Dishwasher",
|
||||
"Dryer",
|
||||
"Hood",
|
||||
"Oven",
|
||||
"WarmingDrawer",
|
||||
"Washer",
|
||||
"WasherDryer",
|
||||
)
|
||||
|
||||
BSH_POWER_STATE = "BSH.Common.Setting.PowerState"
|
||||
BSH_POWER_ON = "BSH.Common.EnumType.PowerState.On"
|
||||
BSH_POWER_OFF = "BSH.Common.EnumType.PowerState.Off"
|
||||
BSH_POWER_STANDBY = "BSH.Common.EnumType.PowerState.Standby"
|
||||
BSH_SELECTED_PROGRAM = "BSH.Common.Root.SelectedProgram"
|
||||
BSH_ACTIVE_PROGRAM = "BSH.Common.Root.ActiveProgram"
|
||||
BSH_REMOTE_CONTROL_ACTIVATION_STATE = "BSH.Common.Status.RemoteControlActive"
|
||||
BSH_REMOTE_START_ALLOWANCE_STATE = "BSH.Common.Status.RemoteControlStartAllowed"
|
||||
|
300
homeassistant/components/home_connect/select.py
Normal file
300
homeassistant/components/home_connect/select.py
Normal file
@ -0,0 +1,300 @@
|
||||
"""Provides a select platform for Home Connect."""
|
||||
|
||||
import contextlib
|
||||
import logging
|
||||
|
||||
from homeconnect.api import HomeConnectError
|
||||
|
||||
from homeassistant.components.select import SelectEntity, SelectEntityDescription
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import ServiceValidationError
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
||||
from . import (
|
||||
HomeConnectConfigEntry,
|
||||
bsh_key_to_translation_key,
|
||||
get_dict_from_home_connect_error,
|
||||
)
|
||||
from .api import HomeConnectDevice
|
||||
from .const import (
|
||||
APPLIANCES_WITH_PROGRAMS,
|
||||
ATTR_VALUE,
|
||||
BSH_ACTIVE_PROGRAM,
|
||||
BSH_SELECTED_PROGRAM,
|
||||
DOMAIN,
|
||||
)
|
||||
from .entity import HomeConnectEntity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
TRANSLATION_KEYS_PROGRAMS_MAP = {
|
||||
bsh_key_to_translation_key(program): program
|
||||
for program in (
|
||||
"ConsumerProducts.CleaningRobot.Program.Cleaning.CleanAll",
|
||||
"ConsumerProducts.CleaningRobot.Program.Cleaning.CleanMap",
|
||||
"ConsumerProducts.CleaningRobot.Program.Basic.GoHome",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.Ristretto",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.Espresso",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.EspressoDoppio",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.Coffee",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.XLCoffee",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.CaffeGrande",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.EspressoMacchiato",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.Cappuccino",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.LatteMacchiato",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.CaffeLatte",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.MilkFroth",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.WarmMilk",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.KleinerBrauner",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.GrosserBrauner",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Verlaengerter",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.VerlaengerterBraun",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.WienerMelange",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.FlatWhite",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Cortado",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.CafeCortado",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.CafeConLeche",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.CafeAuLait",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Doppio",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Kaapi",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.KoffieVerkeerd",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Galao",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Garoto",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Americano",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.RedEye",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.BlackEye",
|
||||
"ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.DeadEye",
|
||||
"ConsumerProducts.CoffeeMaker.Program.Beverage.HotWater",
|
||||
"Dishcare.Dishwasher.Program.PreRinse",
|
||||
"Dishcare.Dishwasher.Program.Auto1",
|
||||
"Dishcare.Dishwasher.Program.Auto2",
|
||||
"Dishcare.Dishwasher.Program.Auto3",
|
||||
"Dishcare.Dishwasher.Program.Eco50",
|
||||
"Dishcare.Dishwasher.Program.Quick45",
|
||||
"Dishcare.Dishwasher.Program.Intensiv70",
|
||||
"Dishcare.Dishwasher.Program.Normal65",
|
||||
"Dishcare.Dishwasher.Program.Glas40",
|
||||
"Dishcare.Dishwasher.Program.GlassCare",
|
||||
"Dishcare.Dishwasher.Program.NightWash",
|
||||
"Dishcare.Dishwasher.Program.Quick65",
|
||||
"Dishcare.Dishwasher.Program.Normal45",
|
||||
"Dishcare.Dishwasher.Program.Intensiv45",
|
||||
"Dishcare.Dishwasher.Program.AutoHalfLoad",
|
||||
"Dishcare.Dishwasher.Program.IntensivPower",
|
||||
"Dishcare.Dishwasher.Program.MagicDaily",
|
||||
"Dishcare.Dishwasher.Program.Super60",
|
||||
"Dishcare.Dishwasher.Program.Kurz60",
|
||||
"Dishcare.Dishwasher.Program.ExpressSparkle65",
|
||||
"Dishcare.Dishwasher.Program.MachineCare",
|
||||
"Dishcare.Dishwasher.Program.SteamFresh",
|
||||
"Dishcare.Dishwasher.Program.MaximumCleaning",
|
||||
"Dishcare.Dishwasher.Program.MixedLoad",
|
||||
"LaundryCare.Dryer.Program.Cotton",
|
||||
"LaundryCare.Dryer.Program.Synthetic",
|
||||
"LaundryCare.Dryer.Program.Mix",
|
||||
"LaundryCare.Dryer.Program.Blankets",
|
||||
"LaundryCare.Dryer.Program.BusinessShirts",
|
||||
"LaundryCare.Dryer.Program.DownFeathers",
|
||||
"LaundryCare.Dryer.Program.Hygiene",
|
||||
"LaundryCare.Dryer.Program.Jeans",
|
||||
"LaundryCare.Dryer.Program.Outdoor",
|
||||
"LaundryCare.Dryer.Program.SyntheticRefresh",
|
||||
"LaundryCare.Dryer.Program.Towels",
|
||||
"LaundryCare.Dryer.Program.Delicates",
|
||||
"LaundryCare.Dryer.Program.Super40",
|
||||
"LaundryCare.Dryer.Program.Shirts15",
|
||||
"LaundryCare.Dryer.Program.Pillow",
|
||||
"LaundryCare.Dryer.Program.AntiShrink",
|
||||
"LaundryCare.Dryer.Program.MyTime.MyDryingTime",
|
||||
"LaundryCare.Dryer.Program.TimeCold",
|
||||
"LaundryCare.Dryer.Program.TimeWarm",
|
||||
"LaundryCare.Dryer.Program.InBasket",
|
||||
"LaundryCare.Dryer.Program.TimeColdFix.TimeCold20",
|
||||
"LaundryCare.Dryer.Program.TimeColdFix.TimeCold30",
|
||||
"LaundryCare.Dryer.Program.TimeColdFix.TimeCold60",
|
||||
"LaundryCare.Dryer.Program.TimeWarmFix.TimeWarm30",
|
||||
"LaundryCare.Dryer.Program.TimeWarmFix.TimeWarm40",
|
||||
"LaundryCare.Dryer.Program.TimeWarmFix.TimeWarm60",
|
||||
"LaundryCare.Dryer.Program.Dessous",
|
||||
"Cooking.Common.Program.Hood.Automatic",
|
||||
"Cooking.Common.Program.Hood.Venting",
|
||||
"Cooking.Common.Program.Hood.DelayedShutOff",
|
||||
"Cooking.Oven.Program.HeatingMode.PreHeating",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAir",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAirEco",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAirGrilling",
|
||||
"Cooking.Oven.Program.HeatingMode.TopBottomHeating",
|
||||
"Cooking.Oven.Program.HeatingMode.TopBottomHeatingEco",
|
||||
"Cooking.Oven.Program.HeatingMode.BottomHeating",
|
||||
"Cooking.Oven.Program.HeatingMode.PizzaSetting",
|
||||
"Cooking.Oven.Program.HeatingMode.SlowCook",
|
||||
"Cooking.Oven.Program.HeatingMode.IntensiveHeat",
|
||||
"Cooking.Oven.Program.HeatingMode.KeepWarm",
|
||||
"Cooking.Oven.Program.HeatingMode.PreheatOvenware",
|
||||
"Cooking.Oven.Program.HeatingMode.FrozenHeatupSpecial",
|
||||
"Cooking.Oven.Program.HeatingMode.Desiccation",
|
||||
"Cooking.Oven.Program.HeatingMode.Defrost",
|
||||
"Cooking.Oven.Program.HeatingMode.Proof",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAir30Steam",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAir60Steam",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAir80Steam",
|
||||
"Cooking.Oven.Program.HeatingMode.HotAir100Steam",
|
||||
"Cooking.Oven.Program.HeatingMode.SabbathProgramme",
|
||||
"Cooking.Oven.Program.Microwave90Watt",
|
||||
"Cooking.Oven.Program.Microwave180Watt",
|
||||
"Cooking.Oven.Program.Microwave360Watt",
|
||||
"Cooking.Oven.Program.Microwave600Watt",
|
||||
"Cooking.Oven.Program.Microwave900Watt",
|
||||
"Cooking.Oven.Program.Microwave1000Watt",
|
||||
"Cooking.Oven.Program.Microwave.Max",
|
||||
"Cooking.Oven.Program.HeatingMode.WarmingDrawer",
|
||||
"LaundryCare.Washer.Program.Cotton",
|
||||
"LaundryCare.Washer.Program.Cotton.CottonEco",
|
||||
"LaundryCare.Washer.Program.Cotton.Eco4060",
|
||||
"LaundryCare.Washer.Program.Cotton.Colour",
|
||||
"LaundryCare.Washer.Program.EasyCare",
|
||||
"LaundryCare.Washer.Program.Mix",
|
||||
"LaundryCare.Washer.Program.Mix.NightWash",
|
||||
"LaundryCare.Washer.Program.DelicatesSilk",
|
||||
"LaundryCare.Washer.Program.Wool",
|
||||
"LaundryCare.Washer.Program.Sensitive",
|
||||
"LaundryCare.Washer.Program.Auto30",
|
||||
"LaundryCare.Washer.Program.Auto40",
|
||||
"LaundryCare.Washer.Program.Auto60",
|
||||
"LaundryCare.Washer.Program.Chiffon",
|
||||
"LaundryCare.Washer.Program.Curtains",
|
||||
"LaundryCare.Washer.Program.DarkWash",
|
||||
"LaundryCare.Washer.Program.Dessous",
|
||||
"LaundryCare.Washer.Program.Monsoon",
|
||||
"LaundryCare.Washer.Program.Outdoor",
|
||||
"LaundryCare.Washer.Program.PlushToy",
|
||||
"LaundryCare.Washer.Program.ShirtsBlouses",
|
||||
"LaundryCare.Washer.Program.SportFitness",
|
||||
"LaundryCare.Washer.Program.Towels",
|
||||
"LaundryCare.Washer.Program.WaterProof",
|
||||
"LaundryCare.Washer.Program.PowerSpeed59",
|
||||
"LaundryCare.Washer.Program.Super153045.Super15",
|
||||
"LaundryCare.Washer.Program.Super153045.Super1530",
|
||||
"LaundryCare.Washer.Program.DownDuvet.Duvet",
|
||||
"LaundryCare.Washer.Program.Rinse.RinseSpinDrain",
|
||||
"LaundryCare.Washer.Program.DrumClean",
|
||||
"LaundryCare.WasherDryer.Program.Cotton",
|
||||
"LaundryCare.WasherDryer.Program.Cotton.Eco4060",
|
||||
"LaundryCare.WasherDryer.Program.Mix",
|
||||
"LaundryCare.WasherDryer.Program.EasyCare",
|
||||
"LaundryCare.WasherDryer.Program.WashAndDry60",
|
||||
"LaundryCare.WasherDryer.Program.WashAndDry90",
|
||||
)
|
||||
}
|
||||
|
||||
PROGRAMS_TRANSLATION_KEYS_MAP = {
|
||||
value: key for key, value in TRANSLATION_KEYS_PROGRAMS_MAP.items()
|
||||
}
|
||||
|
||||
PROGRAM_SELECT_ENTITY_DESCRIPTIONS = (
|
||||
SelectEntityDescription(
|
||||
key=BSH_ACTIVE_PROGRAM,
|
||||
translation_key="active_program",
|
||||
),
|
||||
SelectEntityDescription(
|
||||
key=BSH_SELECTED_PROGRAM,
|
||||
translation_key="selected_program",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
hass: HomeAssistant,
|
||||
entry: HomeConnectConfigEntry,
|
||||
async_add_entities: AddEntitiesCallback,
|
||||
) -> None:
|
||||
"""Set up the Home Connect select entities."""
|
||||
|
||||
def get_entities() -> list[HomeConnectProgramSelectEntity]:
|
||||
"""Get a list of entities."""
|
||||
entities: list[HomeConnectProgramSelectEntity] = []
|
||||
programs_not_found = set()
|
||||
for device in entry.runtime_data.devices:
|
||||
if device.appliance.type in APPLIANCES_WITH_PROGRAMS:
|
||||
with contextlib.suppress(HomeConnectError):
|
||||
programs = device.appliance.get_programs_available()
|
||||
if programs:
|
||||
for program in programs:
|
||||
if program not in PROGRAMS_TRANSLATION_KEYS_MAP:
|
||||
programs.remove(program)
|
||||
if program not in programs_not_found:
|
||||
_LOGGER.info(
|
||||
'The program "%s" is not part of the official Home Connect API specification',
|
||||
program,
|
||||
)
|
||||
programs_not_found.add(program)
|
||||
entities.extend(
|
||||
HomeConnectProgramSelectEntity(device, programs, desc)
|
||||
for desc in PROGRAM_SELECT_ENTITY_DESCRIPTIONS
|
||||
)
|
||||
return entities
|
||||
|
||||
async_add_entities(await hass.async_add_executor_job(get_entities), True)
|
||||
|
||||
|
||||
class HomeConnectProgramSelectEntity(HomeConnectEntity, SelectEntity):
|
||||
"""Select class for Home Connect programs."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
device: HomeConnectDevice,
|
||||
programs: list[str],
|
||||
desc: SelectEntityDescription,
|
||||
) -> None:
|
||||
"""Initialize the entity."""
|
||||
super().__init__(
|
||||
device,
|
||||
desc,
|
||||
)
|
||||
self._attr_options = [
|
||||
PROGRAMS_TRANSLATION_KEYS_MAP[program] for program in programs
|
||||
]
|
||||
self.start_on_select = desc.key == BSH_ACTIVE_PROGRAM
|
||||
|
||||
async def async_update(self) -> None:
|
||||
"""Update the program selection status."""
|
||||
program = self.device.appliance.status.get(self.bsh_key, {}).get(ATTR_VALUE)
|
||||
if not program:
|
||||
program_translation_key = None
|
||||
elif not (
|
||||
program_translation_key := PROGRAMS_TRANSLATION_KEYS_MAP.get(program)
|
||||
):
|
||||
_LOGGER.debug(
|
||||
'The program "%s" is not part of the official Home Connect API specification',
|
||||
program,
|
||||
)
|
||||
self._attr_current_option = program_translation_key
|
||||
_LOGGER.debug("Updated, new program: %s", self._attr_current_option)
|
||||
|
||||
async def async_select_option(self, option: str) -> None:
|
||||
"""Select new program."""
|
||||
bsh_key = TRANSLATION_KEYS_PROGRAMS_MAP[option]
|
||||
_LOGGER.debug(
|
||||
"Starting program: %s" if self.start_on_select else "Selecting program: %s",
|
||||
bsh_key,
|
||||
)
|
||||
if self.start_on_select:
|
||||
target = self.device.appliance.start_program
|
||||
else:
|
||||
target = self.device.appliance.select_program
|
||||
try:
|
||||
await self.hass.async_add_executor_job(target, bsh_key)
|
||||
except HomeConnectError as err:
|
||||
if self.start_on_select:
|
||||
translation_key = "start_program"
|
||||
else:
|
||||
translation_key = "select_program"
|
||||
raise ServiceValidationError(
|
||||
translation_domain=DOMAIN,
|
||||
translation_key=translation_key,
|
||||
translation_placeholders={
|
||||
**get_dict_from_home_connect_error(err),
|
||||
"program": bsh_key,
|
||||
},
|
||||
) from err
|
||||
self.async_entity_update()
|
@ -46,6 +46,9 @@
|
||||
"turn_off": {
|
||||
"message": "Error while trying to turn off {entity_id} ({setting_key}): {description}"
|
||||
},
|
||||
"select_program": {
|
||||
"message": "Error while trying to select program {program}: {description}"
|
||||
},
|
||||
"start_program": {
|
||||
"message": "Error while trying to start program {program}: {description}"
|
||||
},
|
||||
@ -267,6 +270,326 @@
|
||||
"name": "Wine compartment 3 temperature"
|
||||
}
|
||||
},
|
||||
"select": {
|
||||
"selected_program": {
|
||||
"name": "Selected program",
|
||||
"state": {
|
||||
"consumer_products_cleaning_robot_program_cleaning_clean_all": "Clean all",
|
||||
"consumer_products_cleaning_robot_program_cleaning_clean_map": "Clean map",
|
||||
"consumer_products_cleaning_robot_program_basic_go_home": "Go home",
|
||||
"consumer_products_coffee_maker_program_beverage_ristretto": "Ristretto",
|
||||
"consumer_products_coffee_maker_program_beverage_espresso": "Espresso",
|
||||
"consumer_products_coffee_maker_program_beverage_espresso_doppio": "Espresso doppio",
|
||||
"consumer_products_coffee_maker_program_beverage_coffee": "Coffee",
|
||||
"consumer_products_coffee_maker_program_beverage_x_l_coffee": "XL coffee",
|
||||
"consumer_products_coffee_maker_program_beverage_caffe_grande": "Caffe grande",
|
||||
"consumer_products_coffee_maker_program_beverage_espresso_macchiato": "Espresso macchiato",
|
||||
"consumer_products_coffee_maker_program_beverage_cappuccino": "Cappuccino",
|
||||
"consumer_products_coffee_maker_program_beverage_latte_macchiato": "Latte macchiato",
|
||||
"consumer_products_coffee_maker_program_beverage_caffe_latte": "Caffe latte",
|
||||
"consumer_products_coffee_maker_program_beverage_milk_froth": "Milk froth",
|
||||
"consumer_products_coffee_maker_program_beverage_warm_milk": "Warm milk",
|
||||
"consumer_products_coffee_maker_program_coffee_world_kleiner_brauner": "Kleiner brauner",
|
||||
"consumer_products_coffee_maker_program_coffee_world_grosser_brauner": "Grosser brauner",
|
||||
"consumer_products_coffee_maker_program_coffee_world_verlaengerter": "Verlaengerter",
|
||||
"consumer_products_coffee_maker_program_coffee_world_verlaengerter_braun": "Verlaengerter braun",
|
||||
"consumer_products_coffee_maker_program_coffee_world_wiener_melange": "Wiener melange",
|
||||
"consumer_products_coffee_maker_program_coffee_world_flat_white": "Flat white",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cortado": "Cortado",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cafe_cortado": "Cafe cortado",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cafe_con_leche": "Cafe con leche",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cafe_au_lait": "Cafe au lait",
|
||||
"consumer_products_coffee_maker_program_coffee_world_doppio": "Doppio",
|
||||
"consumer_products_coffee_maker_program_coffee_world_kaapi": "Kaapi",
|
||||
"consumer_products_coffee_maker_program_coffee_world_koffie_verkeerd": "Koffie verkeerd",
|
||||
"consumer_products_coffee_maker_program_coffee_world_galao": "Galao",
|
||||
"consumer_products_coffee_maker_program_coffee_world_garoto": "Garoto",
|
||||
"consumer_products_coffee_maker_program_coffee_world_americano": "Americano",
|
||||
"consumer_products_coffee_maker_program_coffee_world_red_eye": "Red eye",
|
||||
"consumer_products_coffee_maker_program_coffee_world_black_eye": "Black eye",
|
||||
"consumer_products_coffee_maker_program_coffee_world_dead_eye": "Dead eye",
|
||||
"consumer_products_coffee_maker_program_beverage_hot_water": "Hot water",
|
||||
"dishcare_dishwasher_program_pre_rinse": "Pre_rinse",
|
||||
"dishcare_dishwasher_program_auto_1": "Auto 1",
|
||||
"dishcare_dishwasher_program_auto_2": "Auto 2",
|
||||
"dishcare_dishwasher_program_auto_3": "Auto 3",
|
||||
"dishcare_dishwasher_program_eco_50": "Eco 50ºC",
|
||||
"dishcare_dishwasher_program_quick_45": "Quick 45ºC",
|
||||
"dishcare_dishwasher_program_intensiv_70": "Intensive 70ºC",
|
||||
"dishcare_dishwasher_program_normal_65": "Normal 65ºC",
|
||||
"dishcare_dishwasher_program_glas_40": "Glass 40ºC",
|
||||
"dishcare_dishwasher_program_glass_care": "Glass care",
|
||||
"dishcare_dishwasher_program_night_wash": "Night wash",
|
||||
"dishcare_dishwasher_program_quick_65": "Quick 65ºC",
|
||||
"dishcare_dishwasher_program_normal_45": "Normal 45ºC",
|
||||
"dishcare_dishwasher_program_intensiv_45": "Intensive 45ºC",
|
||||
"dishcare_dishwasher_program_auto_half_load": "Auto half load",
|
||||
"dishcare_dishwasher_program_intensiv_power": "Intensive power",
|
||||
"dishcare_dishwasher_program_magic_daily": "Magic daily",
|
||||
"dishcare_dishwasher_program_super_60": "Super 60ºC",
|
||||
"dishcare_dishwasher_program_kurz_60": "Kurz 60ºC",
|
||||
"dishcare_dishwasher_program_express_sparkle_65": "Express sparkle 65ºC",
|
||||
"dishcare_dishwasher_program_machine_care": "Machine care",
|
||||
"dishcare_dishwasher_program_steam_fresh": "Steam fresh",
|
||||
"dishcare_dishwasher_program_maximum_cleaning": "Maximum cleaning",
|
||||
"dishcare_dishwasher_program_mixed_load": "Mixed load",
|
||||
"laundry_care_dryer_program_cotton": "Cotton",
|
||||
"laundry_care_dryer_program_synthetic": "Synthetic",
|
||||
"laundry_care_dryer_program_mix": "Mix",
|
||||
"laundry_care_dryer_program_blankets": "Blankets",
|
||||
"laundry_care_dryer_program_business_shirts": "Business shirts",
|
||||
"laundry_care_dryer_program_down_feathers": "Down feathers",
|
||||
"laundry_care_dryer_program_hygiene": "Hygiene",
|
||||
"laundry_care_dryer_program_jeans": "Jeans",
|
||||
"laundry_care_dryer_program_outdoor": "Outdoor",
|
||||
"laundry_care_dryer_program_synthetic_refresh": "Synthetic refresh",
|
||||
"laundry_care_dryer_program_towels": "Towels",
|
||||
"laundry_care_dryer_program_delicates": "Delicates",
|
||||
"laundry_care_dryer_program_super_40": "Super 40ºC",
|
||||
"laundry_care_dryer_program_shirts_15": "Shirts 15ºC",
|
||||
"laundry_care_dryer_program_pillow": "Pillow",
|
||||
"laundry_care_dryer_program_anti_shrink": "Anti shrink",
|
||||
"laundry_care_dryer_program_my_time_my_drying_time": "My drying time",
|
||||
"laundry_care_dryer_program_time_cold": "Cold (variable time)",
|
||||
"laundry_care_dryer_program_time_warm": "Warm (variable time)",
|
||||
"laundry_care_dryer_program_in_basket": "In basket",
|
||||
"laundry_care_dryer_program_time_cold_fix_time_cold_20": "Cold (20 min)",
|
||||
"laundry_care_dryer_program_time_cold_fix_time_cold_30": "Cold (30 min)",
|
||||
"laundry_care_dryer_program_time_cold_fix_time_cold_60": "Cold (60 min)",
|
||||
"laundry_care_dryer_program_time_warm_fix_time_warm_30": "Warm (30 min)",
|
||||
"laundry_care_dryer_program_time_warm_fix_time_warm_40": "Warm (40 min)",
|
||||
"laundry_care_dryer_program_time_warm_fix_time_warm_60": "Warm (60 min)",
|
||||
"laundry_care_dryer_program_dessous": "Dessous",
|
||||
"cooking_common_program_hood_automatic": "Automatic",
|
||||
"cooking_common_program_hood_venting": "Venting",
|
||||
"cooking_common_program_hood_delayed_shut_off": "Delayed shut off",
|
||||
"cooking_oven_program_heating_mode_pre_heating": "Pre-heating",
|
||||
"cooking_oven_program_heating_mode_hot_air": "Hot air",
|
||||
"cooking_oven_program_heating_mode_hot_air_eco": "Hot air eco",
|
||||
"cooking_oven_program_heating_mode_hot_air_grilling": "Hot air grilling",
|
||||
"cooking_oven_program_heating_mode_top_bottom_heating": "Top bottom heating",
|
||||
"cooking_oven_program_heating_mode_top_bottom_heating_eco": "Top bottom heating eco",
|
||||
"cooking_oven_program_heating_mode_bottom_heating": "Bottom heating",
|
||||
"cooking_oven_program_heating_mode_pizza_setting": "Pizza setting",
|
||||
"cooking_oven_program_heating_mode_slow_cook": "Slow cook",
|
||||
"cooking_oven_program_heating_mode_intensive_heat": "Intensive heat",
|
||||
"cooking_oven_program_heating_mode_keep_warm": "Keep warm",
|
||||
"cooking_oven_program_heating_mode_preheat_ovenware": "Preheat ovenware",
|
||||
"cooking_oven_program_heating_mode_frozen_heatup_special": "Special Heat-Up for frozen products",
|
||||
"cooking_oven_program_heating_mode_desiccation": "Desiccation",
|
||||
"cooking_oven_program_heating_mode_defrost": "Defrost",
|
||||
"cooking_oven_program_heating_mode_proof": "Proof",
|
||||
"cooking_oven_program_heating_mode_hot_air_30_steam": "Hot air + 30 RH",
|
||||
"cooking_oven_program_heating_mode_hot_air_60_steam": "Hot air + 60 RH",
|
||||
"cooking_oven_program_heating_mode_hot_air_80_steam": "Hot air + 80 RH",
|
||||
"cooking_oven_program_heating_mode_hot_air_100_steam": "Hot air + 100 RH",
|
||||
"cooking_oven_program_heating_mode_sabbath_programme": "Sabbath programme",
|
||||
"cooking_oven_program_microwave_90_watt": "90 Watt",
|
||||
"cooking_oven_program_microwave_180_watt": "180 Watt",
|
||||
"cooking_oven_program_microwave_360_watt": "360 Watt",
|
||||
"cooking_oven_program_microwave_600_watt": "600 Watt",
|
||||
"cooking_oven_program_microwave_900_watt": "900 Watt",
|
||||
"cooking_oven_program_microwave_1000_watt": "1000 Watt",
|
||||
"cooking_oven_program_microwave_max": "Max",
|
||||
"cooking_oven_program_heating_mode_warming_drawer": "Warming drawer",
|
||||
"laundry_care_washer_program_cotton": "Cotton",
|
||||
"laundry_care_washer_program_cotton_cotton_eco": "Cotton eco",
|
||||
"laundry_care_washer_program_cotton_eco_4060": "Cotton eco 40/60ºC",
|
||||
"laundry_care_washer_program_cotton_colour": "Cotton color",
|
||||
"laundry_care_washer_program_easy_care": "Easy care",
|
||||
"laundry_care_washer_program_mix": "Mix",
|
||||
"laundry_care_washer_program_mix_night_wash": "Mix night wash",
|
||||
"laundry_care_washer_program_delicates_silk": "Delicates silk",
|
||||
"laundry_care_washer_program_wool": "Wool",
|
||||
"laundry_care_washer_program_sensitive": "Sensitive",
|
||||
"laundry_care_washer_program_auto_30": "Auto 30ºC",
|
||||
"laundry_care_washer_program_auto_40": "Auto 40ºC",
|
||||
"laundry_care_washer_program_auto_60": "Auto 60ºC",
|
||||
"laundry_care_washer_program_chiffon": "Chiffon",
|
||||
"laundry_care_washer_program_curtains": "Curtains",
|
||||
"laundry_care_washer_program_dark_wash": "Dark wash",
|
||||
"laundry_care_washer_program_dessous": "Dessous",
|
||||
"laundry_care_washer_program_monsoon": "Monsoon",
|
||||
"laundry_care_washer_program_outdoor": "Outdoor",
|
||||
"laundry_care_washer_program_plush_toy": "Plush toy",
|
||||
"laundry_care_washer_program_shirts_blouses": "Shirts blouses",
|
||||
"laundry_care_washer_program_sport_fitness": "Sport fitness",
|
||||
"laundry_care_washer_program_towels": "Towels",
|
||||
"laundry_care_washer_program_water_proof": "Water proof",
|
||||
"laundry_care_washer_program_power_speed_59": "Power speed <60 min",
|
||||
"laundry_care_washer_program_super_153045_super_15": "Super 15 min",
|
||||
"laundry_care_washer_program_super_153045_super_1530": "Super 15/30 min",
|
||||
"laundry_care_washer_program_down_duvet_duvet": "Down duvet",
|
||||
"laundry_care_washer_program_rinse_rinse_spin_drain": "Rinse spin drain",
|
||||
"laundry_care_washer_program_drum_clean": "Drum clean",
|
||||
"laundry_care_washer_dryer_program_cotton": "Cotton",
|
||||
"laundry_care_washer_dryer_program_cotton_eco_4060": "Cotton eco 40/60 ºC",
|
||||
"laundry_care_washer_dryer_program_mix": "Mix",
|
||||
"laundry_care_washer_dryer_program_easy_care": "Easy care",
|
||||
"laundry_care_washer_dryer_program_wash_and_dry_60": "Wash and dry (60 min)",
|
||||
"laundry_care_washer_dryer_program_wash_and_dry_90": "Wash and dry (90 min)"
|
||||
}
|
||||
},
|
||||
"active_program": {
|
||||
"name": "Active program",
|
||||
"state": {
|
||||
"consumer_products_cleaning_robot_program_cleaning_clean_all": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_cleaning_robot_program_cleaning_clean_all%]",
|
||||
"consumer_products_cleaning_robot_program_cleaning_clean_map": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_cleaning_robot_program_cleaning_clean_map%]",
|
||||
"consumer_products_cleaning_robot_program_basic_go_home": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_cleaning_robot_program_basic_go_home%]",
|
||||
"consumer_products_coffee_maker_program_beverage_ristretto": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_ristretto%]",
|
||||
"consumer_products_coffee_maker_program_beverage_espresso": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_espresso%]",
|
||||
"consumer_products_coffee_maker_program_beverage_espresso_doppio": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_espresso_doppio%]",
|
||||
"consumer_products_coffee_maker_program_beverage_coffee": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_coffee%]",
|
||||
"consumer_products_coffee_maker_program_beverage_x_l_coffee": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_x_l_coffee%]",
|
||||
"consumer_products_coffee_maker_program_beverage_caffe_grande": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_caffe_grande%]",
|
||||
"consumer_products_coffee_maker_program_beverage_espresso_macchiato": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_espresso_macchiato%]",
|
||||
"consumer_products_coffee_maker_program_beverage_cappuccino": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_cappuccino%]",
|
||||
"consumer_products_coffee_maker_program_beverage_latte_macchiato": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_latte_macchiato%]",
|
||||
"consumer_products_coffee_maker_program_beverage_caffe_latte": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_caffe_latte%]",
|
||||
"consumer_products_coffee_maker_program_beverage_milk_froth": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_milk_froth%]",
|
||||
"consumer_products_coffee_maker_program_beverage_warm_milk": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_warm_milk%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_kleiner_brauner": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_kleiner_brauner%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_grosser_brauner": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_grosser_brauner%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_verlaengerter": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_verlaengerter%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_verlaengerter_braun": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_verlaengerter_braun%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_wiener_melange": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_wiener_melange%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_flat_white": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_flat_white%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cortado": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_cortado%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cafe_cortado": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_cafe_cortado%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cafe_con_leche": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_cafe_con_leche%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_cafe_au_lait": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_cafe_au_lait%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_doppio": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_doppio%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_kaapi": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_kaapi%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_koffie_verkeerd": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_koffie_verkeerd%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_galao": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_galao%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_garoto": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_garoto%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_americano": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_americano%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_red_eye": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_red_eye%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_black_eye": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_black_eye%]",
|
||||
"consumer_products_coffee_maker_program_coffee_world_dead_eye": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_coffee_world_dead_eye%]",
|
||||
"consumer_products_coffee_maker_program_beverage_hot_water": "[%key:component::home_connect::entity::select::selected_program::state::consumer_products_coffee_maker_program_beverage_hot_water%]",
|
||||
"dishcare_dishwasher_program_pre_rinse": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_pre_rinse%]",
|
||||
"dishcare_dishwasher_program_auto_1": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_auto_1%]",
|
||||
"dishcare_dishwasher_program_auto_2": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_auto_2%]",
|
||||
"dishcare_dishwasher_program_auto_3": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_auto_3%]",
|
||||
"dishcare_dishwasher_program_eco_50": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_eco_50%]",
|
||||
"dishcare_dishwasher_program_quick_45": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_quick_45%]",
|
||||
"dishcare_dishwasher_program_intensiv_70": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_intensiv_70%]",
|
||||
"dishcare_dishwasher_program_normal_65": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_normal_65%]",
|
||||
"dishcare_dishwasher_program_glas_40": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_glas_40%]",
|
||||
"dishcare_dishwasher_program_glass_care": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_glass_care%]",
|
||||
"dishcare_dishwasher_program_night_wash": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_night_wash%]",
|
||||
"dishcare_dishwasher_program_quick_65": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_quick_65%]",
|
||||
"dishcare_dishwasher_program_normal_45": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_normal_45%]",
|
||||
"dishcare_dishwasher_program_intensiv_45": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_intensiv_45%]",
|
||||
"dishcare_dishwasher_program_auto_half_load": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_auto_half_load%]",
|
||||
"dishcare_dishwasher_program_intensiv_power": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_intensiv_power%]",
|
||||
"dishcare_dishwasher_program_magic_daily": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_magic_daily%]",
|
||||
"dishcare_dishwasher_program_super_60": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_super_60%]",
|
||||
"dishcare_dishwasher_program_kurz_60": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_kurz_60%]",
|
||||
"dishcare_dishwasher_program_express_sparkle_65": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_express_sparkle_65%]",
|
||||
"dishcare_dishwasher_program_machine_care": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_machine_care%]",
|
||||
"dishcare_dishwasher_program_steam_fresh": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_steam_fresh%]",
|
||||
"dishcare_dishwasher_program_maximum_cleaning": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_maximum_cleaning%]",
|
||||
"dishcare_dishwasher_program_mixed_load": "[%key:component::home_connect::entity::select::selected_program::state::dishcare_dishwasher_program_mixed_load%]",
|
||||
"laundry_care_dryer_program_cotton": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_cotton%]",
|
||||
"laundry_care_dryer_program_synthetic": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_synthetic%]",
|
||||
"laundry_care_dryer_program_mix": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_mix%]",
|
||||
"laundry_care_dryer_program_blankets": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_blankets%]",
|
||||
"laundry_care_dryer_program_business_shirts": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_business_shirts%]",
|
||||
"laundry_care_dryer_program_down_feathers": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_down_feathers%]",
|
||||
"laundry_care_dryer_program_hygiene": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_hygiene%]",
|
||||
"laundry_care_dryer_program_jeans": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_jeans%]",
|
||||
"laundry_care_dryer_program_outdoor": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_outdoor%]",
|
||||
"laundry_care_dryer_program_synthetic_refresh": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_synthetic_refresh%]",
|
||||
"laundry_care_dryer_program_towels": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_towels%]",
|
||||
"laundry_care_dryer_program_delicates": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_delicates%]",
|
||||
"laundry_care_dryer_program_super_40": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_super_40%]",
|
||||
"laundry_care_dryer_program_shirts_15": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_shirts_15%]",
|
||||
"laundry_care_dryer_program_pillow": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_pillow%]",
|
||||
"laundry_care_dryer_program_anti_shrink": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_anti_shrink%]",
|
||||
"laundry_care_dryer_program_my_time_my_drying_time": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_my_time_my_drying_time%]",
|
||||
"laundry_care_dryer_program_time_cold": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_cold%]",
|
||||
"laundry_care_dryer_program_time_warm": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_warm%]",
|
||||
"laundry_care_dryer_program_in_basket": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_in_basket%]",
|
||||
"laundry_care_dryer_program_time_cold_fix_time_cold_20": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_cold_fix_time_cold_20%]",
|
||||
"laundry_care_dryer_program_time_cold_fix_time_cold_30": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_cold_fix_time_cold_30%]",
|
||||
"laundry_care_dryer_program_time_cold_fix_time_cold_60": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_cold_fix_time_cold_60%]",
|
||||
"laundry_care_dryer_program_time_warm_fix_time_warm_30": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_warm_fix_time_warm_30%]",
|
||||
"laundry_care_dryer_program_time_warm_fix_time_warm_40": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_warm_fix_time_warm_40%]",
|
||||
"laundry_care_dryer_program_time_warm_fix_time_warm_60": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_time_warm_fix_time_warm_60%]",
|
||||
"laundry_care_dryer_program_dessous": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_dryer_program_dessous%]",
|
||||
"cooking_common_program_hood_automatic": "[%key:component::home_connect::entity::select::selected_program::state::cooking_common_program_hood_automatic%]",
|
||||
"cooking_common_program_hood_venting": "[%key:component::home_connect::entity::select::selected_program::state::cooking_common_program_hood_venting%]",
|
||||
"cooking_common_program_hood_delayed_shut_off": "[%key:component::home_connect::entity::select::selected_program::state::cooking_common_program_hood_delayed_shut_off%]",
|
||||
"cooking_oven_program_heating_mode_pre_heating": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_pre_heating%]",
|
||||
"cooking_oven_program_heating_mode_hot_air": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air%]",
|
||||
"cooking_oven_program_heating_mode_hot_air_eco": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air_eco%]",
|
||||
"cooking_oven_program_heating_mode_hot_air_grilling": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air_grilling%]",
|
||||
"cooking_oven_program_heating_mode_top_bottom_heating": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_top_bottom_heating%]",
|
||||
"cooking_oven_program_heating_mode_top_bottom_heating_eco": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_top_bottom_heating_eco%]",
|
||||
"cooking_oven_program_heating_mode_bottom_heating": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_bottom_heating%]",
|
||||
"cooking_oven_program_heating_mode_pizza_setting": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_pizza_setting%]",
|
||||
"cooking_oven_program_heating_mode_slow_cook": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_slow_cook%]",
|
||||
"cooking_oven_program_heating_mode_intensive_heat": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_intensive_heat%]",
|
||||
"cooking_oven_program_heating_mode_keep_warm": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_keep_warm%]",
|
||||
"cooking_oven_program_heating_mode_preheat_ovenware": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_preheat_ovenware%]",
|
||||
"cooking_oven_program_heating_mode_frozen_heatup_special": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_frozen_heatup_special%]",
|
||||
"cooking_oven_program_heating_mode_desiccation": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_desiccation%]",
|
||||
"cooking_oven_program_heating_mode_defrost": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_defrost%]",
|
||||
"cooking_oven_program_heating_mode_proof": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_proof%]",
|
||||
"cooking_oven_program_heating_mode_hot_air_30_steam": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air_30_steam%]",
|
||||
"cooking_oven_program_heating_mode_hot_air_60_steam": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air_60_steam%]",
|
||||
"cooking_oven_program_heating_mode_hot_air_80_steam": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air_80_steam%]",
|
||||
"cooking_oven_program_heating_mode_hot_air_100_steam": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_hot_air_100_steam%]",
|
||||
"cooking_oven_program_heating_mode_sabbath_programme": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_sabbath_programme%]",
|
||||
"cooking_oven_program_microwave_90_watt": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_90_watt%]",
|
||||
"cooking_oven_program_microwave_180_watt": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_180_watt%]",
|
||||
"cooking_oven_program_microwave_360_watt": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_360_watt%]",
|
||||
"cooking_oven_program_microwave_600_watt": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_600_watt%]",
|
||||
"cooking_oven_program_microwave_900_watt": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_900_watt%]",
|
||||
"cooking_oven_program_microwave_1000_watt": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_1000_watt%]",
|
||||
"cooking_oven_program_microwave_max": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_microwave_max%]",
|
||||
"cooking_oven_program_heating_mode_warming_drawer": "[%key:component::home_connect::entity::select::selected_program::state::cooking_oven_program_heating_mode_warming_drawer%]",
|
||||
"laundry_care_washer_program_cotton": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_cotton%]",
|
||||
"laundry_care_washer_program_cotton_cotton_eco": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_cotton_cotton_eco%]",
|
||||
"laundry_care_washer_program_cotton_eco_4060": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_cotton_eco_4060%]",
|
||||
"laundry_care_washer_program_cotton_colour": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_cotton_colour%]",
|
||||
"laundry_care_washer_program_easy_care": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_easy_care%]",
|
||||
"laundry_care_washer_program_mix": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_mix%]",
|
||||
"laundry_care_washer_program_mix_night_wash": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_mix_night_wash%]",
|
||||
"laundry_care_washer_program_delicates_silk": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_delicates_silk%]",
|
||||
"laundry_care_washer_program_wool": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_wool%]",
|
||||
"laundry_care_washer_program_sensitive": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_sensitive%]",
|
||||
"laundry_care_washer_program_auto_30": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_auto_30%]",
|
||||
"laundry_care_washer_program_auto_40": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_auto_40%]",
|
||||
"laundry_care_washer_program_auto_60": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_auto_60%]",
|
||||
"laundry_care_washer_program_chiffon": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_chiffon%]",
|
||||
"laundry_care_washer_program_curtains": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_curtains%]",
|
||||
"laundry_care_washer_program_dark_wash": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_dark_wash%]",
|
||||
"laundry_care_washer_program_dessous": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_dessous%]",
|
||||
"laundry_care_washer_program_monsoon": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_monsoon%]",
|
||||
"laundry_care_washer_program_outdoor": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_outdoor%]",
|
||||
"laundry_care_washer_program_plush_toy": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_plush_toy%]",
|
||||
"laundry_care_washer_program_shirts_blouses": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_shirts_blouses%]",
|
||||
"laundry_care_washer_program_sport_fitness": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_sport_fitness%]",
|
||||
"laundry_care_washer_program_towels": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_towels%]",
|
||||
"laundry_care_washer_program_water_proof": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_water_proof%]",
|
||||
"laundry_care_washer_program_power_speed_59": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_power_speed_59%]",
|
||||
"laundry_care_washer_program_super_153045_super_15": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_super_153045_super_15%]",
|
||||
"laundry_care_washer_program_super_153045_super_1530": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_super_153045_super_1530%]",
|
||||
"laundry_care_washer_program_down_duvet_duvet": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_down_duvet_duvet%]",
|
||||
"laundry_care_washer_program_rinse_rinse_spin_drain": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_rinse_rinse_spin_drain%]",
|
||||
"laundry_care_washer_program_drum_clean": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_program_drum_clean%]",
|
||||
"laundry_care_washer_dryer_program_cotton": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_dryer_program_cotton%]",
|
||||
"laundry_care_washer_dryer_program_cotton_eco_4060": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_dryer_program_cotton_eco_4060%]",
|
||||
"laundry_care_washer_dryer_program_mix": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_dryer_program_mix%]",
|
||||
"laundry_care_washer_dryer_program_easy_care": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_dryer_program_easy_care%]",
|
||||
"laundry_care_washer_dryer_program_wash_and_dry_60": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_dryer_program_wash_and_dry_60%]",
|
||||
"laundry_care_washer_dryer_program_wash_and_dry_90": "[%key:component::home_connect::entity::select::selected_program::state::laundry_care_washer_dryer_program_wash_and_dry_90%]"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
"program_progress": {
|
||||
"name": "Program progress"
|
||||
|
@ -13,6 +13,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
||||
from . import HomeConnectConfigEntry, get_dict_from_home_connect_error
|
||||
from .const import (
|
||||
APPLIANCES_WITH_PROGRAMS,
|
||||
ATTR_ALLOWED_VALUES,
|
||||
ATTR_CONSTRAINTS,
|
||||
ATTR_VALUE,
|
||||
@ -36,18 +37,6 @@ from .entity import HomeConnectDevice, HomeConnectEntity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
APPLIANCES_WITH_PROGRAMS = (
|
||||
"CleaningRobot",
|
||||
"CoffeeMaker",
|
||||
"Dishwasher",
|
||||
"Dryer",
|
||||
"Hood",
|
||||
"Oven",
|
||||
"WarmingDrawer",
|
||||
"Washer",
|
||||
"WasherDryer",
|
||||
)
|
||||
|
||||
|
||||
SWITCHES = (
|
||||
SwitchEntityDescription(
|
||||
|
@ -182,6 +182,7 @@ def mock_problematic_appliance(request: pytest.FixtureRequest) -> Mock:
|
||||
mock.get_programs_active.side_effect = HomeConnectError
|
||||
mock.get_programs_available.side_effect = HomeConnectError
|
||||
mock.start_program.side_effect = HomeConnectError
|
||||
mock.select_program.side_effect = HomeConnectError
|
||||
mock.stop_program.side_effect = HomeConnectError
|
||||
mock.get_status.side_effect = HomeConnectError
|
||||
mock.get_settings.side_effect = HomeConnectError
|
||||
|
@ -10,7 +10,10 @@ from requests import HTTPError
|
||||
import requests_mock
|
||||
|
||||
from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
|
||||
from homeassistant.components.home_connect import SCAN_INTERVAL
|
||||
from homeassistant.components.home_connect import (
|
||||
SCAN_INTERVAL,
|
||||
bsh_key_to_translation_key,
|
||||
)
|
||||
from homeassistant.components.home_connect.const import (
|
||||
BSH_CHILD_LOCK_STATE,
|
||||
BSH_OPERATION_STATE,
|
||||
@ -27,6 +30,7 @@ from homeassistant.config_entries import ConfigEntryState
|
||||
from homeassistant.const import Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers import device_registry as dr, entity_registry as er
|
||||
from script.hassfest.translations import RE_TRANSLATION_KEY
|
||||
|
||||
from .conftest import (
|
||||
CLIENT_ID,
|
||||
@ -372,3 +376,10 @@ async def test_entity_migration(
|
||||
domain, DOMAIN, f"{appliance.haId}-{expected_unique_id_suffix}"
|
||||
)
|
||||
assert config_entry_v1_1.minor_version == 2
|
||||
|
||||
|
||||
async def test_bsh_key_transformations() -> None:
|
||||
"""Test that the key transformations are compatible valid translations keys and can be reversed."""
|
||||
program = "Dishcare.Dishwasher.Program.Eco50"
|
||||
translation_key = bsh_key_to_translation_key(program)
|
||||
assert RE_TRANSLATION_KEY.match(translation_key)
|
||||
|
161
tests/components/home_connect/test_select.py
Normal file
161
tests/components/home_connect/test_select.py
Normal file
@ -0,0 +1,161 @@
|
||||
"""Tests for home_connect select entities."""
|
||||
|
||||
from collections.abc import Awaitable, Callable, Generator
|
||||
from unittest.mock import MagicMock, Mock
|
||||
|
||||
from homeconnect.api import HomeConnectError
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.home_connect.const import (
|
||||
BSH_ACTIVE_PROGRAM,
|
||||
BSH_SELECTED_PROGRAM,
|
||||
)
|
||||
from homeassistant.components.select import ATTR_OPTION, DOMAIN as SELECT_DOMAIN
|
||||
from homeassistant.config_entries import ConfigEntryState
|
||||
from homeassistant.const import ATTR_ENTITY_ID, SERVICE_SELECT_OPTION, Platform
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import ServiceValidationError
|
||||
|
||||
from .conftest import get_all_appliances
|
||||
|
||||
from tests.common import MockConfigEntry, load_json_object_fixture
|
||||
|
||||
SETTINGS_STATUS = {
|
||||
setting.pop("key"): setting
|
||||
for setting in load_json_object_fixture("home_connect/settings.json")
|
||||
.get("Washer")
|
||||
.get("data")
|
||||
.get("settings")
|
||||
}
|
||||
|
||||
PROGRAM = "Dishcare.Dishwasher.Program.Eco50"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def platforms() -> list[str]:
|
||||
"""Fixture to specify platforms to test."""
|
||||
return [Platform.SELECT]
|
||||
|
||||
|
||||
async def test_select(
|
||||
bypass_throttle: Generator[None],
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
get_appliances: Mock,
|
||||
) -> None:
|
||||
"""Test select entity."""
|
||||
get_appliances.side_effect = get_all_appliances
|
||||
assert config_entry.state is ConfigEntryState.NOT_LOADED
|
||||
assert await integration_setup()
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("entity_id", "status", "program_to_set"),
|
||||
[
|
||||
(
|
||||
"select.washer_selected_program",
|
||||
{BSH_SELECTED_PROGRAM: {"value": PROGRAM}},
|
||||
"dishcare_dishwasher_program_eco_50",
|
||||
),
|
||||
(
|
||||
"select.washer_active_program",
|
||||
{BSH_ACTIVE_PROGRAM: {"value": PROGRAM}},
|
||||
"dishcare_dishwasher_program_eco_50",
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_select_functionality(
|
||||
entity_id: str,
|
||||
status: dict,
|
||||
program_to_set: str,
|
||||
bypass_throttle: Generator[None],
|
||||
hass: HomeAssistant,
|
||||
config_entry: MockConfigEntry,
|
||||
integration_setup: Callable[[], Awaitable[bool]],
|
||||
setup_credentials: None,
|
||||
appliance: Mock,
|
||||
get_appliances: MagicMock,
|
||||
) -> None:
|
||||
"""Test select functionality."""
|
||||
appliance.status.update(SETTINGS_STATUS)
|
||||
appliance.get_programs_available.return_value = [PROGRAM]
|
||||
get_appliances.return_value = [appliance]
|
||||
|
||||
assert config_entry.state is ConfigEntryState.NOT_LOADED
|
||||
assert await integration_setup()
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
|
||||
appliance.status.update(status)
|
||||
await hass.services.async_call(
|
||||
SELECT_DOMAIN,
|
||||
SERVICE_SELECT_OPTION,
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: program_to_set},
|
||||
blocking=True,
|
||||
)
|
||||
assert hass.states.is_state(entity_id, program_to_set)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
(
|
||||
"entity_id",
|
||||
"status",
|
||||
"program_to_set",
|
||||
"mock_attr",
|
||||
"exception_match",
|
||||
),
|
||||
[
|
||||
(
|
||||
"select.washer_selected_program",
|
||||
{BSH_SELECTED_PROGRAM: {"value": PROGRAM}},
|
||||
"dishcare_dishwasher_program_eco_50",
|
||||
"select_program",
|
||||
r"Error.*select.*program.*",
|
||||
),
|
||||
(
|
||||
"select.washer_active_program",
|
||||
{BSH_ACTIVE_PROGRAM: {"value": PROGRAM}},
|
||||
"dishcare_dishwasher_program_eco_50",
|
||||
"start_program",
|
||||
r"Error.*start.*program.*",
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_select_exception_handling(
|
||||
entity_id: str,
|
||||
status: dict,
|
||||
program_to_set: str,
|
||||
mock_attr: str,
|
||||
exception_match: str,
|
||||
bypass_throttle: Generator[None],
|
||||
hass: HomeAssistant,
|
||||
integration_setup: Callable[[], Awaitable[bool]],
|
||||
config_entry: MockConfigEntry,
|
||||
setup_credentials: None,
|
||||
problematic_appliance: Mock,
|
||||
get_appliances: MagicMock,
|
||||
) -> None:
|
||||
"""Test exception handling."""
|
||||
problematic_appliance.get_programs_available.side_effect = None
|
||||
problematic_appliance.get_programs_available.return_value = [PROGRAM]
|
||||
get_appliances.return_value = [problematic_appliance]
|
||||
|
||||
assert config_entry.state is ConfigEntryState.NOT_LOADED
|
||||
assert await integration_setup()
|
||||
assert config_entry.state is ConfigEntryState.LOADED
|
||||
|
||||
# Assert that an exception is called.
|
||||
with pytest.raises(HomeConnectError):
|
||||
getattr(problematic_appliance, mock_attr)()
|
||||
|
||||
problematic_appliance.status.update(status)
|
||||
with pytest.raises(ServiceValidationError, match=exception_match):
|
||||
await hass.services.async_call(
|
||||
SELECT_DOMAIN,
|
||||
SERVICE_SELECT_OPTION,
|
||||
{"entity_id": entity_id, "option": program_to_set},
|
||||
blocking=True,
|
||||
)
|
||||
assert getattr(problematic_appliance, mock_attr).call_count == 2
|
Loading…
x
Reference in New Issue
Block a user