diff --git a/.coveragerc b/.coveragerc index 28b4b926eab..33ae68f0e69 100644 --- a/.coveragerc +++ b/.coveragerc @@ -97,6 +97,7 @@ omit = homeassistant/components/switch/rpi_gpio.py homeassistant/components/switch/transmission.py homeassistant/components/switch/wemo.py + homeassistant/components/thermostat/honeywell_round_connected.py homeassistant/components/thermostat/nest.py homeassistant/components/thermostat/radiotherm.py diff --git a/homeassistant/components/thermostat/honeywell_round_connected.py b/homeassistant/components/thermostat/honeywell_round_connected.py new file mode 100644 index 00000000000..cba05e06871 --- /dev/null +++ b/homeassistant/components/thermostat/honeywell_round_connected.py @@ -0,0 +1,101 @@ +""" +homeassistant.components.thermostat.honeywell_round_connected +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Adds support for Honeywell Round Connected thermostats. +""" +import socket +import logging +from homeassistant.components.thermostat import ThermostatDevice +from homeassistant.const import (CONF_USERNAME, CONF_PASSWORD, TEMP_CELCIUS) +logger=logging.getLogger(__name__) + +REQUIREMENTS = ['evohomeclient==0.2.3'] + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Sets up the honeywel thermostat. """ + logger = logging.getLogger(__name__) + + username = config.get(CONF_USERNAME) + password = config.get(CONF_PASSWORD) + + if username is None or password is None: + logger.error("Missing required configuration items %s or %s", + CONF_USERNAME, CONF_PASSWORD) + return + + try: + from evohomeclient import EvohomeClient + except ImportError: + logger.exception( + "Error while importing dependency evohomeclient. " + "Did you maybe not install the python evohomeclient dependency?") + + return + + evo_api = EvohomeClient(username, password) + try: + add_devices([ + RoundThermostat(evo_api) + ]) + except socket.error: + logger.error( + "Connection error logging into the honeywell evohome web service" + ) + + +class RoundThermostat(ThermostatDevice): + """ Represents a Honeywell Round Connected thermostat. """ + + def __init__(self, device): + self.device = device + self._current_temperature = None + self._target_temperature = None + self._name = "round connected" + self.update() + + @property + def name(self): + """ Returns the name of the honeywell, if any. """ + return self._name + + @property + def unit_of_measurement(self): + """ Unit of measurement this thermostat expresses itself in. """ + return TEMP_CELCIUS + + @property + def device_state_attributes(self): + """ Returns device specific state attributes. """ + # Move these to Thermostat Device and make them global + return {} + + @property + def current_temperature(self): + """ Returns the current temperature. """ + return self._current_temperature + + @property + def target_temperature(self): + """ Returns the temperature we try to reach. """ + return self._target_temperature + + def set_temperature(self, temperature): + """ Set new target temperature """ + self.device.set_temperature(self._name, temperature) + + @property + def should_poll(self): + """ Should poll the evohome cloud service """ + return True + + def update(self): + try: + # assuming I am only receiving one temperature sensor from the api.. + _device = next(self.device.temperatures(force_refresh=True)) + self._current_temperature = _device['temp'] + self._target_temperature = _device['setpoint'] + self._name = _device['name'] + except StopIteration: + logger.error("Did not receive any temperature data from the evohomeclient api.") diff --git a/requirements_all.txt b/requirements_all.txt index 1296b8ed8e3..3843a431cca 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -150,3 +150,6 @@ py-cpuinfo==0.1.6 # Radio Thermostat (thermostat.radiotherm) radiotherm==1.2 + +# Honeywell Evo Home Client +evohomeclient==0.2.3