diff --git a/homeassistant/components/sensor/verisure.py b/homeassistant/components/sensor/verisure.py index 6f4f8054772..12ca073ceab 100644 --- a/homeassistant/components/sensor/verisure.py +++ b/homeassistant/components/sensor/verisure.py @@ -8,10 +8,13 @@ import logging import homeassistant.components.verisure as verisure from homeassistant.helpers.entity import Entity -from homeassistant.const import STATE_OPEN, STATE_CLOSED +from homeassistant.const import TEMP_CELCIUS _LOGGER = logging.getLogger(__name__) +DEPENDENCIES = ['verisure'] + + def setup_platform(hass, config, add_devices, discovery_info=None): """ Sets up the Verisure platform. """ @@ -19,14 +22,17 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.error('A connection has not been made to Verisure mypages.') return False - sensors = [ - VerisureClimateDevice(status) for status - in verisure.MY_PAGES.get_climate_status()] + sensors = [] sensors.extend([ - VerisureAlarmDevice(status) for status - in verisure.MY_PAGES.get_alarm_status()]) + VerisureClimateDevice(value) + for value in verisure.get_climate_status().values() + ]) + sensors.extend([ + VerisureAlarmDevice(value) + for value in verisure.get_alarm_status().values() + ]) add_devices(sensors) @@ -35,31 +41,45 @@ class VerisureClimateDevice(Entity): """ represents a Verisure climate sensor within home assistant. """ def __init__(self, climate_status): - self._status = climate_status - + self._id = climate_status.id + self._device = verisure.MY_PAGES.DEVICE_CLIMATE + @property def name(self): """ Returns the name of the device. """ - return self._status.location + return verisure.STATUS[self._device][self._id].location @property def state(self): """ Returns the state of the device. """ - return self._status.temperature + # remove ° character + return verisure.STATUS[self._device][self._id].temperature[:-1] + + @property + def unit_of_measurement(self): + """ Unit of measurement of this entity """ + return TEMP_CELCIUS # can verisure report in fahrenheit? + + def update(self): + verisure.update() class VerisureAlarmDevice(Entity): - """ represents a Verisure alarm remote control within home assistant. """ - + """ represents a Verisure alarm status within home assistant. """ + def __init__(self, alarm_status): - self._status = alarm_status - + self._id = alarm_status.id + self._device = verisure.MY_PAGES.DEVICE_ALARM + @property def name(self): """ Returns the name of the device. """ - return 'Alarm {}'.format(self._status.id) + return 'Alarm {}'.format(self._id) @property def state(self): """ Returns the state of the device. """ - return self._status.status + return verisure.STATUS[self._device][self._id].status + + def update(self): + verisure.update() diff --git a/homeassistant/components/switch/verisure.py b/homeassistant/components/switch/verisure.py new file mode 100644 index 00000000000..98979b400ed --- /dev/null +++ b/homeassistant/components/switch/verisure.py @@ -0,0 +1,67 @@ +""" +homeassistant.components.switch.verisure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Support for Verisure Smartplugs + +Configuration: + +switch: + platform: verisure + +Variables: + +""" +import logging + +import homeassistant.components.verisure as verisure +from homeassistant.components.switch import SwitchDevice + +DEPENDENCIES = ['verisure'] + +_LOGGER = logging.getLogger(__name__) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Sets up the Arduino platform. """ + + if not verisure.MY_PAGES: + _LOGGER.error('A connection has not been made to Verisure mypages.') + return False + + switches = [] + + switches.extend([ + VerisureSmartplug(value) + for value in verisure.get_smartplug_status().values() + ]) + + add_devices(switches) + + +class VerisureSmartplug(SwitchDevice): + """ Represents a Verisure smartplug. """ + def __init__(self, smartplug_status): + self._id = smartplug_status.id + + @property + def name(self): + """ Get the name (location) of the smartplug. """ + return verisure.get_smartplug_status()[self._id].location + + @property + def is_on(self): + """ Returns True if on """ + plug_status = verisure.get_smartplug_status()[self._id].status + return plug_status == verisure.MY_PAGES.SMARTPLUG_ON + + def turn_on(self): + """ Set smartplug status on """ + verisure.MY_PAGES.set_smartplug_status( + self._id, + verisure.MY_PAGES.SMARTPLUG_ON) + + def turn_off(self): + """ Set smartplug status off. """ + verisure.MY_PAGES.set_smartplug_status( + self._id, + verisure.MY_PAGES.SMARTPLUG_OFF) diff --git a/homeassistant/components/verisure.py b/homeassistant/components/verisure.py index 77a34ad979d..f902381fbb9 100644 --- a/homeassistant/components/verisure.py +++ b/homeassistant/components/verisure.py @@ -3,24 +3,27 @@ components.verisure ~~~~~~~~~~~~~~~~~~ """ import logging +from datetime import timedelta -from homeassistant import bootstrap from homeassistant.helpers import validate_config -from homeassistant.loader import get_component +from homeassistant.util import Throttle from homeassistant.const import ( EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, - CONF_USERNAME, CONF_PASSWORD, - EVENT_PLATFORM_DISCOVERED, - ATTR_SERVICE, ATTR_DISCOVERED, ATTR_FRIENDLY_NAME) + CONF_USERNAME, CONF_PASSWORD) DOMAIN = "verisure" DEPENDENCIES = [] -REQUIREMENTS = ['https://github.com/persandstrom/python-verisure/archive/master.zip'] +REQUIREMENTS = [ + 'https://github.com/persandstrom/python-verisure/archive/master.zip' + ] -MY_PAGES = None _LOGGER = logging.getLogger(__name__) -DISCOVER_SENSORS = "wink.sensors" +MY_PAGES = None +STATUS = {} + +MIN_TIME_BETWEEN_REQUESTS = timedelta(seconds=5) + def setup(hass, config): """ Setup the Verisure component. """ @@ -31,27 +34,57 @@ def setup(hass, config): return False from verisure import MyPages + + STATUS[MyPages.DEVICE_ALARM] = {} + STATUS[MyPages.DEVICE_CLIMATE] = {} + STATUS[MyPages.DEVICE_SMARTPLUG] = {} + global MY_PAGES - MY_PAGES = MyPages(config[DOMAIN][CONF_USERNAME], config[DOMAIN][CONF_PASSWORD]) + MY_PAGES = MyPages( + config[DOMAIN][CONF_USERNAME], + config[DOMAIN][CONF_PASSWORD]) MY_PAGES.login() - - component = get_component('sensor') - bootstrap.setup_component(hass, component.DOMAIN, config) - - # Fire discovery event - hass.bus.fire(EVENT_PLATFORM_DISCOVERED, { - ATTR_SERVICE: DISCOVER_SENSORS, - ATTR_DISCOVERED: {} - }) + update() def stop_verisure(event): - """ Stop the Arduino service. """ + """ Stop the Verisure service. """ MY_PAGES.logout() def start_verisure(event): - """ Start the Arduino service. """ + """ Start the Verisure service. """ hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_verisure) hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_verisure) return True + + +def get_alarm_status(): + ''' return a list of status overviews for alarm components ''' + return STATUS[MY_PAGES.DEVICE_ALARM] + + +def get_climate_status(): + ''' return a list of status overviews for alarm components ''' + return STATUS[MY_PAGES.DEVICE_CLIMATE] + + +def get_smartplug_status(): + ''' return a list of status overviews for alarm components ''' + return STATUS[MY_PAGES.DEVICE_SMARTPLUG] + + +@Throttle(MIN_TIME_BETWEEN_REQUESTS) +def update(): + ''' Updates the status of verisure components ''' + try: + for overview in MY_PAGES.get_overview(MY_PAGES.DEVICE_ALARM): + STATUS[MY_PAGES.DEVICE_ALARM][overview.id] = overview + for overview in MY_PAGES.get_overview(MY_PAGES.DEVICE_CLIMATE): + STATUS[MY_PAGES.DEVICE_CLIMATE][overview.id] = overview + for overview in MY_PAGES.get_overview(MY_PAGES.DEVICE_SMARTPLUG): + STATUS[MY_PAGES.DEVICE_SMARTPLUG][overview.id] = overview + except ConnectionError as ex: + _LOGGER.error('Caught connection error {}, tries to reconnect'.format( + ex)) + MY_PAGES.login()