107 lines
3.1 KiB
Python
107 lines
3.1 KiB
Python
"""Support for the PRT Heatmiser themostats using the V3 protocol."""
|
|
import logging
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.climate import ClimateDevice, PLATFORM_SCHEMA
|
|
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 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"))
|