148 lines
4.5 KiB
Python
148 lines
4.5 KiB
Python
"""
|
|
components.verisure
|
|
~~~~~~~~~~~~~~~~~~~
|
|
Provides support for verisure components.
|
|
|
|
For more details about this component, please refer to the documentation at
|
|
https://home-assistant.io/components/verisure.html
|
|
"""
|
|
import logging
|
|
from datetime import timedelta
|
|
|
|
from homeassistant import bootstrap
|
|
from homeassistant.loader import get_component
|
|
|
|
from homeassistant.helpers import validate_config
|
|
from homeassistant.util import Throttle
|
|
from homeassistant.const import (
|
|
EVENT_PLATFORM_DISCOVERED,
|
|
ATTR_SERVICE, ATTR_DISCOVERED,
|
|
CONF_USERNAME, CONF_PASSWORD)
|
|
|
|
|
|
DOMAIN = "verisure"
|
|
DISCOVER_SENSORS = 'verisure.sensors'
|
|
DISCOVER_SWITCHES = 'verisure.switches'
|
|
DISCOVER_ALARMS = 'verisure.alarm_control_panel'
|
|
|
|
DEPENDENCIES = ['alarm_control_panel']
|
|
REQUIREMENTS = [
|
|
'https://github.com/persandstrom/python-verisure/archive/'
|
|
'9873c4527f01b1ba1f72ae60f7f35854390d59be.zip#python-verisure==0.2.6'
|
|
]
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
MY_PAGES = None
|
|
STATUS = {}
|
|
|
|
VERISURE_LOGIN_ERROR = None
|
|
VERISURE_ERROR = None
|
|
|
|
SHOW_THERMOMETERS = True
|
|
SHOW_HYGROMETERS = True
|
|
SHOW_ALARM = True
|
|
SHOW_SMARTPLUGS = True
|
|
|
|
# if wrong password was given don't try again
|
|
WRONG_PASSWORD_GIVEN = False
|
|
|
|
MIN_TIME_BETWEEN_REQUESTS = timedelta(seconds=5)
|
|
|
|
|
|
def setup(hass, config):
|
|
""" Setup the Verisure component. """
|
|
|
|
if not validate_config(config,
|
|
{DOMAIN: [CONF_USERNAME, CONF_PASSWORD]},
|
|
_LOGGER):
|
|
return False
|
|
|
|
from verisure import MyPages, LoginError, Error
|
|
|
|
STATUS[MyPages.DEVICE_ALARM] = {}
|
|
STATUS[MyPages.DEVICE_CLIMATE] = {}
|
|
STATUS[MyPages.DEVICE_SMARTPLUG] = {}
|
|
|
|
global SHOW_THERMOMETERS, SHOW_HYGROMETERS, SHOW_ALARM, SHOW_SMARTPLUGS
|
|
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'))
|
|
|
|
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)
|
|
return False
|
|
|
|
update()
|
|
|
|
# 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))):
|
|
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: {}})
|
|
|
|
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]
|
|
|
|
|
|
def reconnect():
|
|
""" Reconnect to verisure mypages. """
|
|
try:
|
|
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)
|
|
|
|
|
|
@Throttle(MIN_TIME_BETWEEN_REQUESTS)
|
|
def update():
|
|
""" Updates the status of verisure components. """
|
|
if WRONG_PASSWORD_GIVEN:
|
|
_LOGGER.error('Wrong password')
|
|
return
|
|
|
|
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 %s, tries to reconnect', ex)
|
|
reconnect()
|