core/homeassistant/components/incomfort/water_heater.py

112 lines
3.1 KiB
Python

"""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 "Fault code: {}".format(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)