From eae63cd231bdab0b0a663b0eb15fdba733d5bd6a Mon Sep 17 00:00:00 2001 From: Victor Vostrikov <1998617+gorynychzmey@users.noreply.github.com> Date: Fri, 12 Jul 2019 18:59:40 +0200 Subject: [PATCH] Add support for multiple N26 accounts (#25086) * Added support of multiple accounts for n26 * Code cleanup * Added check for proper config * Fiexed lints --- homeassistant/components/n26/__init__.py | 38 ++++++++++++++---------- homeassistant/components/n26/sensor.py | 20 ++++++++----- homeassistant/components/n26/switch.py | 10 +++++-- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/homeassistant/components/n26/__init__.py b/homeassistant/components/n26/__init__.py index fb7084bffe7..4dc03505091 100644 --- a/homeassistant/components/n26/__init__.py +++ b/homeassistant/components/n26/__init__.py @@ -4,6 +4,8 @@ import logging import voluptuous as vol +from n26 import api as n26_api, config as n26_config + from homeassistant.const import ( CONF_PASSWORD, CONF_SCAN_INTERVAL, CONF_USERNAME) import homeassistant.helpers.config_validation as cv @@ -18,12 +20,12 @@ DEFAULT_SCAN_INTERVAL = timedelta(minutes=30) # define configuration parameters CONFIG_SCHEMA = vol.Schema({ - DOMAIN: vol.Schema({ + DOMAIN: vol.All(cv.ensure_list, [{ vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): cv.time_period, - }), + }]) }, extra=vol.ALLOW_EXTRA) N26_COMPONENTS = [ @@ -34,24 +36,30 @@ N26_COMPONENTS = [ def setup(hass, config): """Set up N26 Component.""" - user = config[DOMAIN][CONF_USERNAME] - password = config[DOMAIN][CONF_PASSWORD] + acc_list = config[DOMAIN] - from n26 import api, config as api_config - api = api.Api(api_config.Config(user, password)) + api_data_list = [] - from requests import HTTPError - try: - api.get_token() - except HTTPError as err: - _LOGGER.error(str(err)) - return False + for acc in acc_list: + user = acc[CONF_USERNAME] + password = acc[CONF_PASSWORD] - api_data = N26Data(api) - api_data.update() + api = n26_api.Api(n26_config.Config(user, password)) + + from requests import HTTPError + try: + api.get_token() + except HTTPError as err: + _LOGGER.error(str(err)) + return False + + api_data = N26Data(api) + api_data.update() + + api_data_list.append(api_data) hass.data[DOMAIN] = {} - hass.data[DOMAIN][DATA] = api_data + hass.data[DOMAIN][DATA] = api_data_list # Load components for supported devices for component in N26_COMPONENTS: diff --git a/homeassistant/components/n26/sensor.py b/homeassistant/components/n26/sensor.py index be5ad7a1b68..2b52d6e22cd 100644 --- a/homeassistant/components/n26/sensor.py +++ b/homeassistant/components/n26/sensor.py @@ -30,15 +30,20 @@ ICON_SPACE = 'mdi:crop-square' def setup_platform( hass, config, add_entities, discovery_info=None): """Set up the N26 sensor platform.""" - api_data = hass.data[DOMAIN][DATA] + if discovery_info is None: + return - sensor_entities = [N26Account(api_data)] + api_list = hass.data[DOMAIN][DATA] - for card in api_data.cards: - sensor_entities.append(N26Card(api_data, card)) + sensor_entities = [] + for api_data in api_list: + sensor_entities.append(N26Account(api_data)) - for space in api_data.spaces["spaces"]: - sensor_entities.append(N26Space(api_data, space)) + for card in api_data.cards: + sensor_entities.append(N26Card(api_data, card)) + + for space in api_data.spaces["spaces"]: + sensor_entities.append(N26Space(api_data, space)) add_entities(sensor_entities) @@ -204,7 +209,8 @@ class N26Space(Entity): @property def unique_id(self): """Return the unique ID of the entity.""" - return "space_{}".format(self._space["name"].lower()) + return "space_{}_{}".format(self._data.balance["iban"][-4:], + self._space["name"].lower()) @property def name(self) -> str: diff --git a/homeassistant/components/n26/switch.py b/homeassistant/components/n26/switch.py index 15221255097..806e46a1223 100644 --- a/homeassistant/components/n26/switch.py +++ b/homeassistant/components/n26/switch.py @@ -14,11 +14,15 @@ SCAN_INTERVAL = DEFAULT_SCAN_INTERVAL def setup_platform( hass, config, add_entities, discovery_info=None): """Set up the N26 switch platform.""" - api_data = hass.data[DOMAIN][DATA] + if discovery_info is None: + return + + api_list = hass.data[DOMAIN][DATA] switch_entities = [] - for card in api_data.cards: - switch_entities.append(N26CardSwitch(api_data, card)) + for api_data in api_list: + for card in api_data.cards: + switch_entities.append(N26CardSwitch(api_data, card)) add_entities(switch_entities)