"""Whole-house thermostat controls for GREE Controller.""" from __future__ import annotations from typing import Any from homeassistant.components.select import SelectEntity from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from . import GreeControllerRuntimeData from .const import DOMAIN from .coordinator import GreeControllerCoordinator HOUSE_MODE_LABELS = { "off": "Do not control", "cool": "Cooling", "heat": "Heating", } HOUSE_MODE_VALUES = {label: value for value, label in HOUSE_MODE_LABELS.items()} HOUSE_PRESET_LABELS = { "auto": "Auto schedule", "comfort": "Comfort", "sleep": "Sleep", "away": "Away", } HOUSE_PRESET_VALUES = {label: value for value, label in HOUSE_PRESET_LABELS.items()} async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Create whole-house thermostat mode and work-profile selectors.""" runtime: GreeControllerRuntimeData = entry.runtime_data async_add_entities( [ GreeControllerHouseModeSelect(runtime.coordinator), GreeControllerHousePresetSelect(runtime.coordinator), ] ) class _GreeControllerHouseSelect(CoordinatorEntity[GreeControllerCoordinator], SelectEntity): """Base for controller-level selectors.""" _attr_has_entity_name = True @property def device_info(self) -> DeviceInfo: return DeviceInfo( identifiers={(DOMAIN, "controller")}, name="GREE Controller", manufacturer="GREE Controller", model="Local controller", ) class GreeControllerHouseModeSelect(_GreeControllerHouseSelect): """Select the smart thermostat house mode.""" _attr_name = "Thermostat mode" _attr_unique_id = "house-thermostat-mode" _attr_options = list(HOUSE_MODE_VALUES) @property def current_option(self) -> str | None: value = str(self.coordinator.plan.get("house_mode") or "") return HOUSE_MODE_LABELS.get(value) async def async_select_option(self, option: str) -> None: value = HOUSE_MODE_VALUES.get(option) if value is None: return await self.coordinator.client.house_control(value) await self.coordinator.async_request_refresh() class GreeControllerHousePresetSelect(_GreeControllerHouseSelect): """Select the whole-house thermostat work profile.""" _attr_name = "Work profile" _attr_unique_id = "house-work-profile" _attr_options = list(HOUSE_PRESET_VALUES) @property def current_option(self) -> str | None: value = self.coordinator.plan.get("house_preset") return HOUSE_PRESET_LABELS.get(str(value)) if value is not None else None @property def extra_state_attributes(self) -> dict[str, Any]: return {"mixed_zone_profiles": self.coordinator.plan.get("house_preset") is None} async def async_select_option(self, option: str) -> None: value = HOUSE_PRESET_VALUES.get(option) if value is None: return await self.coordinator.client.house_preset(value) await self.coordinator.async_request_refresh()