112 lines
3.1 KiB
Python
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)
|