From d7e3c6a442fa43ca0597200618ea77577299cf5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20Sandstr=C3=B6m?= Date: Sat, 27 Feb 2016 21:50:19 +0100 Subject: [PATCH] verisure refactoring and fix reconnect --- .../alarm_control_panel/__init__.py | 2 +- .../alarm_control_panel/verisure.py | 59 +++-- homeassistant/components/lock/verisure.py | 49 ++--- homeassistant/components/sensor/verisure.py | 77 +++---- homeassistant/components/switch/verisure.py | 38 ++-- homeassistant/components/verisure.py | 205 +++++++++--------- requirements_all.txt | 2 +- 7 files changed, 213 insertions(+), 219 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index 310a65c6184..840350d231d 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -21,7 +21,7 @@ ENTITY_ID_FORMAT = DOMAIN + '.{}' # Maps discovered services to their platforms DISCOVERY_PLATFORMS = { - verisure.DISCOVER_SENSORS: 'verisure' + verisure.DISCOVER_ALARMS: 'verisure' } SERVICE_TO_METHOD = { diff --git a/homeassistant/components/alarm_control_panel/verisure.py b/homeassistant/components/alarm_control_panel/verisure.py index 40df158dce9..d89992eafed 100644 --- a/homeassistant/components/alarm_control_panel/verisure.py +++ b/homeassistant/components/alarm_control_panel/verisure.py @@ -9,7 +9,8 @@ https://home-assistant.io/components/verisure/ import logging import homeassistant.components.alarm_control_panel as alarm -import homeassistant.components.verisure as verisure +from homeassistant.components.verisure import HUB as hub + from homeassistant.const import ( STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED, STATE_UNKNOWN) @@ -20,18 +21,13 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices, discovery_info=None): """ Sets up the Verisure platform. """ - if not verisure.MY_PAGES: - _LOGGER.error('A connection has not been made to Verisure mypages.') - return False - alarms = [] - - alarms.extend([ - VerisureAlarm(value) - for value in verisure.ALARM_STATUS.values() - if verisure.SHOW_ALARM - ]) - + if int(hub.config.get('alarm', '1')): + hub.update_alarms() + alarms.extend([ + VerisureAlarm(value.id) + for value in hub.alarm_status.values() + ]) add_devices(alarms) @@ -39,9 +35,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class VerisureAlarm(alarm.AlarmControlPanel): """ Represents a Verisure alarm status. """ - def __init__(self, alarm_status): - self._id = alarm_status.id + def __init__(self, device_id): + self._id = device_id self._state = STATE_UNKNOWN + self._digits = int(hub.config.get('code_digits', '4')) @property def name(self): @@ -55,41 +52,41 @@ class VerisureAlarm(alarm.AlarmControlPanel): @property def code_format(self): - """ Four digit code required. """ - return '^\\d{%s}$' % verisure.CODE_DIGITS + """ code format as regex """ + return '^\\d{%s}$' % self._digits def update(self): """ Update alarm status """ - verisure.update_alarm() + hub.update_alarms() - if verisure.ALARM_STATUS[self._id].status == 'unarmed': + if hub.alarm_status[self._id].status == 'unarmed': self._state = STATE_ALARM_DISARMED - elif verisure.ALARM_STATUS[self._id].status == 'armedhome': + elif hub.alarm_status[self._id].status == 'armedhome': self._state = STATE_ALARM_ARMED_HOME - elif verisure.ALARM_STATUS[self._id].status == 'armed': + elif hub.alarm_status[self._id].status == 'armed': self._state = STATE_ALARM_ARMED_AWAY - elif verisure.ALARM_STATUS[self._id].status != 'pending': + elif hub.alarm_status[self._id].status != 'pending': _LOGGER.error( 'Unknown alarm state %s', - verisure.ALARM_STATUS[self._id].status) + hub.alarm_status[self._id].status) def alarm_disarm(self, code=None): """ Send disarm command. """ - verisure.MY_PAGES.alarm.set(code, 'DISARMED') + hub.my_pages.alarm.set(code, 'DISARMED') _LOGGER.info('verisure alarm disarming') - verisure.MY_PAGES.alarm.wait_while_pending() - verisure.update_alarm() + hub.my_pages.alarm.wait_while_pending() + self.update() def alarm_arm_home(self, code=None): """ Send arm home command. """ - verisure.MY_PAGES.alarm.set(code, 'ARMED_HOME') + hub.my_pages.alarm.set(code, 'ARMED_HOME') _LOGGER.info('verisure alarm arming home') - verisure.MY_PAGES.alarm.wait_while_pending() - verisure.update_alarm() + hub.my_pages.alarm.wait_while_pending() + self.update() def alarm_arm_away(self, code=None): """ Send arm away command. """ - verisure.MY_PAGES.alarm.set(code, 'ARMED_AWAY') + hub.my_pages.alarm.set(code, 'ARMED_AWAY') _LOGGER.info('verisure alarm arming away') - verisure.MY_PAGES.alarm.wait_while_pending() - verisure.update_alarm() + hub.my_pages.alarm.wait_while_pending() + self.update() diff --git a/homeassistant/components/lock/verisure.py b/homeassistant/components/lock/verisure.py index 6b73793e612..2542e51bacc 100644 --- a/homeassistant/components/lock/verisure.py +++ b/homeassistant/components/lock/verisure.py @@ -8,7 +8,7 @@ https://home-assistant.io/components/verisure/ """ import logging -import homeassistant.components.verisure as verisure +from homeassistant.components.verisure import HUB as hub from homeassistant.components.lock import LockDevice from homeassistant.const import STATE_LOCKED, STATE_UNKNOWN, STATE_UNLOCKED @@ -19,16 +19,13 @@ ATTR_CODE = 'code' def setup_platform(hass, config, add_devices, discovery_info=None): """ Sets up the Verisure platform. """ - if not verisure.MY_PAGES: - _LOGGER.error('A connection has not been made to Verisure mypages.') - return False - locks = [] - - locks.extend([VerisureDoorlock(value) - for value in verisure.LOCK_STATUS.values() - if verisure.SHOW_LOCKS]) - + if int(hub.config.get('locks', '1')): + hub.update_locks() + locks.extend([ + VerisureDoorlock(device_id) + for device_id in hub.lock_status.keys() + ]) add_devices(locks) @@ -36,10 +33,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class VerisureDoorlock(LockDevice): """ Represents a Verisure doorlock status. """ - def __init__(self, lock_status, code=None): - self._id = lock_status.id + def __init__(self, device_id): + self._id = device_id self._state = STATE_UNKNOWN - self._code = code + self._digits = int(hub.config.get('code_digits', '4')) @property def name(self): @@ -54,36 +51,36 @@ class VerisureDoorlock(LockDevice): @property def code_format(self): """ Six digit code required. """ - return '^\\d{%s}$' % verisure.CODE_DIGITS + return '^\\d{%s}$' % self._digits def update(self): """ Update lock status """ - verisure.update_lock() + hub.update_locks() - if verisure.LOCK_STATUS[self._id].status == 'unlocked': + if hub.lock_status[self._id].status == 'unlocked': self._state = STATE_UNLOCKED - elif verisure.LOCK_STATUS[self._id].status == 'locked': + elif hub.lock_status[self._id].status == 'locked': self._state = STATE_LOCKED - elif verisure.LOCK_STATUS[self._id].status != 'pending': + elif hub.lock_status[self._id].status != 'pending': _LOGGER.error( 'Unknown lock state %s', - verisure.LOCK_STATUS[self._id].status) + hub.lock_status[self._id].status) @property def is_locked(self): """ True if device is locked. """ - return verisure.LOCK_STATUS[self._id].status + return hub.lock_status[self._id].status def unlock(self, **kwargs): """ Send unlock command. """ - verisure.MY_PAGES.lock.set(kwargs[ATTR_CODE], self._id, 'UNLOCKED') + hub.my_pages.lock.set(kwargs[ATTR_CODE], self._id, 'UNLOCKED') _LOGGER.info('verisure doorlock unlocking') - verisure.MY_PAGES.lock.wait_while_pending() - verisure.update_lock() + hub.my_pages.lock.wait_while_pending() + self.update() def lock(self, **kwargs): """ Send lock command. """ - verisure.MY_PAGES.lock.set(kwargs[ATTR_CODE], self._id, 'LOCKED') + hub.my_pages.lock.set(kwargs[ATTR_CODE], self._id, 'LOCKED') _LOGGER.info('verisure doorlock locking') - verisure.MY_PAGES.lock.wait_while_pending() - verisure.update_lock() + hub.my_pages.lock.wait_while_pending() + self.update() diff --git a/homeassistant/components/sensor/verisure.py b/homeassistant/components/sensor/verisure.py index 12cafea0f41..c42642bed72 100644 --- a/homeassistant/components/sensor/verisure.py +++ b/homeassistant/components/sensor/verisure.py @@ -6,7 +6,7 @@ documentation at https://home-assistant.io/components/verisure/ """ import logging -import homeassistant.components.verisure as verisure +from homeassistant.components.verisure import HUB as hub from homeassistant.const import TEMP_CELCIUS from homeassistant.helpers.entity import Entity @@ -15,32 +15,33 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices, discovery_info=None): """Sets up the Verisure platform.""" - if not verisure.MY_PAGES: - _LOGGER.error('A connection has not been made to Verisure mypages.') - return False sensors = [] - sensors.extend([ - VerisureThermometer(value) - for value in verisure.CLIMATE_STATUS.values() - if verisure.SHOW_THERMOMETERS and - hasattr(value, 'temperature') and value.temperature - ]) + if int(hub.config.get('temperature', '1')): + hub.update_climate() + sensors.extend([ + VerisureThermometer(value.id) + for value in hub.climate_status.values() + if hasattr(value, 'temperature') and value.temperature + ]) - sensors.extend([ - VerisureHygrometer(value) - for value in verisure.CLIMATE_STATUS.values() - if verisure.SHOW_HYGROMETERS and - hasattr(value, 'humidity') and value.humidity - ]) + if int(hub.config.get('hygrometers', '1')): + hub.update_climate() + sensors.extend([ + VerisureHygrometer(value.id) + for value in hub.climate_status.values() + if hasattr(value, 'humidity') and value.humidity + ]) - sensors.extend([ - VerisureMouseDetection(value) - for value in verisure.MOUSEDETECTION_STATUS.values() - if verisure.SHOW_MOUSEDETECTION and - hasattr(value, 'amountText') and value.amountText - ]) + if int(hub.config.get('mouse', '1')): + hub.update_mousedetection() + sensors.extend([ + VerisureMouseDetection(value.deviceLabel) + for value in hub.mouse_status.values() + # is this if needed? + if hasattr(value, 'amountText') and value.amountText + ]) add_devices(sensors) @@ -48,21 +49,21 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class VerisureThermometer(Entity): """Represents a Verisure thermometer.""" - def __init__(self, climate_status): - self._id = climate_status.id + def __init__(self, device_id): + self._id = device_id @property def name(self): """Returns the name of the device.""" return '{} {}'.format( - verisure.CLIMATE_STATUS[self._id].location, + hub.climate_status[self._id].location, "Temperature") @property def state(self): """Returns the state of the device.""" # remove ° character - return verisure.CLIMATE_STATUS[self._id].temperature[:-1] + return hub.climate_status[self._id].temperature[:-1] @property def unit_of_measurement(self): @@ -71,27 +72,27 @@ class VerisureThermometer(Entity): def update(self): """Update the sensor.""" - verisure.update_climate() + hub.update_climate() class VerisureHygrometer(Entity): """Represents a Verisure hygrometer.""" - def __init__(self, climate_status): - self._id = climate_status.id + def __init__(self, device_id): + self._id = device_id @property def name(self): """Returns the name of the sensor.""" return '{} {}'.format( - verisure.CLIMATE_STATUS[self._id].location, + hub.climate_status[self._id].location, "Humidity") @property def state(self): """Returns the state of the sensor.""" # remove % character - return verisure.CLIMATE_STATUS[self._id].humidity[:-1] + return hub.climate_status[self._id].humidity[:-1] @property def unit_of_measurement(self): @@ -99,27 +100,27 @@ class VerisureHygrometer(Entity): return "%" def update(self): - """Update sensor the sensor.""" - verisure.update_climate() + """Update the sensor.""" + hub.update_climate() class VerisureMouseDetection(Entity): """ Represents a Verisure mouse detector.""" - def __init__(self, mousedetection_status): - self._id = mousedetection_status.deviceLabel + def __init__(self, device_id): + self._id = device_id @property def name(self): """Returns the name of the sensor.""" return '{} {}'.format( - verisure.MOUSEDETECTION_STATUS[self._id].location, + hub.mouse_status[self._id].location, "Mouse") @property def state(self): """Returns the state of the sensor.""" - return verisure.MOUSEDETECTION_STATUS[self._id].count + return hub.mouse_status[self._id].count @property def unit_of_measurement(self): @@ -128,4 +129,4 @@ class VerisureMouseDetection(Entity): def update(self): """Update the sensor.""" - verisure.update_mousedetection() + hub.update_mousedetection() diff --git a/homeassistant/components/switch/verisure.py b/homeassistant/components/switch/verisure.py index c698a33ce18..815e7a18631 100644 --- a/homeassistant/components/switch/verisure.py +++ b/homeassistant/components/switch/verisure.py @@ -8,7 +8,7 @@ documentation at https://home-assistant.io/components/verisure/ """ import logging -import homeassistant.components.verisure as verisure +from homeassistant.components.verisure import HUB as hub from homeassistant.components.switch import SwitchDevice _LOGGER = logging.getLogger(__name__) @@ -16,49 +16,43 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices, discovery_info=None): """ Sets up the Verisure platform. """ - - if not verisure.MY_PAGES: - _LOGGER.error('A connection has not been made to Verisure mypages.') + if not int(hub.config.get('smartplugs', '1')): return False + hub.update_smartplugs() switches = [] - switches.extend([ - VerisureSmartplug(value) - for value in verisure.SMARTPLUG_STATUS.values() - if verisure.SHOW_SMARTPLUGS - ]) - + VerisureSmartplug(value.id) + for value in hub.smartplug_status.values()]) add_devices(switches) class VerisureSmartplug(SwitchDevice): """ Represents a Verisure smartplug. """ - def __init__(self, smartplug_status): - self._id = smartplug_status.id + def __init__(self, device_id): + self._id = device_id @property def name(self): """ Get the name (location) of the smartplug. """ - return verisure.SMARTPLUG_STATUS[self._id].location + return hub.smartplug_status[self._id].location @property def is_on(self): """ Returns True if on """ - plug_status = verisure.SMARTPLUG_STATUS[self._id].status - return plug_status == 'on' + return hub.smartplug_status[self._id].status == 'on' def turn_on(self): """ Set smartplug status on. """ - verisure.MY_PAGES.smartplug.set(self._id, 'on') - verisure.MY_PAGES.smartplug.wait_while_updating(self._id, 'on') - verisure.update_smartplug() + hub.my_pages.smartplug.set(self._id, 'on') + hub.my_pages.smartplug.wait_while_updating(self._id, 'on') + self.update() def turn_off(self): """ Set smartplug status off. """ - verisure.MY_PAGES.smartplug.set(self._id, 'off') - verisure.MY_PAGES.smartplug.wait_while_updating(self._id, 'off') - verisure.update_smartplug() + hub.my_pages.smartplug.set(self._id, 'off') + hub.my_pages.smartplug.wait_while_updating(self._id, 'off') + self.update() def update(self): - verisure.update_smartplug() + hub.update_smartplugs() diff --git a/homeassistant/components/verisure.py b/homeassistant/components/verisure.py index 2e8af9b3129..18085c25ee9 100644 --- a/homeassistant/components/verisure.py +++ b/homeassistant/components/verisure.py @@ -7,6 +7,7 @@ For more details about this component, please refer to the documentation at https://home-assistant.io/components/verisure/ """ import logging +import threading import time from datetime import timedelta @@ -24,33 +25,11 @@ DISCOVER_SWITCHES = 'verisure.switches' DISCOVER_ALARMS = 'verisure.alarm_control_panel' DISCOVER_LOCKS = 'verisure.lock' -DEPENDENCIES = ['alarm_control_panel'] -REQUIREMENTS = ['vsure==0.5.1'] +REQUIREMENTS = ['vsure==0.6.1'] _LOGGER = logging.getLogger(__name__) -MY_PAGES = None -ALARM_STATUS = {} -SMARTPLUG_STATUS = {} -CLIMATE_STATUS = {} -LOCK_STATUS = {} -MOUSEDETECTION_STATUS = {} - -VERISURE_LOGIN_ERROR = None -VERISURE_ERROR = None - -SHOW_THERMOMETERS = True -SHOW_HYGROMETERS = True -SHOW_ALARM = True -SHOW_SMARTPLUGS = True -SHOW_LOCKS = True -SHOW_MOUSEDETECTION = True -CODE_DIGITS = 4 - -# if wrong password was given don't try again -WRONG_PASSWORD_GIVEN = False - -MIN_TIME_BETWEEN_REQUESTS = timedelta(seconds=1) +HUB = None def setup(hass, config): @@ -61,48 +40,19 @@ def setup(hass, config): _LOGGER): return False - from verisure import MyPages, LoginError, Error - - global SHOW_THERMOMETERS, SHOW_HYGROMETERS,\ - SHOW_ALARM, SHOW_SMARTPLUGS, SHOW_LOCKS, SHOW_MOUSEDETECTION,\ - CODE_DIGITS - SHOW_THERMOMETERS = int(config[DOMAIN].get('thermometers', '1')) - SHOW_HYGROMETERS = int(config[DOMAIN].get('hygrometers', '1')) - SHOW_ALARM = int(config[DOMAIN].get('alarm', '1')) - SHOW_SMARTPLUGS = int(config[DOMAIN].get('smartplugs', '1')) - SHOW_LOCKS = int(config[DOMAIN].get('locks', '1')) - SHOW_MOUSEDETECTION = int(config[DOMAIN].get('mouse', '1')) - CODE_DIGITS = int(config[DOMAIN].get('code_digits', '4')) - - global MY_PAGES - MY_PAGES = MyPages( - config[DOMAIN][CONF_USERNAME], - config[DOMAIN][CONF_PASSWORD]) - global VERISURE_LOGIN_ERROR, VERISURE_ERROR - VERISURE_LOGIN_ERROR = LoginError - VERISURE_ERROR = Error - - try: - MY_PAGES.login() - except (ConnectionError, Error) as ex: - _LOGGER.error('Could not log in to verisure mypages, %s', ex) + import verisure + global HUB + HUB = VerisureHub(config[DOMAIN], verisure) + if not HUB.login(): return False - update_alarm() - update_climate() - update_smartplug() - update_lock() - update_mousedetection() - # Load components for the devices in the ISY controller that we support for comp_name, discovery in ((('sensor', DISCOVER_SENSORS), ('switch', DISCOVER_SWITCHES), ('alarm_control_panel', DISCOVER_ALARMS), ('lock', DISCOVER_LOCKS))): component = get_component(comp_name) - _LOGGER.info(config[DOMAIN]) bootstrap.setup_component(hass, component.DOMAIN, config) - hass.bus.fire(EVENT_PLATFORM_DISCOVERED, {ATTR_SERVICE: discovery, ATTR_DISCOVERED: {}}) @@ -110,58 +60,113 @@ def setup(hass, config): return True -def reconnect(): - """ Reconnect to verisure mypages. """ - try: - time.sleep(1) - MY_PAGES.login() - except VERISURE_LOGIN_ERROR as ex: - _LOGGER.error("Could not login to Verisure mypages, %s", ex) - global WRONG_PASSWORD_GIVEN - WRONG_PASSWORD_GIVEN = True - except (ConnectionError, VERISURE_ERROR) as ex: - _LOGGER.error("Could not login to Verisure mypages, %s", ex) +# pylint: disable=too-many-instance-attributes +class VerisureHub(object): + """ Verisure wrapper class """ + MAX_PASSWORD_RETRIES = 2 + MIN_TIME_BETWEEN_REQUESTS = 1 -@Throttle(MIN_TIME_BETWEEN_REQUESTS) -def update_alarm(): - """ Updates the status of alarms. """ - update_component(MY_PAGES.alarm.get, ALARM_STATUS) + def __init__(self, domain_config, verisure): + self.alarm_status = {} + self.lock_status = {} + self.climate_status = {} + self.mouse_status = {} + self.smartplug_status = {} + self.config = domain_config + self._verisure = verisure -@Throttle(MIN_TIME_BETWEEN_REQUESTS) -def update_climate(): - """ Updates the status of climate sensors. """ - update_component(MY_PAGES.climate.get, CLIMATE_STATUS) + self._lock = threading.Lock() + self._password_retries = VerisureHub.MAX_PASSWORD_RETRIES + self._wrong_password_given = False + self._reconnect_timeout = time.time() -@Throttle(MIN_TIME_BETWEEN_REQUESTS) -def update_smartplug(): - """ Updates the status of smartplugs. """ - update_component(MY_PAGES.smartplug.get, SMARTPLUG_STATUS) + self.my_pages = verisure.MyPages( + domain_config[CONF_USERNAME], + domain_config[CONF_PASSWORD]) + def login(self): + """ Login to MyPages """ + try: + self.my_pages.login() + except self._verisure.Error as ex: + _LOGGER.error('Could not log in to verisure mypages, %s', ex) + return False + return True -def update_lock(): - """ Updates the status of alarms. """ - update_component(MY_PAGES.lock.get, LOCK_STATUS) + @Throttle(timedelta(seconds=1)) + def update_alarms(self): + """ Updates the status of the alarm. """ + self.update_component( + self.my_pages.alarm.get, + self.alarm_status) + @Throttle(timedelta(seconds=1)) + def update_locks(self): + """ Updates the status of the alarm. """ + self.update_component( + self.my_pages.lock.get, + self.lock_status) -def update_mousedetection(): - """ Updates the status of mouse detectors. """ - update_component(MY_PAGES.mousedetection.get, MOUSEDETECTION_STATUS) + @Throttle(timedelta(seconds=60)) + def update_climate(self): + """ Updates the status of the smartplugs. """ + self.update_component( + self.my_pages.climate.get, + self.climate_status) + @Throttle(timedelta(seconds=60)) + def update_mousedetection(self): + """ Updates the status of the smartplugs. """ + self.update_component( + self.my_pages.mousedetection.get, + self.mouse_status) -def update_component(get_function, status): - """ Updates the status of verisure components. """ - if WRONG_PASSWORD_GIVEN: - _LOGGER.error('Wrong password') - return - try: - for overview in get_function(): - try: - status[overview.id] = overview - except AttributeError: - status[overview.deviceLabel] = overview - except (ConnectionError, VERISURE_ERROR) as ex: - _LOGGER.error('Caught connection error %s, tries to reconnect', ex) - reconnect() + @Throttle(timedelta(seconds=1)) + def update_smartplugs(self): + """ Updates the status of the smartplugs. """ + self.update_component( + self.my_pages.smartplug.get, + self.smartplug_status) + + def update_component(self, get_function, status): + """ Updates the status of verisure components. """ + if self._wrong_password_given: + _LOGGER.error('Wrong password for Verisure, update config') + return + try: + for overview in get_function(): + try: + status[overview.id] = overview + except AttributeError: + status[overview.deviceLabel] = overview + except self._verisure.Error as ex: + _LOGGER.error('Caught connection error %s, tries to reconnect', ex) + self.reconnect() + + def reconnect(self): + """ Reconnect to verisure mypages. """ + if self._reconnect_timeout > time.time(): + return + if not self._lock.acquire(blocking=False): + return + try: + self.my_pages.login() + self._password_retries = VerisureHub.MAX_PASSWORD_RETRIES + except self._verisure.LoginError as ex: + _LOGGER.error("Wrong user name or password for Verisure MyPages") + if self._password_retries > 0: + self._password_retries -= 1 + self._reconnect_timeout = time.time() + 15 * 60 + else: + self._wrong_password_given = True + except self._verisure.MaintenanceError: + self._reconnect_timeout = time.time() + 60 + _LOGGER.error("Verisure MyPages down for maintenance") + except self._verisure.Error as ex: + _LOGGER.error("Could not login to Verisure MyPages, %s", ex) + self._reconnect_timeout = time.time() + 5 + finally: + self._lock.release() diff --git a/requirements_all.txt b/requirements_all.txt index 91ece24547b..c3732e5af07 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -271,7 +271,7 @@ urllib3 uvcclient==0.8 # homeassistant.components.verisure -vsure==0.5.1 +vsure==0.6.1 # homeassistant.components.zigbee xbee-helper==0.0.6