From 203c1cfc96a2e400d37c282edd363f326effa7f5 Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Thu, 22 Dec 2016 14:22:07 -0500 Subject: [PATCH] Nest fixes (#5011) * Updated Nest API to have logical names * Fix NoneType not having replace method in NestSensor constructor * Move name setting to constructor, in case zone.name causes IO. * normalize is_online to online * Updated python-nest API * push is_* helpers down to python-nest, and use inheritence to implement rather than checking class name * Update python-nest --- .../components/binary_sensor/nest.py | 18 ++++----- homeassistant/components/camera/nest.py | 6 +-- homeassistant/components/climate/nest.py | 2 +- homeassistant/components/nest.py | 37 ++++++------------- homeassistant/components/sensor/nest.py | 21 +++-------- requirements_all.txt | 2 +- 6 files changed, 31 insertions(+), 55 deletions(-) diff --git a/homeassistant/components/binary_sensor/nest.py b/homeassistant/components/binary_sensor/nest.py index 070703df32a..c66373bc58a 100644 --- a/homeassistant/components/binary_sensor/nest.py +++ b/homeassistant/components/binary_sensor/nest.py @@ -13,8 +13,7 @@ from homeassistant.components.binary_sensor import ( BinarySensorDevice, PLATFORM_SCHEMA) from homeassistant.components.sensor.nest import NestSensor from homeassistant.const import (CONF_SCAN_INTERVAL, CONF_MONITORED_CONDITIONS) -from homeassistant.components.nest import ( - DATA_NEST, is_thermostat, is_camera) +from homeassistant.components.nest import DATA_NEST import homeassistant.helpers.config_validation as cv DEPENDENCIES = ['nest'] @@ -76,9 +75,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.error(wstr) sensors = [] - device_chain = chain(nest.devices(), - nest.protect_devices(), - nest.camera_devices()) + device_chain = chain(nest.thermostats(), + nest.smoke_co_alarms(), + nest.cameras()) for structure, device in device_chain: sensors += [NestBinarySensor(structure, device, variable) for variable in conf @@ -86,9 +85,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None): sensors += [NestBinarySensor(structure, device, variable) for variable in conf if variable in CLIMATE_BINARY_TYPES - and is_thermostat(device)] + and device.is_thermostat] - if is_camera(device): + if device.is_camera: sensors += [NestBinarySensor(structure, device, variable) for variable in conf if variable in CAMERA_BINARY_TYPES] @@ -118,13 +117,14 @@ class NestActivityZoneSensor(NestBinarySensor): def __init__(self, structure, device, zone): """Initialize the sensor.""" - super(NestActivityZoneSensor, self).__init__(structure, device, None) + super(NestActivityZoneSensor, self).__init__(structure, device, "") self.zone = zone + self._name = "{} {} activity".format(self._name, self.zone.name) @property def name(self): """Return the name of the nest, if any.""" - return "{} {} activity".format(self._name, self.zone.name) + return self._name def update(self): """Retrieve latest state.""" diff --git a/homeassistant/components/camera/nest.py b/homeassistant/components/camera/nest.py index aa2041e07a6..6ffb7ef8561 100644 --- a/homeassistant/components/camera/nest.py +++ b/homeassistant/components/camera/nest.py @@ -27,7 +27,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is None: return - camera_devices = hass.data[nest.DATA_NEST].camera_devices() + camera_devices = hass.data[nest.DATA_NEST].cameras() cameras = [NestCamera(structure, device) for structure, device in camera_devices] add_devices(cameras, True) @@ -43,7 +43,7 @@ class NestCamera(Camera): self.device = device self._location = None self._name = None - self._is_online = None + self._online = None self._is_streaming = None self._is_video_history_enabled = False # Default to non-NestAware subscribed, but will be fixed during update @@ -76,7 +76,7 @@ class NestCamera(Camera): """Cache value from Python-nest.""" self._location = self.device.where self._name = self.device.name - self._is_online = self.device.is_online + self._online = self.device.online self._is_streaming = self.device.is_streaming self._is_video_history_enabled = self.device.is_video_history_enabled diff --git a/homeassistant/components/climate/nest.py b/homeassistant/components/climate/nest.py index e098c3c3709..32cae5c4cec 100644 --- a/homeassistant/components/climate/nest.py +++ b/homeassistant/components/climate/nest.py @@ -40,7 +40,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): add_devices( [NestThermostat(structure, device, temp_unit) - for structure, device in hass.data[DATA_NEST].devices()], + for structure, device in hass.data[DATA_NEST].thermostats()], True ) diff --git a/homeassistant/components/nest.py b/homeassistant/components/nest.py index cd871c8e039..30a256f1c37 100644 --- a/homeassistant/components/nest.py +++ b/homeassistant/components/nest.py @@ -19,8 +19,8 @@ _LOGGER = logging.getLogger(__name__) REQUIREMENTS = [ 'http://github.com/technicalpickles/python-nest' - '/archive/b8391d2b3cb8682f8b0c2bdff477179983609f39.zip' # nest-cam branch - '#python-nest==3.0.2'] + '/archive/e6c9d56a8df455d4d7746389811f2c1387e8cb33.zip' # nest-cam branch + '#python-nest==3.0.3'] DOMAIN = 'nest' @@ -132,12 +132,12 @@ class NestDevice(object): self._structure = conf[CONF_STRUCTURE] _LOGGER.debug("Structures to include: %s", self._structure) - def devices(self): - """Generator returning list of devices and their location.""" + def thermostats(self): + """Generator returning list of thermostats and their location.""" try: for structure in self.nest.structures: if structure.name in self._structure: - for device in structure.devices: + for device in structure.thermostats: yield (structure, device) else: _LOGGER.debug("Ignoring structure %s, not in %s", @@ -146,12 +146,12 @@ class NestDevice(object): _LOGGER.error( "Connection error logging into the nest web service.") - def protect_devices(self): - """Generator returning list of protect devices.""" + def smoke_co_alarms(self): + """Generator returning list of smoke co alarams.""" try: for structure in self.nest.structures: if structure.name in self._structure: - for device in structure.protectdevices: + for device in structure.smoke_co_alarms: yield(structure, device) else: _LOGGER.info("Ignoring structure %s, not in %s", @@ -160,12 +160,12 @@ class NestDevice(object): _LOGGER.error( "Connection error logging into the nest web service.") - def camera_devices(self): - """Generator returning list of camera devices.""" + def cameras(self): + """Generator returning list of cameras.""" try: for structure in self.nest.structures: if structure.name in self._structure: - for device in structure.cameradevices: + for device in structure.cameras: yield(structure, device) else: _LOGGER.info("Ignoring structure %s, not in %s", @@ -173,18 +173,3 @@ class NestDevice(object): except socket.error: _LOGGER.error( "Connection error logging into the nest web service.") - - -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') - - -def is_camera(device): - """Target devices that are Nest Protect Smoke Alarms.""" - return bool(device.__class__.__name__ == 'CameraDevice') diff --git a/homeassistant/components/sensor/nest.py b/homeassistant/components/sensor/nest.py index f7bbf41cff9..a074dcc310d 100644 --- a/homeassistant/components/sensor/nest.py +++ b/homeassistant/components/sensor/nest.py @@ -9,7 +9,8 @@ import logging import voluptuous as vol -from homeassistant.components.nest import DATA_NEST, DOMAIN +from homeassistant.components.nest import ( + DATA_NEST, DOMAIN) from homeassistant.helpers.entity import Entity from homeassistant.const import ( TEMP_CELSIUS, TEMP_FAHRENHEIT, CONF_PLATFORM, @@ -93,31 +94,21 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.error(wstr) all_sensors = [] - for structure, device in chain(nest.devices(), nest.protect_devices()): + for structure, device in chain(nest.thermostats(), nest.smoke_co_alarms()): sensors = [NestBasicSensor(structure, device, variable) for variable in conf - if variable in SENSOR_TYPES and is_thermostat(device)] + if variable in SENSOR_TYPES and device.is_thermostat] sensors += [NestTempSensor(structure, device, variable) for variable in conf - if variable in SENSOR_TEMP_TYPES and is_thermostat(device)] + if variable in SENSOR_TEMP_TYPES and device.is_thermostat] sensors += [NestProtectSensor(structure, device, variable) for variable in conf - if variable in PROTECT_VARS and is_protect(device)] + if variable in PROTECT_VARS and device.is_smoke_co_alarm] all_sensors.extend(sensors) add_devices(all_sensors, True) -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.""" diff --git a/requirements_all.txt b/requirements_all.txt index f39a560f2f8..e9347202f62 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -174,7 +174,7 @@ hikvision==0.4 # http://github.com/adafruit/Adafruit_Python_DHT/archive/310c59b0293354d07d94375f1365f7b9b9110c7d.zip#Adafruit_DHT==1.3.0 # homeassistant.components.nest -http://github.com/technicalpickles/python-nest/archive/b8391d2b3cb8682f8b0c2bdff477179983609f39.zip#python-nest==3.0.2 +http://github.com/technicalpickles/python-nest/archive/e6c9d56a8df455d4d7746389811f2c1387e8cb33.zip#python-nest==3.0.3 # homeassistant.components.light.flux_led https://github.com/Danielhiversen/flux_led/archive/0.10.zip#flux_led==0.10