Support for Nest Protect smoke alarms (#2076)

* Support for Nest Protect smoke alarms

* Fixing formatting issues from tox
This commit is contained in:
Richard Cox 2016-05-15 12:29:12 -07:00 committed by Paulus Schoutsen
parent 49acdaa8fd
commit 0340710e5c
3 changed files with 63 additions and 8 deletions

View file

@ -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 For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/thermostat.nest/ https://home-assistant.io/components/thermostat.nest/
@ -11,7 +11,7 @@ import voluptuous as vol
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
REQUIREMENTS = ['python-nest==2.6.0'] REQUIREMENTS = ['python-nest==2.9.1']
DOMAIN = 'nest' DOMAIN = 'nest'
NEST = None NEST = None
@ -36,6 +36,16 @@ def devices():
_LOGGER.error("Connection error logging into the nest web service.") _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 # pylint: disable=unused-argument
def setup(hass, config): def setup(hass, config):
"""Setup the Nest thermostat component.""" """Setup the Nest thermostat component."""

View file

@ -4,6 +4,8 @@ Support for Nest Thermostat Sensors.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.nest/ https://home-assistant.io/components/sensor.nest/
""" """
from itertools import chain
import voluptuous as vol import voluptuous as vol
import homeassistant.components.nest as nest import homeassistant.components.nest as nest
@ -29,9 +31,13 @@ WEATHER_VARS = {'weather_humidity': 'humidity',
SENSOR_UNITS = {'humidity': '%', 'battery_level': 'V', SENSOR_UNITS = {'humidity': '%', 'battery_level': 'V',
'kph': 'kph', 'temperature': '°C'} 'kph': 'kph', 'temperature': '°C'}
PROTECT_VARS = ['co_status',
'smoke_status',
'battery_level']
SENSOR_TEMP_TYPES = ['temperature', 'target'] 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()) list(WEATHER_VARS.keys())
PLATFORM_SCHEMA = vol.Schema({ PLATFORM_SCHEMA = vol.Schema({
@ -44,20 +50,34 @@ PLATFORM_SCHEMA = vol.Schema({
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup the Nest Sensor.""" """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) sensors = [NestBasicSensor(structure, device, variable)
for variable in config[CONF_MONITORED_CONDITIONS] 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) sensors += [NestTempSensor(structure, device, variable)
for variable in config[CONF_MONITORED_CONDITIONS] 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, sensors += [NestWeatherSensor(structure, device,
WEATHER_VARS[variable]) WEATHER_VARS[variable])
for variable in config[CONF_MONITORED_CONDITIONS] 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) 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): class NestSensor(Entity):
"""Representation of a Nest sensor.""" """Representation of a Nest sensor."""
@ -130,3 +150,28 @@ class NestWeatherSensor(NestSensor):
def unit_of_measurement(self): def unit_of_measurement(self):
"""Return the unit the value is expressed in.""" """Return the unit the value is expressed in."""
return SENSOR_UNITS.get(self.variable, None) 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)

View file

@ -245,7 +245,7 @@ python-forecastio==1.3.4
python-mpd2==0.5.5 python-mpd2==0.5.5
# homeassistant.components.nest # homeassistant.components.nest
python-nest==2.6.0 python-nest==2.9.1
# homeassistant.components.device_tracker.nmap_tracker # homeassistant.components.device_tracker.nmap_tracker
python-nmap==0.6.0 python-nmap==0.6.0