diff --git a/homeassistant/components/ecobee.py b/homeassistant/components/ecobee.py index d69770e3a5e76f..a7246319e765a8 100644 --- a/homeassistant/components/ecobee.py +++ b/homeassistant/components/ecobee.py @@ -16,7 +16,7 @@ from homeassistant.util import Throttle from homeassistant.util.json import save_json -REQUIREMENTS = ['python-ecobee-api==0.0.11'] +REQUIREMENTS = ['python-ecobee-api==0.0.12'] _CONFIGURING = {} _LOGGER = logging.getLogger(__name__) @@ -82,6 +82,7 @@ def setup_ecobee(hass, network, config): hass, 'climate', DOMAIN, {'hold_temp': hold_temp}, config) discovery.load_platform(hass, 'sensor', DOMAIN, {}, config) discovery.load_platform(hass, 'binary_sensor', DOMAIN, {}, config) + discovery.load_platform(hass, 'weather', DOMAIN, {}, config) class EcobeeData(object): diff --git a/homeassistant/components/weather/ecobee.py b/homeassistant/components/weather/ecobee.py new file mode 100644 index 00000000000000..8c5354cfdabd1f --- /dev/null +++ b/homeassistant/components/weather/ecobee.py @@ -0,0 +1,146 @@ +""" +Support for displaying weather info from Ecobee API. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/weather.ecobee/ +""" +import logging +from homeassistant.components import ecobee +from homeassistant.components.weather import ( + WeatherEntity, ATTR_FORECAST_TEMP, ATTR_FORECAST_TIME) +from homeassistant.const import (STATE_UNKNOWN, TEMP_FAHRENHEIT) + + +DEPENDENCIES = ['ecobee'] + +ATTR_FORECAST_CONDITION = 'condition' +ATTR_FORECAST_TEMP_LOW = 'templow' +ATTR_FORECAST_TEMP_HIGH = 'temphigh' +ATTR_FORECAST_PRESSURE = 'pressure' +ATTR_FORECAST_VISIBILITY = 'visibility' +ATTR_FORECAST_WIND_SPEED = 'windspeed' +ATTR_FORECAST_HUMIDITY = 'humidity' + +MISSING_DATA = -5002 + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the Ecobee weather component.""" + if discovery_info is None: + return + dev = list() + data = ecobee.NETWORK + for index in range(len(data.ecobee.thermostats)): + thermostat = data.ecobee.get_thermostat(index) + if 'weather' in thermostat: + dev.append(EcobeeWeather(thermostat['name'], index)) + + add_devices(dev, True) + + +class EcobeeWeather(WeatherEntity): + """Representation of Ecobee weather data.""" + + def __init__(self, name, index): + """Initialize the sensor.""" + self._name = name + self._index = index + self.weather = None + + def get_forecast(self, index, param): + """Retrieve forecast parameter.""" + try: + forecast = self.weather['forecasts'][index] + return forecast[param] + except (ValueError, IndexError): + return STATE_UNKNOWN + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def condition(self): + """Return the current condition.""" + return self.get_forecast(0, 'condition') + + @property + def temperature(self): + """Return the temperature.""" + return float(self.get_forecast(0, 'temperature')) / 10 + + @property + def temperature_unit(self): + """Return the unit of measurement.""" + return TEMP_FAHRENHEIT + + @property + def pressure(self): + """Return the pressure.""" + return int(self.get_forecast(0, 'pressure')) + + @property + def humidity(self): + """Return the humidity.""" + return int(self.get_forecast(0, 'relativeHumidity')) + + @property + def visibility(self): + """Return the visibility.""" + return int(self.get_forecast(0, 'visibility')) + + @property + def wind_speed(self): + """Return the wind speed.""" + return int(self.get_forecast(0, 'windSpeed')) + + @property + def wind_bearing(self): + """Return the wind direction.""" + return int(self.get_forecast(0, 'windBearing')) + + @property + def attribution(self): + """Return the attribution.""" + station = self.weather['weatherStation'] + time = self.weather['timestamp'] + return "Ecobee weather provided by " + station + " at " + time + + @property + def forecast(self): + """Return the forecast array.""" + try: + forecasts = [] + for day in self.weather['forecasts']: + forecast = { + ATTR_FORECAST_TIME: day['dateTime'], + ATTR_FORECAST_CONDITION: day['condition'], + ATTR_FORECAST_TEMP: float(day['tempHigh']) / 10, + } + if day['tempHigh'] == MISSING_DATA: + break + if day['tempLow'] != MISSING_DATA: + forecast[ATTR_FORECAST_TEMP_LOW] = \ + float(day['tempLow']) / 10 + if day['pressure'] != MISSING_DATA: + forecast[ATTR_FORECAST_PRESSURE] = int(day['pressure']) + if day['windSpeed'] != MISSING_DATA: + forecast[ATTR_FORECAST_WIND_SPEED] = int(day['windSpeed']) + if day['visibility'] != MISSING_DATA: + forecast[ATTR_FORECAST_WIND_SPEED] = int(day['visibility']) + if day['relativeHumidity'] != MISSING_DATA: + forecast[ATTR_FORECAST_HUMIDITY] = \ + int(day['relativeHumidity']) + forecasts.append(forecast) + return forecasts + except (ValueError, IndexError): + return STATE_UNKNOWN + + def update(self): + """Get the latest state of the sensor.""" + data = ecobee.NETWORK + data.update() + thermostat = data.ecobee.get_thermostat(self._index) + self.weather = thermostat.get('weather', None) + logging.error("Weather Update") diff --git a/requirements_all.txt b/requirements_all.txt index b37a6b680643d8..c21a0820b45a6b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -809,7 +809,7 @@ python-clementine-remote==1.0.1 python-digitalocean==1.12 # homeassistant.components.ecobee -python-ecobee-api==0.0.11 +python-ecobee-api==0.0.12 # homeassistant.components.climate.eq3btsmart # python-eq3bt==0.1.6