diff --git a/homeassistant/components/nest.py b/homeassistant/components/nest.py index 7b866919b73..453b6b72bd4 100644 --- a/homeassistant/components/nest.py +++ b/homeassistant/components/nest.py @@ -1,5 +1,5 @@ """ -Support for Nest thermostats. +Support for Nest thermostats and protect smoke alarms. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/thermostat.nest/ @@ -11,7 +11,7 @@ import voluptuous as vol from homeassistant.const import CONF_PASSWORD, CONF_USERNAME -REQUIREMENTS = ['python-nest==2.6.0'] +REQUIREMENTS = ['python-nest==2.9.1'] DOMAIN = 'nest' NEST = None @@ -36,6 +36,16 @@ def devices(): _LOGGER.error("Connection error logging into the nest web service.") +def protect_devices(): + """Generator returning list of protect devices.""" + try: + for structure in NEST.structures: + for device in structure.protectdevices: + yield(structure, device) + except socket.error: + _LOGGER.error("Connection error logging into the nest web service.") + + # pylint: disable=unused-argument def setup(hass, config): """Setup the Nest thermostat component.""" diff --git a/homeassistant/components/sensor/nest.py b/homeassistant/components/sensor/nest.py index c3b68430b99..7a89265a8bd 100644 --- a/homeassistant/components/sensor/nest.py +++ b/homeassistant/components/sensor/nest.py @@ -4,6 +4,8 @@ Support for Nest Thermostat Sensors. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/sensor.nest/ """ +from itertools import chain + import voluptuous as vol import homeassistant.components.nest as nest @@ -29,9 +31,13 @@ WEATHER_VARS = {'weather_humidity': 'humidity', SENSOR_UNITS = {'humidity': '%', 'battery_level': 'V', 'kph': 'kph', 'temperature': '°C'} +PROTECT_VARS = ['co_status', + 'smoke_status', + 'battery_level'] + SENSOR_TEMP_TYPES = ['temperature', 'target'] -_VALID_SENSOR_TYPES = SENSOR_TYPES + SENSOR_TEMP_TYPES + \ +_VALID_SENSOR_TYPES = SENSOR_TYPES + SENSOR_TEMP_TYPES + PROTECT_VARS + \ list(WEATHER_VARS.keys()) PLATFORM_SCHEMA = vol.Schema({ @@ -44,20 +50,34 @@ PLATFORM_SCHEMA = vol.Schema({ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Nest Sensor.""" - for structure, device in nest.devices(): + for structure, device in chain(nest.devices(), nest.protect_devices()): sensors = [NestBasicSensor(structure, device, variable) for variable in config[CONF_MONITORED_CONDITIONS] - if variable in SENSOR_TYPES] + if variable in SENSOR_TYPES and is_thermostat(device)] sensors += [NestTempSensor(structure, device, variable) for variable in config[CONF_MONITORED_CONDITIONS] - if variable in SENSOR_TEMP_TYPES] + if variable in SENSOR_TEMP_TYPES and is_thermostat(device)] sensors += [NestWeatherSensor(structure, device, WEATHER_VARS[variable]) for variable in config[CONF_MONITORED_CONDITIONS] - if variable in WEATHER_VARS] + if variable in WEATHER_VARS and is_thermostat(device)] + sensors += [NestProtectSensor(structure, device, variable) + for variable in config[CONF_MONITORED_CONDITIONS] + if variable in PROTECT_VARS and is_protect(device)] + add_devices(sensors) +def is_thermostat(device): + """Target devices that are Nest Thermostats.""" + return bool(device.__class__.__name__ == 'Device') + + +def is_protect(device): + """Target devices that are Nest Protect Smoke Alarms.""" + return bool(device.__class__.__name__ == 'ProtectDevice') + + class NestSensor(Entity): """Representation of a Nest sensor.""" @@ -130,3 +150,28 @@ class NestWeatherSensor(NestSensor): def unit_of_measurement(self): """Return the unit the value is expressed in.""" return SENSOR_UNITS.get(self.variable, None) + + +class NestProtectSensor(NestSensor): + """Return the state of nest protect.""" + + @property + def state(self): + """Return the state of the sensor.""" + state = getattr(self.device, self.variable) + if self.variable == 'battery_level': + return getattr(self.device, self.variable) + else: + if state == 0: + return 'Ok' + if state == 1 or state == 2: + return 'Warning' + if state == 3: + return 'Emergency' + + return 'Unknown' + + @property + def name(self): + """Return the name of the nest, if any.""" + return "{} {}".format(self.device.where.capitalize(), self.variable) diff --git a/requirements_all.txt b/requirements_all.txt index 7b9b57ee158..60461a5eddf 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -245,7 +245,7 @@ python-forecastio==1.3.4 python-mpd2==0.5.5 # homeassistant.components.nest -python-nest==2.6.0 +python-nest==2.9.1 # homeassistant.components.device_tracker.nmap_tracker python-nmap==0.6.0