"""Support for an Intergas boiler via an InComfort/Intouch Lan2RF gateway.""" import asyncio import logging from aiohttp import ClientResponseError from homeassistant.components.water_heater import WaterHeaterDevice from homeassistant.const import TEMP_CELSIUS from homeassistant.helpers.dispatcher import async_dispatcher_send from . import DOMAIN _LOGGER = logging.getLogger(__name__) HEATER_SUPPORT_FLAGS = 0 HEATER_MAX_TEMP = 80.0 HEATER_MIN_TEMP = 30.0 HEATER_NAME = "Boiler" HEATER_ATTRS = [ "display_code", "display_text", "is_burning", "rf_message_rssi", "nodenr", "rfstatus_cntr", ] async def async_setup_platform( hass, hass_config, async_add_entities, discovery_info=None ): """Set up an InComfort/Intouch water_heater device.""" client = hass.data[DOMAIN]["client"] heater = hass.data[DOMAIN]["heater"] async_add_entities([IncomfortWaterHeater(client, heater)], update_before_add=True) class IncomfortWaterHeater(WaterHeaterDevice): """Representation of an InComfort/Intouch water_heater device.""" def __init__(self, client, heater): """Initialize the water_heater device.""" self._client = client self._heater = heater @property def name(self): """Return the name of the water_heater device.""" return HEATER_NAME @property def icon(self): """Return the icon of the water_heater device.""" return "mdi:oil-temperature" @property def device_state_attributes(self): """Return the device state attributes.""" state = { k: self._heater.status[k] for k in self._heater.status if k in HEATER_ATTRS } return state @property def current_temperature(self): """Return the current temperature.""" if self._heater.is_tapping: return self._heater.tap_temp if self._heater.is_pumping: return self._heater.heater_temp return max(self._heater.heater_temp, self._heater.tap_temp) @property def min_temp(self): """Return max valid temperature that can be set.""" return HEATER_MIN_TEMP @property def max_temp(self): """Return max valid temperature that can be set.""" return HEATER_MAX_TEMP @property def temperature_unit(self): """Return the unit of measurement.""" return TEMP_CELSIUS @property def supported_features(self): """Return the list of supported features.""" return HEATER_SUPPORT_FLAGS @property def current_operation(self): """Return the current operation mode.""" if self._heater.is_failed: return f"Fault code: {self._heater.fault_code}" return self._heater.display_text async def async_update(self): """Get the latest state data from the gateway.""" try: await self._heater.update() except (ClientResponseError, asyncio.TimeoutError) as err: _LOGGER.warning("Update failed, message is: %s", err) async_dispatcher_send(self.hass, DOMAIN)