Home Assistant Unofficial Reference 2024.12.1
water_heater.py
Go to the documentation of this file.
1 """Support for Rheem EcoNet water heaters."""
2 
3 from datetime import timedelta
4 import logging
5 from typing import Any
6 
7 from pyeconet.equipment import EquipmentType
8 from pyeconet.equipment.water_heater import WaterHeaterOperationMode
9 
11  STATE_ECO,
12  STATE_ELECTRIC,
13  STATE_GAS,
14  STATE_HEAT_PUMP,
15  STATE_HIGH_DEMAND,
16  STATE_PERFORMANCE,
17  WaterHeaterEntity,
18  WaterHeaterEntityFeature,
19 )
20 from homeassistant.config_entries import ConfigEntry
21 from homeassistant.const import ATTR_TEMPERATURE, STATE_OFF, UnitOfTemperature
22 from homeassistant.core import HomeAssistant
23 from homeassistant.helpers.entity_platform import AddEntitiesCallback
24 
25 from .const import DOMAIN, EQUIPMENT
26 from .entity import EcoNetEntity
27 
28 SCAN_INTERVAL = timedelta(hours=1)
29 
30 _LOGGER = logging.getLogger(__name__)
31 
32 ECONET_STATE_TO_HA = {
33  WaterHeaterOperationMode.ENERGY_SAVING: STATE_ECO,
34  WaterHeaterOperationMode.HIGH_DEMAND: STATE_HIGH_DEMAND,
35  WaterHeaterOperationMode.OFF: STATE_OFF,
36  WaterHeaterOperationMode.HEAT_PUMP_ONLY: STATE_HEAT_PUMP,
37  WaterHeaterOperationMode.ELECTRIC_MODE: STATE_ELECTRIC,
38  WaterHeaterOperationMode.GAS: STATE_GAS,
39  WaterHeaterOperationMode.PERFORMANCE: STATE_PERFORMANCE,
40 }
41 HA_STATE_TO_ECONET = {value: key for key, value in ECONET_STATE_TO_HA.items()}
42 
43 SUPPORT_FLAGS_HEATER = (
44  WaterHeaterEntityFeature.TARGET_TEMPERATURE
45  | WaterHeaterEntityFeature.OPERATION_MODE
46 )
47 
48 
50  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
51 ) -> None:
52  """Set up EcoNet water heater based on a config entry."""
53  equipment = hass.data[DOMAIN][EQUIPMENT][entry.entry_id]
55  [
56  EcoNetWaterHeater(water_heater)
57  for water_heater in equipment[EquipmentType.WATER_HEATER]
58  ],
59  update_before_add=True,
60  )
61 
62 
64  """Define an Econet water heater."""
65 
66  _attr_should_poll = True # Override False default from EcoNetEntity
67  _attr_temperature_unit = UnitOfTemperature.FAHRENHEIT
68 
69  def __init__(self, water_heater):
70  """Initialize."""
71  super().__init__(water_heater)
72  self.water_heaterwater_heater = water_heater
73 
74  @property
75  def is_away_mode_on(self):
76  """Return true if away mode is on."""
77  return self._econet_econet.away
78 
79  @property
80  def current_operation(self):
81  """Return current operation."""
82  econet_mode = self.water_heaterwater_heater.mode
83  _current_op = STATE_OFF
84  if econet_mode is not None:
85  _current_op = ECONET_STATE_TO_HA[econet_mode]
86 
87  return _current_op
88 
89  @property
90  def operation_list(self):
91  """List of available operation modes."""
92  econet_modes = self.water_heaterwater_heater.modes
93  op_list = []
94  for mode in econet_modes:
95  if (
96  mode is not WaterHeaterOperationMode.UNKNOWN
97  and mode is not WaterHeaterOperationMode.VACATION
98  ):
99  ha_mode = ECONET_STATE_TO_HA[mode]
100  op_list.append(ha_mode)
101  return op_list
102 
103  @property
104  def supported_features(self) -> WaterHeaterEntityFeature:
105  """Return the list of supported features."""
106  if self.water_heaterwater_heater.modes:
107  if self.water_heaterwater_heater.supports_away:
108  return SUPPORT_FLAGS_HEATER | WaterHeaterEntityFeature.AWAY_MODE
109  return SUPPORT_FLAGS_HEATER
110  if self.water_heaterwater_heater.supports_away:
111  return (
112  WaterHeaterEntityFeature.TARGET_TEMPERATURE
113  | WaterHeaterEntityFeature.AWAY_MODE
114  )
115  return WaterHeaterEntityFeature.TARGET_TEMPERATURE
116 
117  def set_temperature(self, **kwargs: Any) -> None:
118  """Set new target temperature."""
119  if (target_temp := kwargs.get(ATTR_TEMPERATURE)) is not None:
120  self.water_heaterwater_heater.set_set_point(target_temp)
121  else:
122  _LOGGER.error("A target temperature must be provided")
123 
124  def set_operation_mode(self, operation_mode: str) -> None:
125  """Set operation mode."""
126  op_mode_to_set = HA_STATE_TO_ECONET.get(operation_mode)
127  if op_mode_to_set is not None:
128  self.water_heaterwater_heater.set_mode(op_mode_to_set)
129  else:
130  _LOGGER.error("Invalid operation mode: %s", operation_mode)
131 
132  @property
134  """Return the temperature we try to reach."""
135  return self.water_heaterwater_heater.set_point
136 
137  @property
138  def min_temp(self):
139  """Return the minimum temperature."""
140  return self.water_heaterwater_heater.set_point_limits[0]
141 
142  @property
143  def max_temp(self):
144  """Return the maximum temperature."""
145  return self.water_heaterwater_heater.set_point_limits[1]
146 
147  async def async_update(self) -> None:
148  """Get the latest energy usage."""
149  await self.water_heaterwater_heater.get_energy_usage()
150  await self.water_heaterwater_heater.get_water_usage()
151 
152  def turn_away_mode_on(self) -> None:
153  """Turn away mode on."""
154  self.water_heaterwater_heater.set_away_mode(True)
155 
156  def turn_away_mode_off(self) -> None:
157  """Turn away mode off."""
158  self.water_heaterwater_heater.set_away_mode(False)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: water_heater.py:51