1 """Support for a ScreenLogic heating device."""
3 from dataclasses
import dataclass
7 from screenlogicpy.const.common
import UNIT, ScreenLogicCommunicationError
8 from screenlogicpy.const.data
import ATTR, DEVICE, VALUE
9 from screenlogicpy.const.msg
import CODE
10 from screenlogicpy.device_const.heat
import HEAT_MODE
11 from screenlogicpy.device_const.system
import EQUIPMENT_FLAG
16 ClimateEntityDescription,
27 from .entity
import ScreenLogicPushEntity, ScreenLogicPushEntityDescription
28 from .types
import ScreenLogicConfigEntry
30 _LOGGER = logging.getLogger(__name__)
33 SUPPORTED_MODES = [HVACMode.OFF, HVACMode.HEAT]
37 HEAT_MODE.SOLAR_PREFERRED,
44 config_entry: ScreenLogicConfigEntry,
45 async_add_entities: AddEntitiesCallback,
48 coordinator = config_entry.runtime_data
50 gateway = coordinator.gateway
56 subscription_code=CODE.STATUS_CHANGED,
57 data_root=(DEVICE.BODY,),
61 for body_index
in gateway.get_data(DEVICE.BODY)
65 @dataclass(frozen=True, kw_only=True)
67 ClimateEntityDescription, ScreenLogicPushEntityDescription
69 """Describes a ScreenLogic climate entity."""
73 """Represents a ScreenLogic climate entity."""
75 entity_description: ScreenLogicClimateDescription
76 _attr_hvac_modes = SUPPORTED_MODES
77 _attr_supported_features = (
78 ClimateEntityFeature.TARGET_TEMPERATURE
79 | ClimateEntityFeature.PRESET_MODE
80 | ClimateEntityFeature.TURN_OFF
81 | ClimateEntityFeature.TURN_ON
83 _enable_turn_on_off_backwards_compatibility =
False
85 def __init__(self, coordinator, entity_description) -> None:
86 """Initialize a ScreenLogic climate entity."""
87 super().
__init__(coordinator, entity_description)
90 if EQUIPMENT_FLAG.SOLAR
in self.
gatewaygatewaygateway.equipment_flags:
92 [HEAT_MODE.SOLAR, HEAT_MODE.SOLAR_PREFERRED]
106 """Return water temperature."""
107 return self.
entity_dataentity_data[VALUE.LAST_TEMPERATURE][ATTR.VALUE]
111 """Target temperature."""
112 return self.
entity_dataentity_data[VALUE.HEAT_SETPOINT][ATTR.VALUE]
116 """Return the unit of measurement."""
118 return UnitOfTemperature.CELSIUS
119 return UnitOfTemperature.FAHRENHEIT
123 """Return the current hvac mode."""
124 if self.
entity_dataentity_data[VALUE.HEAT_MODE][ATTR.VALUE] > 0:
130 """Return the current action of the heater."""
131 if self.
entity_dataentity_data[VALUE.HEAT_STATE][ATTR.VALUE] > 0:
132 return HVACAction.HEATING
134 return HVACAction.IDLE
135 return HVACAction.OFF
139 """Return current/last preset mode."""
142 return HEAT_MODE(self.
entity_dataentity_data[VALUE.HEAT_MODE][ATTR.VALUE]).title
145 """Change the setpoint of the heater."""
146 if (temperature := kwargs.get(ATTR_TEMPERATURE))
is None:
147 raise ValueError(f
"Expected attribute {ATTR_TEMPERATURE}")
153 except ScreenLogicCommunicationError
as sle:
155 f
"Failed to set_temperature {temperature} on body"
156 f
" {self.entity_data[ATTR.BODY_TYPE][ATTR.VALUE]}:"
159 _LOGGER.debug(
"Set temperature for body %s to %s", self.
_data_key_data_key, temperature)
162 """Set the operation mode."""
163 if hvac_mode == HVACMode.OFF:
170 except ScreenLogicCommunicationError
as sle:
172 f
"Failed to set_hvac_mode {mode.name} on body"
173 f
" {self.entity_data[ATTR.BODY_TYPE][ATTR.VALUE]}:"
176 _LOGGER.debug(
"Set hvac_mode on body %s to %s", self.
_data_key_data_key, mode.name)
179 """Set the preset mode."""
180 mode = HEAT_MODE.parse(preset_mode)
181 _LOGGER.debug(
"Setting last_preset to %s", mode.name)
188 except ScreenLogicCommunicationError
as sle:
190 f
"Failed to set_preset_mode {mode.name} on body"
191 f
" {self.entity_data[ATTR.BODY_TYPE][ATTR.VALUE]}:"
194 _LOGGER.debug(
"Set preset_mode on body %s to %s", self.
_data_key_data_key, mode.name)
197 """Run when entity is about to be added."""
200 _LOGGER.debug(
"Startup last preset is %s", self.
_last_preset_last_preset)
205 prev_state
is not None
206 and prev_state.attributes.get(ATTR_PRESET_MODE)
is not None
208 mode = HEAT_MODE.parse(prev_state.attributes.get(ATTR_PRESET_MODE))
210 "Startup setting last_preset to %s from prev_state",
217 "Startup setting last_preset to default (%s)",
HVACMode|None hvac_mode(self)
str|None preset_mode(self)
None async_set_temperature(self, **Any kwargs)
None __init__(self, coordinator, entity_description)
float target_temperature(self)
None async_added_to_hass(self)
None async_set_hvac_mode(self, HVACMode hvac_mode)
float current_temperature(self)
None async_set_preset_mode(self, str preset_mode)
str temperature_unit(self)
HVACAction hvac_action(self)
ScreenLogicGateway gateway(self)
State|None async_get_last_state(self)
None async_setup_entry(HomeAssistant hass, ScreenLogicConfigEntry config_entry, AddEntitiesCallback async_add_entities)