From 5a64ef2c98aa9cb40d8ffb5ee2b18b044bd0cc6e Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Tue, 23 Feb 2016 14:20:54 -0500 Subject: [PATCH] Moved Wink binary sensors to a binary sensor class --- .../components/binary_sensor/__init__.py | 29 ++++--- .../components/binary_sensor/wink.py | 81 +++++++++++++++++++ homeassistant/components/garage_door/wink.py | 2 +- homeassistant/components/light/wink.py | 2 +- homeassistant/components/lock/wink.py | 2 +- homeassistant/components/sensor/wink.py | 29 ++++++- homeassistant/components/switch/wink.py | 2 +- homeassistant/components/wink.py | 4 +- requirements_all.txt | 3 +- 9 files changed, 131 insertions(+), 23 deletions(-) create mode 100644 homeassistant/components/binary_sensor/wink.py diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index 313ae865816..2fddef9ca3a 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -10,25 +10,27 @@ import logging from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.entity import Entity from homeassistant.const import (STATE_ON, STATE_OFF) -from homeassistant.components import (bloomsky, mysensors, zwave) +from homeassistant.components import (bloomsky, mysensors, zwave, wink) DOMAIN = 'binary_sensor' SCAN_INTERVAL = 30 ENTITY_ID_FORMAT = DOMAIN + '.{}' SENSOR_CLASSES = [ - None, # Generic on/off - 'opening', # Door, window, etc - 'motion', # Motion sensor - 'gas', # CO, CO2, etc - 'smoke', # Smoke detector - 'moisture', # Specifically a wetness sensor - 'light', # Lightness threshold - 'power', # Power, over-current, etc - 'safety', # Generic on=unsafe, off=safe - 'heat', # On means hot (or too hot) - 'cold', # On means cold (or too cold) - 'moving', # On means moving, Off means stopped + None, # Generic on/off + 'opening', # Door, window, etc + 'motion', # Motion sensor + 'gas', # CO, CO2, etc + 'smoke', # Smoke detector + 'moisture', # Specifically a wetness sensor + 'light', # Lightness threshold + 'power', # Power, over-current, etc + 'safety', # Generic on=unsafe, off=safe + 'heat', # On means hot (or too hot) + 'cold', # On means cold (or too cold) + 'moving', # On means moving, Off means stopped + 'sound', # On means sound detected, Off means no sound + 'vibration', # On means vibration detected, Off means no vibration ] # Maps discovered services to their platforms @@ -36,6 +38,7 @@ DISCOVERY_PLATFORMS = { bloomsky.DISCOVER_BINARY_SENSORS: 'bloomsky', mysensors.DISCOVER_BINARY_SENSORS: 'mysensors', zwave.DISCOVER_BINARY_SENSORS: 'zwave', + wink.DISCOVER_BINARY_SENSORS: 'wink' } diff --git a/homeassistant/components/binary_sensor/wink.py b/homeassistant/components/binary_sensor/wink.py new file mode 100644 index 00000000000..8d858901849 --- /dev/null +++ b/homeassistant/components/binary_sensor/wink.py @@ -0,0 +1,81 @@ +""" +Support for Wink sensors. + +For more details about this platform, please refer to the documentation at +at https://home-assistant.io/components/sensor.wink/ +""" +import logging + +from homeassistant.components.binary_sensor import BinarySensorDevice +from homeassistant.const import CONF_ACCESS_TOKEN +from homeassistant.helpers.entity import Entity + +REQUIREMENTS = ['python-wink==0.6.2'] + +# These are the available sensors mapped to binary_sensor class +SENSOR_TYPES = { + "opened": "opening", + "brightness": "light", + "vibration": "vibration", + "loudness": "sound" +} + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Sets up the Wink platform.""" + import pywink + + if discovery_info is None: + token = config.get(CONF_ACCESS_TOKEN) + + if token is None: + logging.getLogger(__name__).error( + "Missing wink access_token. " + "Get one at https://winkbearertoken.appspot.com/") + return + + pywink.set_bearer_token(token) + + for sensor in pywink.get_sensors(): + if sensor.capability() in SENSOR_TYPES: + add_devices([WinkBinarySensorDevice(sensor)]) + + +class WinkBinarySensorDevice(BinarySensorDevice, Entity): + """Represents a Wink sensor.""" + + def __init__(self, wink): + self.wink = wink + self._unit_of_measurement = self.wink.UNIT + self.capability = self.wink.capability() + + @property + def is_on(self): + """Return True if the binary sensor is on.""" + if self.capability == "loudness": + return self.wink.loudness_boolean() + elif self.capability == "vibration": + return self.wink.vibration_boolean() + elif self.capability == "brightness": + return self.wink.brightness_boolean() + else: + return self.wink.state() + + @property + def sensor_class(self): + """Return the class of this sensor, from SENSOR_CLASSES.""" + return SENSOR_TYPES.get(self.capability) + + @property + def unique_id(self): + """ Returns the id of this wink sensor """ + return "{}.{}".format(self.__class__, self.wink.device_id()) + + @property + def name(self): + """ Returns the name of the sensor if any. """ + return self.wink.name() + + def update(self): + """ Update state of the sensor. """ + self.wink.update_state() diff --git a/homeassistant/components/garage_door/wink.py b/homeassistant/components/garage_door/wink.py index ad2bc3631aa..b6ac8aa6cd8 100644 --- a/homeassistant/components/garage_door/wink.py +++ b/homeassistant/components/garage_door/wink.py @@ -9,7 +9,7 @@ import logging from homeassistant.components.garage_door import GarageDoorDevice from homeassistant.const import CONF_ACCESS_TOKEN -REQUIREMENTS = ['python-wink==0.6.1'] +REQUIREMENTS = ['python-wink==0.6.2'] def setup_platform(hass, config, add_devices, discovery_info=None): diff --git a/homeassistant/components/light/wink.py b/homeassistant/components/light/wink.py index 07f18b0d612..560d08119df 100644 --- a/homeassistant/components/light/wink.py +++ b/homeassistant/components/light/wink.py @@ -11,7 +11,7 @@ import logging from homeassistant.components.light import ATTR_BRIGHTNESS, Light from homeassistant.const import CONF_ACCESS_TOKEN -REQUIREMENTS = ['python-wink==0.6.1'] +REQUIREMENTS = ['python-wink==0.6.2'] def setup_platform(hass, config, add_devices_callback, discovery_info=None): diff --git a/homeassistant/components/lock/wink.py b/homeassistant/components/lock/wink.py index 675b138d2c8..77037c4b205 100644 --- a/homeassistant/components/lock/wink.py +++ b/homeassistant/components/lock/wink.py @@ -11,7 +11,7 @@ import logging from homeassistant.components.lock import LockDevice from homeassistant.const import CONF_ACCESS_TOKEN -REQUIREMENTS = ['python-wink==0.6.1'] +REQUIREMENTS = ['python-wink==0.6.2'] def setup_platform(hass, config, add_devices, discovery_info=None): diff --git a/homeassistant/components/sensor/wink.py b/homeassistant/components/sensor/wink.py index ebdd01441c0..107bc25acf6 100644 --- a/homeassistant/components/sensor/wink.py +++ b/homeassistant/components/sensor/wink.py @@ -6,10 +6,13 @@ at https://home-assistant.io/components/sensor.wink/ """ import logging -from homeassistant.const import CONF_ACCESS_TOKEN, STATE_CLOSED, STATE_OPEN +from homeassistant.const import (CONF_ACCESS_TOKEN, STATE_CLOSED, + STATE_OPEN, TEMP_CELCIUS) from homeassistant.helpers.entity import Entity -REQUIREMENTS = ['python-wink==0.6.1'] +REQUIREMENTS = ['python-wink==0.6.2'] + +SENSOR_TYPES = ['temperature', 'humidity'] def setup_platform(hass, config, add_devices, discovery_info=None): @@ -27,7 +30,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): pywink.set_bearer_token(token) - add_devices(WinkSensorDevice(sensor) for sensor in pywink.get_sensors()) + for sensor in pywink.get_sensors(): + if sensor.capability() in SENSOR_TYPES: + add_devices([WinkSensorDevice(sensor)]) + add_devices(WinkEggMinder(eggtray) for eggtray in pywink.get_eggtrays()) @@ -36,11 +42,26 @@ class WinkSensorDevice(Entity): def __init__(self, wink): self.wink = wink + self.capability = self.wink.capability() + if self.wink.UNIT == "°": + self._unit_of_measurement = TEMP_CELCIUS + else: + self._unit_of_measurement = self.wink.UNIT @property def state(self): """Returns the state.""" - return STATE_OPEN if self.is_open else STATE_CLOSED + if self.capability == "humidity": + return self.wink.humidity_percentage() + elif self.capability == "temperature": + return self.wink.temperature_float() + else: + return STATE_OPEN if self.is_open else STATE_CLOSED + + @property + def unit_of_measurement(self): + """ Unit of measurement of this entity, if any. """ + return self._unit_of_measurement @property def unique_id(self): diff --git a/homeassistant/components/switch/wink.py b/homeassistant/components/switch/wink.py index 35e1fabc9a0..143bc391951 100644 --- a/homeassistant/components/switch/wink.py +++ b/homeassistant/components/switch/wink.py @@ -11,7 +11,7 @@ import logging from homeassistant.components.wink import WinkToggleDevice from homeassistant.const import CONF_ACCESS_TOKEN -REQUIREMENTS = ['python-wink==0.6.1'] +REQUIREMENTS = ['python-wink==0.6.2'] def setup_platform(hass, config, add_devices, discovery_info=None): diff --git a/homeassistant/components/wink.py b/homeassistant/components/wink.py index 5e1572a90d9..fadfbc9c83e 100644 --- a/homeassistant/components/wink.py +++ b/homeassistant/components/wink.py @@ -16,11 +16,12 @@ from homeassistant.helpers.entity import ToggleEntity from homeassistant.loader import get_component DOMAIN = "wink" -REQUIREMENTS = ['python-wink==0.6.1'] +REQUIREMENTS = ['python-wink==0.6.2'] DISCOVER_LIGHTS = "wink.lights" DISCOVER_SWITCHES = "wink.switches" DISCOVER_SENSORS = "wink.sensors" +DISCOVER_BINARY_SENSORS = "wink.binary_sensors" DISCOVER_LOCKS = "wink.locks" DISCOVER_GARAGE_DOORS = "wink.garage_doors" @@ -41,6 +42,7 @@ def setup(hass, config): ('switch', lambda: pywink.get_switches or pywink.get_sirens or pywink.get_powerstrip_outlets, DISCOVER_SWITCHES), + ('binary_sensor', pywink.get_sensors, DISCOVER_BINARY_SENSORS), ('sensor', lambda: pywink.get_sensors or pywink.get_eggtrays, DISCOVER_SENSORS), ('lock', pywink.get_locks, DISCOVER_LOCKS), diff --git a/requirements_all.txt b/requirements_all.txt index 91ece24547b..0337da10a41 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -201,12 +201,13 @@ python-telegram-bot==3.2.0 python-twitch==1.2.0 # homeassistant.components.wink +# homeassistant.components.binary_sensor.wink # homeassistant.components.garage_door.wink # homeassistant.components.light.wink # homeassistant.components.lock.wink # homeassistant.components.sensor.wink # homeassistant.components.switch.wink -python-wink==0.6.1 +python-wink==0.6.2 # homeassistant.components.keyboard pyuserinput==0.1.9