"""Support for the PRT Heatmiser themostats using the V3 protocol.""" import logging from typing import List import voluptuous as vol from homeassistant.components.climate import ( ClimateDevice, PLATFORM_SCHEMA, HVAC_MODE_HEAT, ) from homeassistant.components.climate.const import SUPPORT_TARGET_TEMPERATURE from homeassistant.const import ( TEMP_CELSIUS, ATTR_TEMPERATURE, CONF_PORT, CONF_NAME, CONF_ID, ) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_IPADDRESS = "ipaddress" CONF_TSTATS = "tstats" TSTATS_SCHEMA = vol.Schema( {vol.Required(CONF_ID): cv.string, vol.Required(CONF_NAME): cv.string} ) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_IPADDRESS): cv.string, vol.Required(CONF_PORT): cv.port, vol.Required(CONF_TSTATS, default={}): vol.Schema({cv.string: TSTATS_SCHEMA}), } ) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the heatmiser thermostat.""" from heatmiserV3 import heatmiser, connection ipaddress = config.get(CONF_IPADDRESS) port = str(config.get(CONF_PORT)) tstats = config.get(CONF_TSTATS) serport = connection.connection(ipaddress, port) serport.open() add_entities( [ HeatmiserV3Thermostat( heatmiser, tstat.get(CONF_ID), tstat.get(CONF_NAME), serport ) for tstat in tstats.values() ], True, ) class HeatmiserV3Thermostat(ClimateDevice): """Representation of a HeatmiserV3 thermostat.""" def __init__(self, heatmiser, device, name, serport): """Initialize the thermostat.""" self.heatmiser = heatmiser self.serport = serport self._current_temperature = None self._target_temperature = None self._name = name self._id = device self.dcb = None @property def supported_features(self): """Return the list of supported features.""" return SUPPORT_TARGET_TEMPERATURE @property def name(self): """Return the name of the thermostat, if any.""" return self._name @property def temperature_unit(self): """Return the unit of measurement which this thermostat uses.""" return TEMP_CELSIUS @property def hvac_mode(self) -> str: """Return hvac operation ie. heat, cool mode. Need to be one of HVAC_MODE_*. """ return HVAC_MODE_HEAT @property def hvac_modes(self) -> List[str]: """Return the list of available hvac operation modes. Need to be a subset of HVAC_MODES. """ return [HVAC_MODE_HEAT] @property def current_temperature(self): """Return the current temperature.""" return self._current_temperature @property def target_temperature(self): """Return the temperature we try to reach.""" return self._target_temperature def set_temperature(self, **kwargs): """Set new target temperature.""" temperature = kwargs.get(ATTR_TEMPERATURE) self.heatmiser.hmSendAddress(self._id, 18, temperature, 1, self.serport) def update(self): """Get the latest data.""" self.dcb = self.heatmiser.hmReadAddress(self._id, "prt", self.serport) low = self.dcb.get("floortemplow ") high = self.dcb.get("floortemphigh") self._current_temperature = (high * 256 + low) / 10.0 self._target_temperature = int(self.dcb.get("roomset"))