From f62f64311d4661e9e910ad15da22f53c525609b2 Mon Sep 17 00:00:00 2001 From: cdce8p <30130371+cdce8p@users.noreply.github.com> Date: Sun, 22 Jul 2018 09:51:42 +0200 Subject: [PATCH 01/25] Bugfix HomeKit name and serial_number (#15600) * Bugfix HomeKit name and serial_number * Revert serial_number changes --- homeassistant/components/homekit/__init__.py | 19 ++++++++----- .../components/homekit/accessories.py | 4 +-- tests/components/homekit/test_accessories.py | 2 +- tests/components/homekit/test_homekit.py | 27 ++++++++++--------- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index cb9387fb2c0..611043c1b16 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -21,9 +21,10 @@ from homeassistant.helpers.entityfilter import FILTER_SCHEMA from homeassistant.util import get_local_ip from homeassistant.util.decorator import Registry from .const import ( - CONF_AUTO_START, CONF_ENTITY_CONFIG, CONF_FEATURE_LIST, CONF_FILTER, - DEFAULT_AUTO_START, DEFAULT_PORT, DEVICE_CLASS_CO2, DEVICE_CLASS_PM25, - DOMAIN, HOMEKIT_FILE, SERVICE_HOMEKIT_START, TYPE_OUTLET, TYPE_SWITCH) + BRIDGE_NAME, CONF_AUTO_START, CONF_ENTITY_CONFIG, CONF_FEATURE_LIST, + CONF_FILTER, DEFAULT_AUTO_START, DEFAULT_PORT, DEVICE_CLASS_CO2, + DEVICE_CLASS_PM25, DOMAIN, HOMEKIT_FILE, SERVICE_HOMEKIT_START, + TYPE_OUTLET, TYPE_SWITCH) from .util import ( show_setup_message, validate_entity_config, validate_media_player_features) @@ -43,6 +44,8 @@ SWITCH_TYPES = {TYPE_OUTLET: 'Outlet', CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.All({ + vol.Optional(CONF_NAME, default=BRIDGE_NAME): + vol.All(cv.string, vol.Length(min=3, max=25)), vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_IP_ADDRESS): vol.All(ipaddress.ip_address, cv.string), @@ -58,13 +61,15 @@ async def async_setup(hass, config): _LOGGER.debug('Begin setup HomeKit') conf = config[DOMAIN] + name = conf[CONF_NAME] port = conf[CONF_PORT] ip_address = conf.get(CONF_IP_ADDRESS) auto_start = conf[CONF_AUTO_START] entity_filter = conf[CONF_FILTER] entity_config = conf[CONF_ENTITY_CONFIG] - homekit = HomeKit(hass, port, ip_address, entity_filter, entity_config) + homekit = HomeKit(hass, name, port, ip_address, entity_filter, + entity_config) await hass.async_add_job(homekit.setup) if auto_start: @@ -176,9 +181,11 @@ def generate_aid(entity_id): class HomeKit(): """Class to handle all actions between HomeKit and Home Assistant.""" - def __init__(self, hass, port, ip_address, entity_filter, entity_config): + def __init__(self, hass, name, port, ip_address, entity_filter, + entity_config): """Initialize a HomeKit object.""" self.hass = hass + self._name = name self._port = port self._ip_address = ip_address self._filter = entity_filter @@ -199,7 +206,7 @@ class HomeKit(): path = self.hass.config.path(HOMEKIT_FILE) self.driver = HomeDriver(self.hass, address=ip_addr, port=self._port, persist_file=path) - self.bridge = HomeBridge(self.hass, self.driver) + self.bridge = HomeBridge(self.hass, self.driver, self._name) def add_bridge_accessory(self, state): """Try adding accessory to bridge if configured beforehand.""" diff --git a/homeassistant/components/homekit/accessories.py b/homeassistant/components/homekit/accessories.py index d4e6d48c29f..a7e895f49e2 100644 --- a/homeassistant/components/homekit/accessories.py +++ b/homeassistant/components/homekit/accessories.py @@ -17,7 +17,7 @@ from homeassistant.helpers.event import ( from homeassistant.util import dt as dt_util from .const import ( - BRIDGE_MODEL, BRIDGE_NAME, BRIDGE_SERIAL_NUMBER, CHAR_BATTERY_LEVEL, + BRIDGE_MODEL, BRIDGE_SERIAL_NUMBER, CHAR_BATTERY_LEVEL, CHAR_CHARGING_STATE, CHAR_STATUS_LOW_BATTERY, DEBOUNCE_TIMEOUT, MANUFACTURER, SERV_BATTERY_SERVICE) from .util import ( @@ -141,7 +141,7 @@ class HomeAccessory(Accessory): class HomeBridge(Bridge): """Adapter class for Bridge.""" - def __init__(self, hass, driver, name=BRIDGE_NAME): + def __init__(self, hass, driver, name): """Initialize a Bridge object.""" super().__init__(driver, name) self.set_info_service( diff --git a/tests/components/homekit/test_accessories.py b/tests/components/homekit/test_accessories.py index 59da90cc75b..23706f02e75 100644 --- a/tests/components/homekit/test_accessories.py +++ b/tests/components/homekit/test_accessories.py @@ -146,7 +146,7 @@ async def test_battery_service(hass, hk_driver): def test_home_bridge(hk_driver): """Test HomeBridge class.""" - bridge = HomeBridge('hass', hk_driver) + bridge = HomeBridge('hass', hk_driver, BRIDGE_NAME) assert bridge.hass == 'hass' assert bridge.display_name == BRIDGE_NAME assert bridge.category == 2 # Category.BRIDGE diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index cc0370f01b1..f8afb4a49ab 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -9,9 +9,10 @@ from homeassistant.components.homekit import ( STATUS_STOPPED, STATUS_WAIT) from homeassistant.components.homekit.accessories import HomeBridge from homeassistant.components.homekit.const import ( - CONF_AUTO_START, DEFAULT_PORT, DOMAIN, HOMEKIT_FILE, SERVICE_HOMEKIT_START) + CONF_AUTO_START, BRIDGE_NAME, DEFAULT_PORT, DOMAIN, HOMEKIT_FILE, + SERVICE_HOMEKIT_START) from homeassistant.const import ( - CONF_IP_ADDRESS, CONF_PORT, + CONF_NAME, CONF_IP_ADDRESS, CONF_PORT, EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP) from homeassistant.core import State from homeassistant.helpers.entityfilter import generate_filter @@ -47,7 +48,8 @@ async def test_setup_min(hass): assert await setup.async_setup_component( hass, DOMAIN, {DOMAIN: {}}) - mock_homekit.assert_any_call(hass, DEFAULT_PORT, None, ANY, {}) + mock_homekit.assert_any_call(hass, BRIDGE_NAME, DEFAULT_PORT, None, ANY, + {}) assert mock_homekit().setup.called is True # Test auto start enabled @@ -60,15 +62,16 @@ async def test_setup_min(hass): async def test_setup_auto_start_disabled(hass): """Test async_setup with auto start disabled and test service calls.""" - config = {DOMAIN: {CONF_AUTO_START: False, CONF_PORT: 11111, - CONF_IP_ADDRESS: '172.0.0.0'}} + config = {DOMAIN: {CONF_AUTO_START: False, CONF_NAME: 'Test Name', + CONF_PORT: 11111, CONF_IP_ADDRESS: '172.0.0.0'}} with patch(PATH_HOMEKIT + '.HomeKit') as mock_homekit: mock_homekit.return_value = homekit = Mock() assert await setup.async_setup_component( hass, DOMAIN, config) - mock_homekit.assert_any_call(hass, 11111, '172.0.0.0', ANY, {}) + mock_homekit.assert_any_call(hass, 'Test Name', 11111, '172.0.0.0', ANY, + {}) assert mock_homekit().setup.called is True # Test auto_start disabled @@ -96,7 +99,7 @@ async def test_setup_auto_start_disabled(hass): async def test_homekit_setup(hass, hk_driver): """Test setup of bridge and driver.""" - homekit = HomeKit(hass, DEFAULT_PORT, None, {}, {}) + homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, None, {}, {}) with patch(PATH_HOMEKIT + '.accessories.HomeDriver', return_value=hk_driver) as mock_driver, \ @@ -115,7 +118,7 @@ async def test_homekit_setup(hass, hk_driver): async def test_homekit_setup_ip_address(hass, hk_driver): """Test setup with given IP address.""" - homekit = HomeKit(hass, DEFAULT_PORT, '172.0.0.0', {}, {}) + homekit = HomeKit(hass, BRIDGE_NAME, DEFAULT_PORT, '172.0.0.0', {}, {}) with patch(PATH_HOMEKIT + '.accessories.HomeDriver', return_value=hk_driver) as mock_driver: @@ -126,7 +129,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver): async def test_homekit_add_accessory(): """Add accessory if config exists and get_acc returns an accessory.""" - homekit = HomeKit('hass', None, None, lambda entity_id: True, {}) + homekit = HomeKit('hass', None, None, None, lambda entity_id: True, {}) homekit.driver = 'driver' homekit.bridge = mock_bridge = Mock() @@ -149,7 +152,7 @@ async def test_homekit_add_accessory(): async def test_homekit_entity_filter(hass): """Test the entity filter.""" entity_filter = generate_filter(['cover'], ['demo.test'], [], []) - homekit = HomeKit(hass, None, None, entity_filter, {}) + homekit = HomeKit(hass, None, None, None, entity_filter, {}) with patch(PATH_HOMEKIT + '.get_accessory') as mock_get_acc: mock_get_acc.return_value = None @@ -169,7 +172,7 @@ async def test_homekit_entity_filter(hass): async def test_homekit_start(hass, hk_driver, debounce_patcher): """Test HomeKit start method.""" pin = b'123-45-678' - homekit = HomeKit(hass, None, None, {}, {'cover.demo': {}}) + homekit = HomeKit(hass, None, None, None, {}, {'cover.demo': {}}) homekit.bridge = 'bridge' homekit.driver = hk_driver @@ -199,7 +202,7 @@ async def test_homekit_start(hass, hk_driver, debounce_patcher): async def test_homekit_stop(hass): """Test HomeKit stop method.""" - homekit = HomeKit(hass, None, None, None, None) + homekit = HomeKit(hass, None, None, None, None, None) homekit.driver = Mock() assert homekit.status == STATUS_READY From 58f287f55115f2be42bad0e1bd0451e7d26d2442 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Mon, 23 Jul 2018 12:29:37 +0200 Subject: [PATCH 02/25] Use case insensitive comparison for Sonos model check (#15604) --- homeassistant/components/media_player/sonos.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/media_player/sonos.py b/homeassistant/components/media_player/sonos.py index da0ad24b135..8a92d89ce67 100644 --- a/homeassistant/components/media_player/sonos.py +++ b/homeassistant/components/media_player/sonos.py @@ -865,9 +865,10 @@ class SonosDevice(MediaPlayerDevice): """List of available input sources.""" sources = [fav.title for fav in self._favorites] - if 'PLAY:5' in self._model or 'CONNECT' in self._model: + model = self._model.upper() + if 'PLAY:5' in model or 'CONNECT' in model: sources += [SOURCE_LINEIN] - elif 'PLAYBAR' in self._model: + elif 'PLAYBAR' in model: sources += [SOURCE_LINEIN, SOURCE_TV] return sources From 3eda6db227a25a98906b280b8a5b033bbb78fe16 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Sun, 22 Jul 2018 00:49:58 -0700 Subject: [PATCH 03/25] Frontend component should auto load auth coomponent (#15606) --- homeassistant/components/frontend/__init__.py | 3 ++- tests/components/frontend/test_init.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 68e88406ad6..fb59d6254b0 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -29,7 +29,8 @@ from homeassistant.util.yaml import load_yaml REQUIREMENTS = ['home-assistant-frontend==20180720.0'] DOMAIN = 'frontend' -DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log', 'onboarding'] +DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log', + 'auth', 'onboarding'] CONF_THEMES = 'themes' CONF_EXTRA_HTML_URL = 'extra_html_url' diff --git a/tests/components/frontend/test_init.py b/tests/components/frontend/test_init.py index 2125668facb..4a950910809 100644 --- a/tests/components/frontend/test_init.py +++ b/tests/components/frontend/test_init.py @@ -336,3 +336,15 @@ async def test_lovelace_ui_load_err(hass, hass_ws_client): assert msg['type'] == wapi.TYPE_RESULT assert msg['success'] is False assert msg['error']['code'] == 'load_error' + + +async def test_auth_load(mock_http_client): + """Test auth component loaded by default.""" + resp = await mock_http_client.get('/auth/providers') + assert resp.status == 200 + + +async def test_onboarding_load(mock_http_client): + """Test onboarding component loaded by default.""" + resp = await mock_http_client.get('/api/onboarding') + assert resp.status == 200 From 45a5ae1f23d61581244f8bedb51e3ebeb0ca7cd5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 23 Jul 2018 15:08:03 +0200 Subject: [PATCH 04/25] Cast/Sonos: create config entry if manually configured (#15630) * Cast/Sonos: create config entry if manually configured * Add test for helper --- homeassistant/components/cast/__init__.py | 10 ++++++- homeassistant/components/sonos/__init__.py | 10 ++++++- homeassistant/helpers/config_entry_flow.py | 12 +++++++++ tests/components/cast/test_init.py | 31 ++++++++++++++++++++++ tests/components/sonos/test_init.py | 27 +++++++++++++++++++ tests/helpers/test_config_entry_flow.py | 21 +++++++++++++++ 6 files changed, 109 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/cast/__init__.py b/homeassistant/components/cast/__init__.py index a4ee25f0915..86c6152b6e2 100644 --- a/homeassistant/components/cast/__init__.py +++ b/homeassistant/components/cast/__init__.py @@ -1,4 +1,5 @@ """Component to embed Google Cast.""" +from homeassistant import data_entry_flow from homeassistant.helpers import config_entry_flow @@ -8,7 +9,14 @@ REQUIREMENTS = ['pychromecast==2.1.0'] async def async_setup(hass, config): """Set up the Cast component.""" - hass.data[DOMAIN] = config.get(DOMAIN, {}) + conf = config.get(DOMAIN) + + hass.data[DOMAIN] = conf or {} + + if conf is not None: + hass.async_create_task(hass.config_entries.flow.async_init( + DOMAIN, source=data_entry_flow.SOURCE_IMPORT)) + return True diff --git a/homeassistant/components/sonos/__init__.py b/homeassistant/components/sonos/__init__.py index 7c3de210768..a5a45417de2 100644 --- a/homeassistant/components/sonos/__init__.py +++ b/homeassistant/components/sonos/__init__.py @@ -1,4 +1,5 @@ """Component to embed Sonos.""" +from homeassistant import data_entry_flow from homeassistant.helpers import config_entry_flow @@ -8,7 +9,14 @@ REQUIREMENTS = ['SoCo==0.14'] async def async_setup(hass, config): """Set up the Sonos component.""" - hass.data[DOMAIN] = config.get(DOMAIN, {}) + conf = config.get(DOMAIN) + + hass.data[DOMAIN] = conf or {} + + if conf is not None: + hass.async_create_task(hass.config_entries.flow.async_init( + DOMAIN, source=data_entry_flow.SOURCE_IMPORT)) + return True diff --git a/homeassistant/helpers/config_entry_flow.py b/homeassistant/helpers/config_entry_flow.py index 2a4ec2966df..6f51d9aca2c 100644 --- a/homeassistant/helpers/config_entry_flow.py +++ b/homeassistant/helpers/config_entry_flow.py @@ -72,6 +72,18 @@ class DiscoveryFlowHandler(data_entry_flow.FlowHandler): return await self.async_step_confirm() + async def async_step_import(self, _): + """Handle a flow initialized by import.""" + if self._async_in_progress() or self._async_current_entries(): + return self.async_abort( + reason='single_instance_allowed' + ) + + return self.async_create_entry( + title=self._title, + data={}, + ) + @callback def _async_current_entries(self): """Return current entries.""" diff --git a/tests/components/cast/test_init.py b/tests/components/cast/test_init.py index 260856c6742..3ed9ea7b88e 100644 --- a/tests/components/cast/test_init.py +++ b/tests/components/cast/test_init.py @@ -2,6 +2,7 @@ from unittest.mock import patch from homeassistant import data_entry_flow +from homeassistant.setup import async_setup_component from homeassistant.components import cast from tests.common import MockDependency, mock_coro @@ -20,3 +21,33 @@ async def test_creating_entry_sets_up_media_player(hass): await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 + + +async def test_configuring_cast_creates_entry(hass): + """Test that specifying config will create an entry.""" + with patch('homeassistant.components.cast.async_setup_entry', + return_value=mock_coro(True)) as mock_setup, \ + MockDependency('pychromecast', 'discovery'), \ + patch('pychromecast.discovery.discover_chromecasts', + return_value=True): + await async_setup_component(hass, cast.DOMAIN, { + 'cast': { + 'some_config': 'to_trigger_import' + } + }) + await hass.async_block_till_done() + + assert len(mock_setup.mock_calls) == 1 + + +async def test_not_configuring_cast_not_creates_entry(hass): + """Test that no config will not create an entry.""" + with patch('homeassistant.components.cast.async_setup_entry', + return_value=mock_coro(True)) as mock_setup, \ + MockDependency('pychromecast', 'discovery'), \ + patch('pychromecast.discovery.discover_chromecasts', + return_value=True): + await async_setup_component(hass, cast.DOMAIN, {}) + await hass.async_block_till_done() + + assert len(mock_setup.mock_calls) == 0 diff --git a/tests/components/sonos/test_init.py b/tests/components/sonos/test_init.py index 2cbc2360fd4..9fe22fc7e79 100644 --- a/tests/components/sonos/test_init.py +++ b/tests/components/sonos/test_init.py @@ -2,6 +2,7 @@ from unittest.mock import patch from homeassistant import data_entry_flow +from homeassistant.setup import async_setup_component from homeassistant.components import sonos from tests.common import mock_coro @@ -18,3 +19,29 @@ async def test_creating_entry_sets_up_media_player(hass): await hass.async_block_till_done() assert len(mock_setup.mock_calls) == 1 + + +async def test_configuring_sonos_creates_entry(hass): + """Test that specifying config will create an entry.""" + with patch('homeassistant.components.sonos.async_setup_entry', + return_value=mock_coro(True)) as mock_setup, \ + patch('soco.discover', return_value=True): + await async_setup_component(hass, sonos.DOMAIN, { + 'sonos': { + 'some_config': 'to_trigger_import' + } + }) + await hass.async_block_till_done() + + assert len(mock_setup.mock_calls) == 1 + + +async def test_not_configuring_sonos_not_creates_entry(hass): + """Test that no config will not create an entry.""" + with patch('homeassistant.components.sonos.async_setup_entry', + return_value=mock_coro(True)) as mock_setup, \ + patch('soco.discover', return_value=True): + await async_setup_component(hass, sonos.DOMAIN, {}) + await hass.async_block_till_done() + + assert len(mock_setup.mock_calls) == 0 diff --git a/tests/helpers/test_config_entry_flow.py b/tests/helpers/test_config_entry_flow.py index d3f13ac4302..19185e165bc 100644 --- a/tests/helpers/test_config_entry_flow.py +++ b/tests/helpers/test_config_entry_flow.py @@ -114,3 +114,24 @@ async def test_user_init_trumps_discovery(hass, flow_conf): # Discovery flow has been aborted assert len(hass.config_entries.flow.async_progress()) == 0 + + +async def test_import_no_confirmation(hass, flow_conf): + """Test import requires no confirmation to setup.""" + flow = config_entries.HANDLERS['test']() + flow.hass = hass + flow_conf['discovered'] = True + + result = await flow.async_step_import(None) + assert result['type'] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + + +async def test_import_single_instance(hass, flow_conf): + """Test import doesn't create second instance.""" + flow = config_entries.HANDLERS['test']() + flow.hass = hass + flow_conf['discovered'] = True + MockConfigEntry(domain='test').add_to_hass(hass) + + result = await flow.async_step_import(None) + assert result['type'] == data_entry_flow.RESULT_TYPE_ABORT From d65bd7b7eaf6a00d97001e4fc2d83253b1db7d0c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 24 Jul 2018 11:20:13 +0200 Subject: [PATCH 05/25] Bumped version to 0.74.1 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 1627910f9bb..df7ca73bd71 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 74 -PATCH_VERSION = '0' +PATCH_VERSION = '1' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) From 2824efd50564be348ebcdc60c79b535330382ec1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 25 Jul 2018 11:36:44 +0200 Subject: [PATCH 06/25] Fix CORS duplicate registration (#15670) --- homeassistant/components/http/cors.py | 40 +++++++++++++++------------ homeassistant/components/http/view.py | 8 ++---- tests/components/http/test_cors.py | 32 +++++++++++++++++++++ 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/homeassistant/components/http/cors.py b/homeassistant/components/http/cors.py index b01e68f701d..555f302f8e1 100644 --- a/homeassistant/components/http/cors.py +++ b/homeassistant/components/http/cors.py @@ -27,30 +27,36 @@ def setup_cors(app, origins): ) for host in origins }) - def allow_cors(route, methods): - """Allow cors on a route.""" - cors.add(route, { - '*': aiohttp_cors.ResourceOptions( - allow_headers=ALLOWED_CORS_HEADERS, - allow_methods=methods, - ) - }) + cors_added = set() - app['allow_cors'] = allow_cors + def _allow_cors(route, config=None): + """Allow cors on a route.""" + if hasattr(route, 'resource'): + path = route.resource + else: + path = route + + path = path.canonical + + if path in cors_added: + return + + cors.add(route, config) + cors_added.add(path) + + app['allow_cors'] = lambda route: _allow_cors(route, { + '*': aiohttp_cors.ResourceOptions( + allow_headers=ALLOWED_CORS_HEADERS, + allow_methods='*', + ) + }) if not origins: return async def cors_startup(app): """Initialize cors when app starts up.""" - cors_added = set() - for route in list(app.router.routes()): - if hasattr(route, 'resource'): - route = route.resource - if route in cors_added: - continue - cors.add(route) - cors_added.add(route) + _allow_cors(route) app.on_startup.append(cors_startup) diff --git a/homeassistant/components/http/view.py b/homeassistant/components/http/view.py index 7823d674ab3..98f5a5b0a84 100644 --- a/homeassistant/components/http/view.py +++ b/homeassistant/components/http/view.py @@ -69,15 +69,13 @@ class HomeAssistantView(object): handler = request_handler_factory(self, handler) for url in urls: - routes.append( - (method, router.add_route(method, url, handler)) - ) + routes.append(router.add_route(method, url, handler)) if not self.cors_allowed: return - for method, route in routes: - app['allow_cors'](route, [method.upper()]) + for route in routes: + app['allow_cors'](route) def request_handler_factory(view, handler): diff --git a/tests/components/http/test_cors.py b/tests/components/http/test_cors.py index 523d4943ba0..a510d2b3829 100644 --- a/tests/components/http/test_cors.py +++ b/tests/components/http/test_cors.py @@ -14,6 +14,7 @@ import pytest from homeassistant.const import HTTP_HEADER_HA_AUTH from homeassistant.setup import async_setup_component from homeassistant.components.http.cors import setup_cors +from homeassistant.components.http.view import HomeAssistantView TRUSTED_ORIGIN = 'https://home-assistant.io' @@ -96,3 +97,34 @@ async def test_cors_preflight_allowed(client): assert req.headers[ACCESS_CONTROL_ALLOW_ORIGIN] == TRUSTED_ORIGIN assert req.headers[ACCESS_CONTROL_ALLOW_HEADERS] == \ HTTP_HEADER_HA_AUTH.upper() + + +async def test_cors_middleware_with_cors_allowed_view(hass): + """Test that we can configure cors and have a cors_allowed view.""" + class MyView(HomeAssistantView): + """Test view that allows CORS.""" + + requires_auth = False + cors_allowed = True + + def __init__(self, url, name): + """Initialize test view.""" + self.url = url + self.name = name + + async def get(self, request): + """Test response.""" + return "test" + + assert await async_setup_component(hass, 'http', { + 'http': { + 'cors_allowed_origins': ['http://home-assistant.io'] + } + }) + + hass.http.register_view(MyView('/api/test', 'api:test')) + hass.http.register_view(MyView('/api/test', 'api:test2')) + hass.http.register_view(MyView('/api/test2', 'api:test')) + + hass.http.app._on_startup.freeze() + await hass.http.app.startup() From 588fd1923ff5a337df0fd36add68829232af093e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 25 Jul 2018 11:37:17 +0200 Subject: [PATCH 07/25] Bumped version to 0.74.2 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index df7ca73bd71..34cc3329a56 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 74 -PATCH_VERSION = '1' +PATCH_VERSION = '2' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) From 9d59bfbe009aa0bdd753de80c7cfdcaaa07d70de Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 25 Jul 2018 13:09:32 +0200 Subject: [PATCH 08/25] 0.74.2 (#15671) * Fix CORS duplicate registration (#15670) * Bumped version to 0.74.2 --- homeassistant/components/http/cors.py | 40 +++++++++++++++------------ homeassistant/components/http/view.py | 8 ++---- homeassistant/const.py | 2 +- tests/components/http/test_cors.py | 32 +++++++++++++++++++++ 4 files changed, 59 insertions(+), 23 deletions(-) diff --git a/homeassistant/components/http/cors.py b/homeassistant/components/http/cors.py index b01e68f701d..555f302f8e1 100644 --- a/homeassistant/components/http/cors.py +++ b/homeassistant/components/http/cors.py @@ -27,30 +27,36 @@ def setup_cors(app, origins): ) for host in origins }) - def allow_cors(route, methods): - """Allow cors on a route.""" - cors.add(route, { - '*': aiohttp_cors.ResourceOptions( - allow_headers=ALLOWED_CORS_HEADERS, - allow_methods=methods, - ) - }) + cors_added = set() - app['allow_cors'] = allow_cors + def _allow_cors(route, config=None): + """Allow cors on a route.""" + if hasattr(route, 'resource'): + path = route.resource + else: + path = route + + path = path.canonical + + if path in cors_added: + return + + cors.add(route, config) + cors_added.add(path) + + app['allow_cors'] = lambda route: _allow_cors(route, { + '*': aiohttp_cors.ResourceOptions( + allow_headers=ALLOWED_CORS_HEADERS, + allow_methods='*', + ) + }) if not origins: return async def cors_startup(app): """Initialize cors when app starts up.""" - cors_added = set() - for route in list(app.router.routes()): - if hasattr(route, 'resource'): - route = route.resource - if route in cors_added: - continue - cors.add(route) - cors_added.add(route) + _allow_cors(route) app.on_startup.append(cors_startup) diff --git a/homeassistant/components/http/view.py b/homeassistant/components/http/view.py index 7823d674ab3..98f5a5b0a84 100644 --- a/homeassistant/components/http/view.py +++ b/homeassistant/components/http/view.py @@ -69,15 +69,13 @@ class HomeAssistantView(object): handler = request_handler_factory(self, handler) for url in urls: - routes.append( - (method, router.add_route(method, url, handler)) - ) + routes.append(router.add_route(method, url, handler)) if not self.cors_allowed: return - for method, route in routes: - app['allow_cors'](route, [method.upper()]) + for route in routes: + app['allow_cors'](route) def request_handler_factory(view, handler): diff --git a/homeassistant/const.py b/homeassistant/const.py index df7ca73bd71..34cc3329a56 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 74 -PATCH_VERSION = '1' +PATCH_VERSION = '2' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) diff --git a/tests/components/http/test_cors.py b/tests/components/http/test_cors.py index 523d4943ba0..a510d2b3829 100644 --- a/tests/components/http/test_cors.py +++ b/tests/components/http/test_cors.py @@ -14,6 +14,7 @@ import pytest from homeassistant.const import HTTP_HEADER_HA_AUTH from homeassistant.setup import async_setup_component from homeassistant.components.http.cors import setup_cors +from homeassistant.components.http.view import HomeAssistantView TRUSTED_ORIGIN = 'https://home-assistant.io' @@ -96,3 +97,34 @@ async def test_cors_preflight_allowed(client): assert req.headers[ACCESS_CONTROL_ALLOW_ORIGIN] == TRUSTED_ORIGIN assert req.headers[ACCESS_CONTROL_ALLOW_HEADERS] == \ HTTP_HEADER_HA_AUTH.upper() + + +async def test_cors_middleware_with_cors_allowed_view(hass): + """Test that we can configure cors and have a cors_allowed view.""" + class MyView(HomeAssistantView): + """Test view that allows CORS.""" + + requires_auth = False + cors_allowed = True + + def __init__(self, url, name): + """Initialize test view.""" + self.url = url + self.name = name + + async def get(self, request): + """Test response.""" + return "test" + + assert await async_setup_component(hass, 'http', { + 'http': { + 'cors_allowed_origins': ['http://home-assistant.io'] + } + }) + + hass.http.register_view(MyView('/api/test', 'api:test')) + hass.http.register_view(MyView('/api/test', 'api:test2')) + hass.http.register_view(MyView('/api/test2', 'api:test')) + + hass.http.app._on_startup.freeze() + await hass.http.app.startup() From 5e71f0f0d710a165fd18fe98aaacd1b3670bfaa8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 30 Jul 2018 13:45:43 +0200 Subject: [PATCH 09/25] Bumped version to 0.75.0b0 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 33a00b65533..a1b32014d08 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 75 -PATCH_VERSION = '0.dev0' +PATCH_VERSION = '0b0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) From 163cd72b7a96eb39f324621c2516864226fcf1cd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Aug 2018 12:23:36 +0200 Subject: [PATCH 10/25] Bumped version to 0.75.0b1 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index a1b32014d08..a1a1dddfbd3 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 75 -PATCH_VERSION = '0b0' +PATCH_VERSION = '0b1' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) From 3ed47b05a502e216cef56b581d48f7b975797dc3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Aug 2018 13:42:45 +0200 Subject: [PATCH 11/25] Update translations --- .../components/cast/.translations/de.json | 7 ++- .../components/cast/.translations/es-419.json | 15 +++++ .../components/cast/.translations/ja.json | 14 +++++ .../components/cast/.translations/ko.json | 2 +- .../components/cast/.translations/pt-BR.json | 15 +++++ .../components/cast/.translations/pt.json | 15 +++++ .../cast/.translations/zh-Hans.json | 2 +- .../deconz/.translations/es-419.json | 31 ++++++++++ .../components/deconz/.translations/it.json | 7 +++ .../components/deconz/.translations/ja.json | 15 +++++ .../components/deconz/.translations/ko.json | 2 +- .../components/deconz/.translations/pl.json | 3 +- .../deconz/.translations/pt-BR.json | 3 +- .../components/deconz/.translations/pt.json | 3 +- .../homematicip_cloud/.translations/ca.json | 30 ++++++++++ .../homematicip_cloud/.translations/cs.json | 30 ++++++++++ .../homematicip_cloud/.translations/de.json | 28 ++++++++++ .../homematicip_cloud/.translations/en.json | 56 +++++++++---------- .../.translations/es-419.json | 23 ++++++++ .../homematicip_cloud/.translations/hu.json | 5 ++ .../homematicip_cloud/.translations/ja.json | 13 +++++ .../homematicip_cloud/.translations/ko.json | 30 ++++++++++ .../homematicip_cloud/.translations/lb.json | 30 ++++++++++ .../homematicip_cloud/.translations/nl.json | 30 ++++++++++ .../homematicip_cloud/.translations/no.json | 30 ++++++++++ .../homematicip_cloud/.translations/pl.json | 30 ++++++++++ .../.translations/pt-BR.json | 30 ++++++++++ .../homematicip_cloud/.translations/pt.json | 30 ++++++++++ .../homematicip_cloud/.translations/ru.json | 30 ++++++++++ .../homematicip_cloud/.translations/sl.json | 30 ++++++++++ .../homematicip_cloud/.translations/sv.json | 30 ++++++++++ .../.translations/zh-Hans.json | 30 ++++++++++ .../.translations/zh-Hant.json | 30 ++++++++++ .../components/hue/.translations/es-419.json | 24 ++++++++ .../components/hue/.translations/ja.json | 15 +++++ .../components/nest/.translations/de.json | 12 +++- .../components/nest/.translations/es-419.json | 27 +++++++++ .../components/nest/.translations/it.json | 16 ++++++ .../components/nest/.translations/ja.json | 5 ++ .../components/nest/.translations/pt-BR.json | 33 +++++++++++ .../components/nest/.translations/pt.json | 33 +++++++++++ .../sensor/.translations/season.es-419.json | 8 +++ .../sensor/.translations/season.lv.json | 8 +++ .../components/sonos/.translations/de.json | 7 ++- .../sonos/.translations/es-419.json | 15 +++++ .../components/sonos/.translations/ko.json | 2 +- .../components/sonos/.translations/pt-BR.json | 15 +++++ .../components/sonos/.translations/pt.json | 15 +++++ .../components/zone/.translations/es-419.json | 21 +++++++ .../components/zone/.translations/ja.json | 13 +++++ 50 files changed, 906 insertions(+), 42 deletions(-) create mode 100644 homeassistant/components/cast/.translations/es-419.json create mode 100644 homeassistant/components/cast/.translations/ja.json create mode 100644 homeassistant/components/cast/.translations/pt-BR.json create mode 100644 homeassistant/components/cast/.translations/pt.json create mode 100644 homeassistant/components/deconz/.translations/es-419.json create mode 100644 homeassistant/components/deconz/.translations/ja.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/ca.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/cs.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/de.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/es-419.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/hu.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/ja.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/ko.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/lb.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/nl.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/no.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/pl.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/pt-BR.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/pt.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/ru.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/sl.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/sv.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/zh-Hans.json create mode 100644 homeassistant/components/homematicip_cloud/.translations/zh-Hant.json create mode 100644 homeassistant/components/hue/.translations/es-419.json create mode 100644 homeassistant/components/hue/.translations/ja.json create mode 100644 homeassistant/components/nest/.translations/es-419.json create mode 100644 homeassistant/components/nest/.translations/ja.json create mode 100644 homeassistant/components/nest/.translations/pt-BR.json create mode 100644 homeassistant/components/nest/.translations/pt.json create mode 100644 homeassistant/components/sensor/.translations/season.es-419.json create mode 100644 homeassistant/components/sensor/.translations/season.lv.json create mode 100644 homeassistant/components/sonos/.translations/es-419.json create mode 100644 homeassistant/components/sonos/.translations/pt-BR.json create mode 100644 homeassistant/components/sonos/.translations/pt.json create mode 100644 homeassistant/components/zone/.translations/es-419.json create mode 100644 homeassistant/components/zone/.translations/ja.json diff --git a/homeassistant/components/cast/.translations/de.json b/homeassistant/components/cast/.translations/de.json index 2572c3344eb..a37dbd6f5b7 100644 --- a/homeassistant/components/cast/.translations/de.json +++ b/homeassistant/components/cast/.translations/de.json @@ -1,14 +1,15 @@ { "config": { "abort": { - "no_devices_found": "Keine Google Cast Ger\u00e4te im Netzwerk gefunden." + "no_devices_found": "Keine Google Cast Ger\u00e4te im Netzwerk gefunden.", + "single_instance_allowed": "Nur eine einzige Konfiguration von Google Cast ist notwendig." }, "step": { "confirm": { "description": "M\u00f6chten Sie Google Cast einrichten?", - "title": "" + "title": "Google Cast" } }, - "title": "" + "title": "Google Cast" } } \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/es-419.json b/homeassistant/components/cast/.translations/es-419.json new file mode 100644 index 00000000000..2f8d4982afd --- /dev/null +++ b/homeassistant/components/cast/.translations/es-419.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "no_devices_found": "No se encontraron dispositivos Google Cast en la red.", + "single_instance_allowed": "S\u00f3lo es necesaria una \u00fanica configuraci\u00f3n de Google Cast." + }, + "step": { + "confirm": { + "description": "\u00bfDesea configurar Google Cast?", + "title": "Google Cast" + } + }, + "title": "Google Cast" + } +} \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ja.json b/homeassistant/components/cast/.translations/ja.json new file mode 100644 index 00000000000..25b9c10b2e7 --- /dev/null +++ b/homeassistant/components/cast/.translations/ja.json @@ -0,0 +1,14 @@ +{ + "config": { + "abort": { + "no_devices_found": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u4e0a\u306bGoogle Cast\u30c7\u30d0\u30a4\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002" + }, + "step": { + "confirm": { + "description": "Google Cast\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u307e\u3059\u304b\uff1f", + "title": "Google Cast" + } + }, + "title": "Google Cast" + } +} \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/ko.json b/homeassistant/components/cast/.translations/ko.json index 2be2a69c171..e4472c88cd8 100644 --- a/homeassistant/components/cast/.translations/ko.json +++ b/homeassistant/components/cast/.translations/ko.json @@ -2,7 +2,7 @@ "config": { "abort": { "no_devices_found": "Googgle Cast \uc7a5\uce58\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ubc1c\uacac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.", - "single_instance_allowed": "Google Cast\uc758 \ub2e8\uc77c \uad6c\uc131 \ub9cc \ud544\uc694\ud569\ub2c8\ub2e4." + "single_instance_allowed": "\ud558\ub098\uc758 Google Cast \ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4." }, "step": { "confirm": { diff --git a/homeassistant/components/cast/.translations/pt-BR.json b/homeassistant/components/cast/.translations/pt-BR.json new file mode 100644 index 00000000000..bd670d7c72f --- /dev/null +++ b/homeassistant/components/cast/.translations/pt-BR.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "no_devices_found": "Nenhum dispositivo Google Cast encontrado na rede.", + "single_instance_allowed": "Apenas uma \u00fanica configura\u00e7\u00e3o do Google Cast \u00e9 necess\u00e1ria." + }, + "step": { + "confirm": { + "description": "Deseja configurar o Google Cast?", + "title": "" + } + }, + "title": "" + } +} \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/pt.json b/homeassistant/components/cast/.translations/pt.json new file mode 100644 index 00000000000..a6d28538396 --- /dev/null +++ b/homeassistant/components/cast/.translations/pt.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "no_devices_found": "Nenhum dispositivo Google Cast descoberto na rede.", + "single_instance_allowed": "Apenas uma \u00fanica configura\u00e7\u00e3o do Google Cast \u00e9 necess\u00e1ria." + }, + "step": { + "confirm": { + "description": "Deseja configurar o Google Cast?", + "title": "" + } + }, + "title": "" + } +} \ No newline at end of file diff --git a/homeassistant/components/cast/.translations/zh-Hans.json b/homeassistant/components/cast/.translations/zh-Hans.json index 4a844d3d4dd..d4f1cf4c1a5 100644 --- a/homeassistant/components/cast/.translations/zh-Hans.json +++ b/homeassistant/components/cast/.translations/zh-Hans.json @@ -2,7 +2,7 @@ "config": { "abort": { "no_devices_found": "\u6ca1\u6709\u5728\u7f51\u7edc\u4e0a\u627e\u5230 Google Cast \u8bbe\u5907\u3002", - "single_instance_allowed": "\u53ea\u6709\u4e00\u6b21 Google Cast \u914d\u7f6e\u662f\u5fc5\u8981\u7684\u3002" + "single_instance_allowed": "Google Cast \u53ea\u9700\u8981\u914d\u7f6e\u4e00\u6b21\u3002" }, "step": { "confirm": { diff --git a/homeassistant/components/deconz/.translations/es-419.json b/homeassistant/components/deconz/.translations/es-419.json new file mode 100644 index 00000000000..ab47a5b43c8 --- /dev/null +++ b/homeassistant/components/deconz/.translations/es-419.json @@ -0,0 +1,31 @@ +{ + "config": { + "abort": { + "already_configured": "El Bridge ya est\u00e1 configurado", + "no_bridges": "No se descubrieron puentes deCONZ", + "one_instance_only": "El componente solo admite una instancia deCONZ" + }, + "error": { + "no_key": "No se pudo obtener una clave de API" + }, + "step": { + "init": { + "data": { + "host": "Host", + "port": "Puerto (valor predeterminado: '80')" + }, + "title": "Definir el gateway deCONZ" + }, + "link": { + "title": "Enlazar con deCONZ" + }, + "options": { + "data": { + "allow_clip_sensor": "Permitir la importaci\u00f3n de sensores virtuales", + "allow_deconz_groups": "Permitir la importaci\u00f3n de grupos deCONZ" + } + } + }, + "title": "deCONZ Zigbee gateway" + } +} \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/it.json b/homeassistant/components/deconz/.translations/it.json index 6fc7158b882..87dcd0610f2 100644 --- a/homeassistant/components/deconz/.translations/it.json +++ b/homeassistant/components/deconz/.translations/it.json @@ -19,6 +19,13 @@ "link": { "description": "Sblocca il tuo gateway deCONZ per registrarlo in Home Assistant.\n\n1. Vai nelle impostazioni di sistema di deCONZ\n2. Premi il bottone \"Unlock Gateway\"", "title": "Collega con deCONZ" + }, + "options": { + "data": { + "allow_clip_sensor": "Consenti l'importazione di sensori virtuali", + "allow_deconz_groups": "Consenti l'importazione di gruppi deCONZ" + }, + "title": "Opzioni di configurazione extra per deCONZ" } }, "title": "deCONZ" diff --git a/homeassistant/components/deconz/.translations/ja.json b/homeassistant/components/deconz/.translations/ja.json new file mode 100644 index 00000000000..5148ebeaa86 --- /dev/null +++ b/homeassistant/components/deconz/.translations/ja.json @@ -0,0 +1,15 @@ +{ + "config": { + "error": { + "no_key": "API\u30ad\u30fc\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f" + }, + "step": { + "init": { + "data": { + "host": "\u30db\u30b9\u30c8", + "port": "\u30dd\u30fc\u30c8\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\u5024\uff1a'80'\uff09" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/deconz/.translations/ko.json b/homeassistant/components/deconz/.translations/ko.json index 9c5ffa19257..a584a1db9b5 100644 --- a/homeassistant/components/deconz/.translations/ko.json +++ b/homeassistant/components/deconz/.translations/ko.json @@ -23,7 +23,7 @@ "options": { "data": { "allow_clip_sensor": "\uac00\uc0c1 \uc13c\uc11c \uac00\uc838\uc624\uae30 \ud5c8\uc6a9", - "allow_deconz_groups": "deCONZ \ub0b4\uc6a9 \uac00\uc838\uc624\uae30 \ud5c8\uc6a9" + "allow_deconz_groups": "deCONZ \uadf8\ub8f9 \uac00\uc838\uc624\uae30 \ud5c8\uc6a9" }, "title": "deCONZ\ub97c \uc704\ud55c \ucd94\uac00 \uad6c\uc131 \uc635\uc158" } diff --git a/homeassistant/components/deconz/.translations/pl.json b/homeassistant/components/deconz/.translations/pl.json index 461e8b185ee..5dd87d9e462 100644 --- a/homeassistant/components/deconz/.translations/pl.json +++ b/homeassistant/components/deconz/.translations/pl.json @@ -22,7 +22,8 @@ }, "options": { "data": { - "allow_clip_sensor": "Zezwalaj na importowanie wirtualnych sensor\u00f3w" + "allow_clip_sensor": "Zezwalaj na importowanie wirtualnych sensor\u00f3w", + "allow_deconz_groups": "Zezw\u00f3l na importowanie grup deCONZ" }, "title": "Dodatkowe opcje konfiguracji dla deCONZ" } diff --git a/homeassistant/components/deconz/.translations/pt-BR.json b/homeassistant/components/deconz/.translations/pt-BR.json index 065c51aee21..be79e7e461a 100644 --- a/homeassistant/components/deconz/.translations/pt-BR.json +++ b/homeassistant/components/deconz/.translations/pt-BR.json @@ -22,7 +22,8 @@ }, "options": { "data": { - "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais" + "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais", + "allow_deconz_groups": "Permitir a importa\u00e7\u00e3o de grupos deCONZ" }, "title": "Op\u00e7\u00f5es extras de configura\u00e7\u00e3o para deCONZ" } diff --git a/homeassistant/components/deconz/.translations/pt.json b/homeassistant/components/deconz/.translations/pt.json index 6ccbfe9f217..1f7b8209089 100644 --- a/homeassistant/components/deconz/.translations/pt.json +++ b/homeassistant/components/deconz/.translations/pt.json @@ -22,7 +22,8 @@ }, "options": { "data": { - "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais" + "allow_clip_sensor": "Permitir a importa\u00e7\u00e3o de sensores virtuais", + "allow_deconz_groups": "Permitir a importa\u00e7\u00e3o de grupos deCONZ" }, "title": "Op\u00e7\u00f5es extra de configura\u00e7\u00e3o para deCONZ" } diff --git a/homeassistant/components/homematicip_cloud/.translations/ca.json b/homeassistant/components/homematicip_cloud/.translations/ca.json new file mode 100644 index 00000000000..9d40bc2d241 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/ca.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "El punt d'acc\u00e9s ja est\u00e0 configurat", + "conection_aborted": "No s'ha pogut connectar al servidor HMIP", + "unknown": "S'ha produ\u00eft un error desconegut." + }, + "error": { + "invalid_pin": "Codi PIN inv\u00e0lid, torna-ho a provar.", + "press_the_button": "Si us plau, premeu el bot\u00f3 blau.", + "register_failed": "Error al registrar, torneu-ho a provar.", + "timeout_button": "Temps d'espera per pr\u00e9mer el bot\u00f3 blau esgotat, torneu-ho a provar." + }, + "step": { + "init": { + "data": { + "hapid": "Identificador del punt d'acc\u00e9s (SGTIN)", + "name": "Nom (opcional, s'utilitza com a nom prefix per a tots els dispositius)", + "pin": "Codi PIN (opcional)" + }, + "title": "Trieu el punt d'acc\u00e9s HomematicIP" + }, + "link": { + "description": "Premeu el bot\u00f3 blau del punt d'acc\u00e9s i el bot\u00f3 de enviar per registrar HomematicIP amb Home Assistent. \n\n ![Ubicaci\u00f3 del bot\u00f3 al pont](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "Enlla\u00e7ar punt d'acc\u00e9s" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/cs.json b/homeassistant/components/homematicip_cloud/.translations/cs.json new file mode 100644 index 00000000000..59f232edea4 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/cs.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "P\u0159\u00edstupov\u00fd bod je ji\u017e nakonfigurov\u00e1n", + "conection_aborted": "Nelze se p\u0159ipojit k serveru HMIP", + "unknown": "Do\u0161lo k nezn\u00e1m\u00e9 chyb\u011b" + }, + "error": { + "invalid_pin": "Neplatn\u00fd k\u00f3d PIN, zkuste to znovu.", + "press_the_button": "Stiskn\u011bte modr\u00e9 tla\u010d\u00edtko.", + "register_failed": "Registrace se nezda\u0159ila, zkuste to znovu.", + "timeout_button": "\u010casov\u00fd limit stisknut\u00ed modr\u00e9ho tla\u010d\u00edtka vypr\u0161el. Zkuste to znovu." + }, + "step": { + "init": { + "data": { + "hapid": "ID p\u0159\u00edstupov\u00e9ho bodu (SGTIN)", + "name": "N\u00e1zev (nepovinn\u00e9, pou\u017e\u00edv\u00e1 se jako p\u0159edpona n\u00e1zvu pro v\u0161echna za\u0159\u00edzen\u00ed)", + "pin": "Pin k\u00f3d (nepovinn\u00e9)" + }, + "title": "Vyberte p\u0159\u00edstupov\u00fd bod HomematicIP" + }, + "link": { + "description": "Stiskn\u011bte modr\u00e9 tla\u010d\u00edtko na p\u0159\u00edstupov\u00e9m bodu a tla\u010d\u00edtko pro registraci HomematicIP s dom\u00e1c\u00edm asistentem. \n\n ! [Um\u00edst\u011bn\u00ed tla\u010d\u00edtka na za\u0159\u00edzen\u00ed] (/static/images/config_flows/config_homematicip_cloud.png)", + "title": "P\u0159ipojit se k p\u0159\u00edstupov\u00e9mu bodu" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/de.json b/homeassistant/components/homematicip_cloud/.translations/de.json new file mode 100644 index 00000000000..8e4130a3251 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/de.json @@ -0,0 +1,28 @@ +{ + "config": { + "abort": { + "already_configured": "Der Accesspoint ist bereits konfiguriert", + "conection_aborted": "Keine Verbindung zum HMIP-Server m\u00f6glich", + "unknown": "Ein unbekannter Fehler ist aufgetreten." + }, + "error": { + "invalid_pin": "Ung\u00fcltige PIN, bitte versuchen Sie es erneut.", + "press_the_button": "Bitte dr\u00fccken Sie die blaue Taste.", + "register_failed": "Registrierung fehlgeschlagen, bitte versuchen Sie es erneut.", + "timeout_button": "Zeit\u00fcberschreitung beim Dr\u00fccken der blauen Taste. Bitte versuchen Sie es erneut." + }, + "step": { + "init": { + "data": { + "hapid": "Accesspoint ID (SGTIN)", + "name": "Name (optional, wird als Pr\u00e4fix f\u00fcr alle Ger\u00e4te verwendet)", + "pin": "PIN Code (optional)" + } + }, + "link": { + "title": "Verkn\u00fcpfe den Accesspoint" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/en.json b/homeassistant/components/homematicip_cloud/.translations/en.json index 887a3a5780b..0cf99cd2975 100644 --- a/homeassistant/components/homematicip_cloud/.translations/en.json +++ b/homeassistant/components/homematicip_cloud/.translations/en.json @@ -1,30 +1,30 @@ { - "config": { - "title": "HomematicIP Cloud", - "step": { - "init": { - "title": "Pick HomematicIP Accesspoint", - "data": { - "hapid": "Accesspoint ID (SGTIN)", - "pin": "Pin Code (optional)", - "name": "Name (optional, used as name prefix for all devices)" - } - }, - "link": { - "title": "Link Accesspoint", - "description": "Press the blue button on the accesspoint and the submit button to register HomematicIP with Home Assistant.\n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)" - } - }, - "error": { - "register_failed": "Failed to register, please try again.", - "invalid_pin": "Invalid PIN, please try again.", - "press_the_button": "Please press the blue button.", - "timeout_button": "Blue button press timeout, please try again." - }, - "abort": { - "unknown": "Unknown error occurred.", - "conection_aborted": "Could not connect to HMIP server", - "already_configured": "Accesspoint is already configured" + "config": { + "abort": { + "already_configured": "Accesspoint is already configured", + "conection_aborted": "Could not connect to HMIP server", + "unknown": "Unknown error occurred." + }, + "error": { + "invalid_pin": "Invalid PIN, please try again.", + "press_the_button": "Please press the blue button.", + "register_failed": "Failed to register, please try again.", + "timeout_button": "Blue button press timeout, please try again." + }, + "step": { + "init": { + "data": { + "hapid": "Accesspoint ID (SGTIN)", + "name": "Name (optional, used as name prefix for all devices)", + "pin": "Pin Code (optional)" + }, + "title": "Pick HomematicIP Accesspoint" + }, + "link": { + "description": "Press the blue button on the accesspoint and the submit button to register HomematicIP with Home Assistant.\n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "Link Accesspoint" + } + }, + "title": "HomematicIP Cloud" } - } -} +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/es-419.json b/homeassistant/components/homematicip_cloud/.translations/es-419.json new file mode 100644 index 00000000000..9af47289380 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/es-419.json @@ -0,0 +1,23 @@ +{ + "config": { + "abort": { + "already_configured": "Accesspoint ya est\u00e1 configurado", + "conection_aborted": "No se pudo conectar al servidor HMIP", + "unknown": "Se produjo un error desconocido." + }, + "error": { + "invalid_pin": "PIN no v\u00e1lido, por favor intente de nuevo.", + "press_the_button": "Por favor, presione el bot\u00f3n azul.", + "register_failed": "No se pudo registrar, por favor intente de nuevo." + }, + "step": { + "init": { + "data": { + "hapid": "ID de punto de acceso (SGTIN)", + "name": "Nombre (opcional, usado como prefijo de nombre para todos los dispositivos)", + "pin": "C\u00f3digo PIN (opcional)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/hu.json b/homeassistant/components/homematicip_cloud/.translations/hu.json new file mode 100644 index 00000000000..f2f22e6a49d --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/hu.json @@ -0,0 +1,5 @@ +{ + "config": { + "title": "HomematicIP Felh\u0151" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ja.json b/homeassistant/components/homematicip_cloud/.translations/ja.json new file mode 100644 index 00000000000..105a7415789 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/ja.json @@ -0,0 +1,13 @@ +{ + "config": { + "abort": { + "already_configured": "\u30a2\u30af\u30bb\u30b9\u30dd\u30a4\u30f3\u30c8\u306f\u65e2\u306b\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059", + "conection_aborted": "HMIP\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f", + "unknown": "\u4e0d\u660e\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002" + }, + "error": { + "invalid_pin": "PIN\u304c\u7121\u52b9\u3067\u3059\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002", + "press_the_button": "\u9752\u3044\u30dc\u30bf\u30f3\u3092\u62bc\u3057\u3066\u304f\u3060\u3055\u3044\u3002" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ko.json b/homeassistant/components/homematicip_cloud/.translations/ko.json new file mode 100644 index 00000000000..e135873067e --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/ko.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "\uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "conection_aborted": "HMIP \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", + "unknown": "\uc54c \uc218\uc5c6\ub294 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + }, + "error": { + "invalid_pin": "PIN\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", + "press_the_button": "\ud30c\ub780\uc0c9 \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694.", + "register_failed": "\ub4f1\ub85d\uc5d0 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.", + "timeout_button": "\uc815\ud574\uc9c4 \uc2dc\uac04\ub0b4\uc5d0 \ud30c\ub780\uc0c9 \ubc84\ud2bc\uc744 \ub20c\ub974\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694." + }, + "step": { + "init": { + "data": { + "hapid": "\uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8 ID (SGTIN)", + "name": "\uc774\ub984 (\uc120\ud0dd \uc0ac\ud56d, \ubaa8\ub4e0 \uc7a5\uce58 \uc774\ub984\uc758 \uc811\ub450\uc5b4\ub85c \uc0ac\uc6a9)", + "pin": "PIN \ucf54\ub4dc (\uc120\ud0dd\uc0ac\ud56d)" + }, + "title": "HomematicIP \uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8 \uc120\ud0dd" + }, + "link": { + "description": "Home Assistant\uc5d0 HomematicIP\ub97c \ub4f1\ub85d\ud558\ub824\uba74 \uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8\uc758 \ud30c\ub780\uc0c9 \ubc84\ud2bc\uacfc \uc11c\ubc0b \ubc84\ud2bc\uc744 \ub20c\ub7ec\uc8fc\uc138\uc694.\n\n![\ube0c\ub9bf\uc9c0\uc758 \ubc84\ud2bc \uc704\uce58 \ubcf4\uae30](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "\uc561\uc138\uc2a4 \ud3ec\uc778\ud2b8\uc5d0 \uc5f0\uacb0" + } + }, + "title": "HomematicIP \ud074\ub77c\uc6b0\ub4dc" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/lb.json b/homeassistant/components/homematicip_cloud/.translations/lb.json new file mode 100644 index 00000000000..3dd3f1a5dca --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/lb.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Acesspoint ass schon konfigur\u00e9iert", + "conection_aborted": "Konnt sech net mam HMIP Server verbannen", + "unknown": "Onbekannten Feeler opgetrueden" + }, + "error": { + "invalid_pin": "Ong\u00ebltege Pin, prob\u00e9iert w.e.g. nach emol.", + "press_the_button": "Dr\u00e9ckt w.e.g. de bloe Kn\u00e4ppchen.", + "register_failed": "Feeler beim registr\u00e9ieren, prob\u00e9iert w.e.g. nach emol.", + "timeout_button": "Z\u00e4itiwwerschreidung beim dr\u00e9cken vum bloe Kn\u00e4ppchen, prob\u00e9iert w.e.g. nach emol." + }, + "step": { + "init": { + "data": { + "hapid": "ID vum Accesspoint (SGTIN)", + "name": "Numm (optional, g\u00ebtt als prefixe fir all Apparat benotzt)", + "pin": "Pin Code (Optional)" + }, + "title": "HomematicIP Accesspoint auswielen" + }, + "link": { + "description": "Dr\u00e9ckt de bloen Kn\u00e4ppchen um Accesspoint an den Submit Kn\u00e4ppchen fir d'HomematicIP mam Home Assistant ze registr\u00e9ieren.", + "title": "Accesspoint verbannen" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/nl.json b/homeassistant/components/homematicip_cloud/.translations/nl.json new file mode 100644 index 00000000000..0559dae4bfd --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/nl.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Accesspoint is reeds geconfigureerd", + "conection_aborted": "Kon geen verbinding maken met de HMIP-server", + "unknown": "Er is een onbekende fout opgetreden." + }, + "error": { + "invalid_pin": "Ongeldige PIN-code, probeer het nogmaals.", + "press_the_button": "Druk op de blauwe knop.", + "register_failed": "Kan niet registreren, gelieve opnieuw te proberen.", + "timeout_button": "Blauwe knop druk op timeout, probeer het opnieuw." + }, + "step": { + "init": { + "data": { + "hapid": "Accesspoint ID (SGTIN)", + "name": "Naam (optioneel, gebruikt als naamprefix voor alle apparaten)", + "pin": "Pin-Code (optioneel)" + }, + "title": "Kies HomematicIP Accesspoint" + }, + "link": { + "description": "Druk op de blauwe knop op de accesspoint en de verzendknop om HomematicIP met de Home Assistant te registreren. \n\n![Locatie van knop op brug](/static/images/config_flows/\nconfig_homematicip_cloud.png)", + "title": "Link Accesspoint" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/no.json b/homeassistant/components/homematicip_cloud/.translations/no.json new file mode 100644 index 00000000000..7e164abd3bb --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/no.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Tilgangspunktet er allerede konfigurert", + "conection_aborted": "Kunne ikke koble til HMIP serveren", + "unknown": "Ukjent feil oppstod." + }, + "error": { + "invalid_pin": "Ugyldig PIN kode, pr\u00f8v igjen.", + "press_the_button": "Vennligst trykk p\u00e5 den bl\u00e5 knappen.", + "register_failed": "Kunne ikke registrere, vennligst pr\u00f8v igjen.", + "timeout_button": "Bl\u00e5 knapp-trykk tok for lang tid, vennligst pr\u00f8v igjen." + }, + "step": { + "init": { + "data": { + "hapid": "Tilgangspunkt ID (SGTIN)", + "name": "Navn (valgfritt, brukes som prefiks for alle enheter)", + "pin": "PIN kode (valgfritt)" + }, + "title": "Velg HomematicIP tilgangspunkt" + }, + "link": { + "description": "Trykk p\u00e5 den bl\u00e5 knappen p\u00e5 tilgangspunktet og send knappen for \u00e5 registrere HomematicIP med Home Assistant. \n\n![Plassering av knapp p\u00e5 bridge](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "Link Tilgangspunkt" + } + }, + "title": "HomematicIP Sky" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pl.json b/homeassistant/components/homematicip_cloud/.translations/pl.json new file mode 100644 index 00000000000..c2ec6be4bd4 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/pl.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Punkt dost\u0119pu jest ju\u017c skonfigurowany", + "conection_aborted": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z serwerem HMIP", + "unknown": "Wyst\u0105pi\u0142 nieznany b\u0142\u0105d" + }, + "error": { + "invalid_pin": "Nieprawid\u0142owy kod PIN, spr\u00f3buj ponownie.", + "press_the_button": "Prosz\u0119 nacisn\u0105\u0107 niebieski przycisk.", + "register_failed": "Nie uda\u0142o si\u0119 zarejestrowa\u0107, spr\u00f3buj ponownie.", + "timeout_button": "Oczekiwania na naci\u015bni\u0119cie niebieskiego przycisku zako\u0144czone, spr\u00f3buj ponownie." + }, + "step": { + "init": { + "data": { + "hapid": "ID punktu dost\u0119pu (SGTIN)", + "name": "Nazwa (opcjonalnie, u\u017cywana jako prefiks nazwy dla wszystkich urz\u0105dze\u0144)", + "pin": "Kod PIN (opcjonalnie)" + }, + "title": "Wybierz punkt dost\u0119pu HomematicIP" + }, + "link": { + "description": "Naci\u015bnij niebieski przycisk na punkcie dost\u0119pu i przycisk przesy\u0142ania, aby zarejestrowa\u0107 HomematicIP w Home Assistant. \n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "Po\u0142\u0105cz z punktem dost\u0119pu" + } + }, + "title": "Chmura HomematicIP" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pt-BR.json b/homeassistant/components/homematicip_cloud/.translations/pt-BR.json new file mode 100644 index 00000000000..6e5af1c26cc --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/pt-BR.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "O Accesspoint j\u00e1 est\u00e1 configurado", + "conection_aborted": "N\u00e3o foi poss\u00edvel conectar ao servidor HMIP", + "unknown": "Ocorreu um erro desconhecido." + }, + "error": { + "invalid_pin": "PIN inv\u00e1lido, por favor tente novamente.", + "press_the_button": "Por favor, pressione o bot\u00e3o azul.", + "register_failed": "Falha ao registrar, por favor tente novamente.", + "timeout_button": "Tempo para pressionar o Bot\u00e3o Azul expirou, por favor tente novamente." + }, + "step": { + "init": { + "data": { + "hapid": "ID do AccessPoint (SGTIN)", + "name": "Nome (opcional, usado como prefixo de nome para todos os dispositivos)", + "pin": "C\u00f3digo PIN (opcional)" + }, + "title": "Escolha um HomematicIP Accesspoint" + }, + "link": { + "description": "Pressione o bot\u00e3o azul no ponto de acesso e o bot\u00e3o enviar para registrar o HomematicIP com o Home Assistant.\n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "Accesspoint link" + } + }, + "title": "Nuvem do HomematicIP" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/pt.json b/homeassistant/components/homematicip_cloud/.translations/pt.json new file mode 100644 index 00000000000..ef742e2ce5e --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/pt.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "O ponto de acesso j\u00e1 se encontra configurado", + "conection_aborted": "N\u00e3o foi poss\u00edvel ligar ao servidor HMIP", + "unknown": "Ocorreu um erro desconhecido." + }, + "error": { + "invalid_pin": "PIN inv\u00e1lido, por favor, tente novamente.", + "press_the_button": "Por favor, pressione o bot\u00e3o azul.", + "register_failed": "Falha ao registrar, por favor, tente novamente.", + "timeout_button": "Tempo limite ultrapassado para carregar bot\u00e3o azul, por favor, tente de novo." + }, + "step": { + "init": { + "data": { + "hapid": "ID do ponto de acesso (SGTIN)", + "name": "Nome (opcional, usado como prefixo de nome para todos os dispositivos)", + "pin": "C\u00f3digo PIN (opcional)" + }, + "title": "Escolher ponto de acesso HomematicIP" + }, + "link": { + "description": "Pressione o bot\u00e3o azul no accesspoint e o bot\u00e3o enviar para registrar HomematicIP com Home Assistant.\n\n! [Localiza\u00e7\u00e3o do bot\u00e3o na ponte] (/ static/images/config_flows/config_homematicip_cloud.png)", + "title": "Associar ponto de acesso" + } + }, + "title": "Nuvem do HomematicIP" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/ru.json b/homeassistant/components/homematicip_cloud/.translations/ru.json new file mode 100644 index 00000000000..77c6469f64c --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/ru.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "\u0422\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430", + "conection_aborted": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 HMIP", + "unknown": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430" + }, + "error": { + "invalid_pin": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 PIN-\u043a\u043e\u0434, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430.", + "press_the_button": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0441\u0438\u043d\u044e\u044e \u043a\u043d\u043e\u043f\u043a\u0443.", + "register_failed": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430", + "timeout_button": "\u0412\u044b \u043d\u0435 \u043d\u0430\u0436\u0430\u043b\u0438 \u0441\u0438\u043d\u0438\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430" + }, + "step": { + "init": { + "data": { + "hapid": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (SGTIN)", + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u043b\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432)", + "pin": "PIN-\u043a\u043e\u0434 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)" + }, + "title": "\u0412\u044b\u0431\u0438\u0440\u0438\u0442\u0435 \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 HomematicIP" + }, + "link": { + "description": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0441\u0438\u043d\u044e\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c HomematicIP \u0432 Home Assistant. \n\n ![\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "\u041f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/sl.json b/homeassistant/components/homematicip_cloud/.translations/sl.json new file mode 100644 index 00000000000..d9749480c0d --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/sl.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Dostopna to\u010dka je \u017ee konfigurirana", + "conection_aborted": "Povezave s stre\u017enikom HMIP ni bila mogo\u010da", + "unknown": "Pri\u0161lo je do neznane napake" + }, + "error": { + "invalid_pin": "Neveljavna koda PIN, poskusite znova.", + "press_the_button": "Prosimo, pritisnite modri gumb.", + "register_failed": "Registracija ni uspela, poskusite znova", + "timeout_button": "Potekla je \u010dasovna omejitev za pritisk modrega gumba, poskusite znova." + }, + "step": { + "init": { + "data": { + "hapid": "ID dostopne to\u010dke (SGTIN)", + "name": "Ime (neobvezno, ki se uporablja kot predpona za vse naprave)", + "pin": "Koda PIN (neobvezno)" + }, + "title": "Izberite dostopno to\u010dko HomematicIP" + }, + "link": { + "description": "Pritisnite modro tipko na dostopni to\u010dko in gumb po\u0161lji, da registrirate homematicIP s Home Assistentom. \n\n![Location of button on bridge](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "Pove\u017eite dostopno to\u010dno" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/sv.json b/homeassistant/components/homematicip_cloud/.translations/sv.json new file mode 100644 index 00000000000..945dca8a277 --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/sv.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Accesspunkten \u00e4r redan konfigurerad", + "conection_aborted": "Kunde inte ansluta till HMIP server", + "unknown": "Ett ok\u00e4nt fel har intr\u00e4ffat" + }, + "error": { + "invalid_pin": "Ogiltig PIN-kod, f\u00f6rs\u00f6k igen.", + "press_the_button": "V\u00e4nligen tryck p\u00e5 den bl\u00e5 knappen.", + "register_failed": "Misslyckades med att registrera, f\u00f6rs\u00f6k igen.", + "timeout_button": "Bl\u00e5 knapptryckning timeout, f\u00f6rs\u00f6k igen." + }, + "step": { + "init": { + "data": { + "hapid": "Accesspunkt-ID (SGTIN)", + "name": "Namn (frivilligt, anv\u00e4nds som namnprefix f\u00f6r alla enheter)", + "pin": "Pin-kod (frivilligt)" + }, + "title": "V\u00e4lj HomematicIP Accesspunkt" + }, + "link": { + "description": "Tryck p\u00e5 den bl\u00e5 knappen p\u00e5 accesspunkten och p\u00e5 skickaknappen f\u00f6r att registrera HomematicIP med Home-Assistant. \n\n ![Placering av knapp p\u00e5 bryggan](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "L\u00e4nka Accesspunkt" + } + }, + "title": "HomematicIP Moln" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json b/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json new file mode 100644 index 00000000000..38970e4a97c --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/zh-Hans.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "\u63a5\u5165\u70b9\u5df2\u7ecf\u914d\u7f6e\u5b8c\u6210", + "conection_aborted": "\u65e0\u6cd5\u8fde\u63a5\u5230 HMIP \u670d\u52a1\u5668", + "unknown": "\u53d1\u751f\u672a\u77e5\u9519\u8bef\u3002" + }, + "error": { + "invalid_pin": "PIN \u65e0\u6548\uff0c\u8bf7\u518d\u8bd5\u4e00\u6b21\u3002", + "press_the_button": "\u8bf7\u6309\u4e0b\u84dd\u8272\u6309\u94ae\u3002", + "register_failed": "\u6ce8\u518c\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5", + "timeout_button": "\u6309\u4e0b\u84dd\u8272\u6309\u94ae\u8d85\u65f6\uff0c\u8bf7\u518d\u8bd5\u4e00\u6b21\u3002" + }, + "step": { + "init": { + "data": { + "hapid": "\u63a5\u5165\u70b9 ID (SGTIN)", + "name": "\u540d\u79f0\uff08\u53ef\u9009\uff0c\u7528\u4f5c\u6240\u6709\u8bbe\u5907\u7684\u540d\u79f0\u524d\u7f00\uff09", + "pin": "PIN \u7801\uff08\u53ef\u9009\uff09" + }, + "title": "\u9009\u62e9 HomematicIP \u63a5\u5165\u70b9" + }, + "link": { + "description": "\u6309\u4e0b\u63a5\u5165\u70b9\u4e0a\u7684\u84dd\u8272\u6309\u94ae\u7136\u540e\u70b9\u51fb\u63d0\u4ea4\u6309\u94ae\uff0c\u4ee5\u5c06 HomematicIP \u6ce8\u518c\u5230 Home Assistant\u3002\n\n![\u63a5\u5165\u70b9\u7684\u6309\u94ae\u4f4d\u7f6e]\n(/static/images/config_flows/config_homematicip_cloud.png)", + "title": "\u8fde\u63a5\u63a5\u5165\u70b9" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json b/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json new file mode 100644 index 00000000000..d8c6cff9b0c --- /dev/null +++ b/homeassistant/components/homematicip_cloud/.translations/zh-Hant.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Accesspoint \u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "conection_aborted": "\u7121\u6cd5\u9023\u7dda\u81f3 HMIP \u4f3a\u670d\u5668", + "unknown": "\u767c\u751f\u672a\u77e5\u932f\u8aa4\u3002" + }, + "error": { + "invalid_pin": "PIN \u78bc\u7121\u6548\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002", + "press_the_button": "\u8acb\u6309\u4e0b\u85cd\u8272\u6309\u9215\u3002", + "register_failed": "\u8a3b\u518a\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002", + "timeout_button": "\u85cd\u8272\u6309\u9215\u903e\u6642\uff0c\u8acb\u518d\u8a66\u4e00\u6b21\u3002" + }, + "step": { + "init": { + "data": { + "hapid": "Accesspoint ID (SGTIN)", + "name": "\u540d\u7a31\uff08\u9078\u9805\uff0c\u7528\u4ee5\u4f5c\u70ba\u6240\u6709\u88dd\u7f6e\u7684\u5b57\u9996\u7528\uff09", + "pin": "PIN \u78bc\uff08\u9078\u9805\uff09" + }, + "title": "\u9078\u64c7 HomematicIP Accesspoint" + }, + "link": { + "description": "\u6309\u4e0b AP \u4e0a\u7684\u85cd\u8272\u6309\u9215\u8207\u50b3\u9001\u6309\u9215\uff0c\u4ee5\u65bc Home Assistant \u4e0a\u9032\u884c HomematicIP \u8a3b\u518a\u3002\n\n![\u6a4b\u63a5\u5668\u4e0a\u7684\u6309\u9215\u4f4d\u7f6e](/static/images/config_flows/config_homematicip_cloud.png)", + "title": "\u9023\u7d50 Accesspoint" + } + }, + "title": "HomematicIP Cloud" + } +} \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/es-419.json b/homeassistant/components/hue/.translations/es-419.json new file mode 100644 index 00000000000..8efc9101d9a --- /dev/null +++ b/homeassistant/components/hue/.translations/es-419.json @@ -0,0 +1,24 @@ +{ + "config": { + "abort": { + "all_configured": "Todos los puentes Philips Hue ya est\u00e1n configurados", + "already_configured": "El puente ya est\u00e1 configurado", + "cannot_connect": "No se puede conectar al puente", + "discover_timeout": "Incapaz de descubrir puentes Hue", + "no_bridges": "No se descubrieron puentes Philips Hue", + "unknown": "Se produjo un error desconocido" + }, + "error": { + "linking": "Se produjo un error de enlace desconocido.", + "register_failed": "No se pudo registrar, intente de nuevo" + }, + "step": { + "init": { + "data": { + "host": "Host" + } + } + }, + "title": "Philips Hue" + } +} \ No newline at end of file diff --git a/homeassistant/components/hue/.translations/ja.json b/homeassistant/components/hue/.translations/ja.json new file mode 100644 index 00000000000..ccd260cb1cf --- /dev/null +++ b/homeassistant/components/hue/.translations/ja.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "unknown": "\u4e0d\u660e\u306a\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f" + }, + "step": { + "init": { + "data": { + "host": "\u30db\u30b9\u30c8" + } + } + }, + "title": "Philips Hue" + } +} \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/de.json b/homeassistant/components/nest/.translations/de.json index 721eafa807f..32c72ef7d96 100644 --- a/homeassistant/components/nest/.translations/de.json +++ b/homeassistant/components/nest/.translations/de.json @@ -1,5 +1,15 @@ { "config": { + "abort": { + "already_setup": "Sie k\u00f6nnen nur ein einziges Nest-Konto konfigurieren.", + "no_flows": "Sie m\u00fcssen Nest konfigurieren, bevor Sie sich authentifizieren k\u00f6nnen. [Bitte lesen Sie die Anweisungen] (https://www.home-assistant.io/components/nest/)." + }, + "error": { + "internal_error": "Ein interner Fehler ist aufgetreten", + "invalid_code": "Ung\u00fcltiger Code", + "timeout": "Ein zeit\u00fcberschreitungs Fehler ist aufgetreten", + "unknown": "Ein unbekannter Fehler ist aufgetreten" + }, "step": { "init": { "data": { @@ -16,6 +26,6 @@ "title": "Nest-Konto verkn\u00fcpfen" } }, - "title": "" + "title": "Nest" } } \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/es-419.json b/homeassistant/components/nest/.translations/es-419.json new file mode 100644 index 00000000000..0dfb5283d8f --- /dev/null +++ b/homeassistant/components/nest/.translations/es-419.json @@ -0,0 +1,27 @@ +{ + "config": { + "abort": { + "no_flows": "Debe configurar Nest antes de poder autenticarse con \u00e9l. [Lea las instrucciones] (https://www.home-assistant.io/components/nest/)." + }, + "error": { + "invalid_code": "Codigo invalido" + }, + "step": { + "init": { + "data": { + "flow_impl": "Proveedor" + }, + "description": "Seleccione a trav\u00e9s de qu\u00e9 proveedor de autenticaci\u00f3n desea autenticarse con Nest.", + "title": "Proveedor de autenticaci\u00f3n" + }, + "link": { + "data": { + "code": "C\u00f3digo PIN" + }, + "description": "Para vincular su cuenta Nest, [autorice su cuenta] ( {url} ). \n\n Despu\u00e9s de la autorizaci\u00f3n, copie y pegue el c\u00f3digo pin proporcionado a continuaci\u00f3n.", + "title": "Enlazar cuenta Nest" + } + }, + "title": "Nest" + } +} \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/it.json b/homeassistant/components/nest/.translations/it.json index ca34179cf5b..e4a19ebd521 100644 --- a/homeassistant/components/nest/.translations/it.json +++ b/homeassistant/components/nest/.translations/it.json @@ -1,7 +1,23 @@ { "config": { + "abort": { + "already_setup": "\u00c8 possibile configurare un solo account Nest.", + "authorize_url_fail": "Errore sconoscioto nel generare l'url di autorizzazione", + "authorize_url_timeout": "Tempo scaduto nel generare l'url di autorizzazione", + "no_flows": "Devi configurare Nest prima di poter eseguire l'autenticazione. [Si prega di leggere le istruzioni] (https://www.home-assistant.io/components/nest/)." + }, + "error": { + "internal_error": "Errore interno nella convalida del codice", + "invalid_code": "Codice non valido", + "timeout": "Tempo scaduto per l'inserimento del codice di convalida", + "unknown": "Errore sconosciuto durante la convalida del codice" + }, "step": { "init": { + "data": { + "flow_impl": "Provider" + }, + "description": "Scegli tramite quale provider di autenticazione desideri autenticarti con Nest.", "title": "Fornitore di autenticazione" }, "link": { diff --git a/homeassistant/components/nest/.translations/ja.json b/homeassistant/components/nest/.translations/ja.json new file mode 100644 index 00000000000..4335b7d1674 --- /dev/null +++ b/homeassistant/components/nest/.translations/ja.json @@ -0,0 +1,5 @@ +{ + "config": { + "title": "Nest" + } +} \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pt-BR.json b/homeassistant/components/nest/.translations/pt-BR.json new file mode 100644 index 00000000000..22b4f56fc97 --- /dev/null +++ b/homeassistant/components/nest/.translations/pt-BR.json @@ -0,0 +1,33 @@ +{ + "config": { + "abort": { + "already_setup": "Voc\u00ea pode configurar somente uma conta do Nest", + "authorize_url_fail": "Erro desconhecido ao gerar um URL de autoriza\u00e7\u00e3o.", + "authorize_url_timeout": "Excedido tempo limite de url de autoriza\u00e7\u00e3o", + "no_flows": "Voc\u00ea precisa configurar o Nest antes de poder autenticar com ele. [Por favor leio as instru\u00e7\u00f5es](https://www.home-assistant.io/components/nest/)." + }, + "error": { + "internal_error": "Erro interno ao validar o c\u00f3digo", + "invalid_code": "C\u00f3digo inv\u00e1lido", + "timeout": "Excedido tempo limite para validar c\u00f3digo", + "unknown": "Erro desconhecido ao validar o c\u00f3digo" + }, + "step": { + "init": { + "data": { + "flow_impl": "Provedor" + }, + "description": "Escolha atrav\u00e9s de qual provedor de autentica\u00e7\u00e3o voc\u00ea deseja autenticar com o Nest.", + "title": "Provedor de Autentica\u00e7\u00e3o" + }, + "link": { + "data": { + "code": "C\u00f3digo PIN" + }, + "description": "Para vincular sua conta do Nest, [autorize sua conta] ( {url} ). \n\n Ap\u00f3s a autoriza\u00e7\u00e3o, copie e cole o c\u00f3digo PIN fornecido abaixo.", + "title": "Link da conta Nest" + } + }, + "title": "" + } +} \ No newline at end of file diff --git a/homeassistant/components/nest/.translations/pt.json b/homeassistant/components/nest/.translations/pt.json new file mode 100644 index 00000000000..40743fe3ddb --- /dev/null +++ b/homeassistant/components/nest/.translations/pt.json @@ -0,0 +1,33 @@ +{ + "config": { + "abort": { + "already_setup": "S\u00f3 pode configurar uma \u00fanica conta Nest.", + "authorize_url_fail": "Erro desconhecido ao gerar um URL de autoriza\u00e7\u00e3o.", + "authorize_url_timeout": "Limite temporal ultrapassado ao gerar um URL de autoriza\u00e7\u00e3o.", + "no_flows": "\u00c9 necess\u00e1rio configurar o Nest antes de poder autenticar com ele. [Por favor, leia as instru\u00e7\u00f5es] (https://www.home-assistant.io/components/nest/)." + }, + "error": { + "internal_error": "Erro interno ao validar o c\u00f3digo", + "invalid_code": "C\u00f3digo inv\u00e1lido", + "timeout": "Limite temporal ultrapassado ao validar c\u00f3digo", + "unknown": "Erro desconhecido ao validar o c\u00f3digo" + }, + "step": { + "init": { + "data": { + "flow_impl": "Fornecedor" + }, + "description": "Escolha com qual fornecedor de autentica\u00e7\u00e3o deseja autenticar o Nest.", + "title": "Fornecedor de Autentica\u00e7\u00e3o" + }, + "link": { + "data": { + "code": "C\u00f3digo PIN" + }, + "description": "Para associar \u00e0 sua conta Nest, [autorizar sua conta]({url}).\n\nAp\u00f3s a autoriza\u00e7\u00e3o, copie e cole o c\u00f3digo pin fornecido abaixo.", + "title": "Associar conta Nest" + } + }, + "title": "" + } +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/season.es-419.json b/homeassistant/components/sensor/.translations/season.es-419.json new file mode 100644 index 00000000000..65df6a58b10 --- /dev/null +++ b/homeassistant/components/sensor/.translations/season.es-419.json @@ -0,0 +1,8 @@ +{ + "state": { + "autumn": "Oto\u00f1o", + "spring": "Primavera", + "summer": "Verano", + "winter": "Invierno" + } +} \ No newline at end of file diff --git a/homeassistant/components/sensor/.translations/season.lv.json b/homeassistant/components/sensor/.translations/season.lv.json new file mode 100644 index 00000000000..a96e1112f71 --- /dev/null +++ b/homeassistant/components/sensor/.translations/season.lv.json @@ -0,0 +1,8 @@ +{ + "state": { + "autumn": "Rudens", + "spring": "Pavasaris", + "summer": "Vasara", + "winter": "Ziema" + } +} \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/de.json b/homeassistant/components/sonos/.translations/de.json index f1b76b0d155..d0587036d24 100644 --- a/homeassistant/components/sonos/.translations/de.json +++ b/homeassistant/components/sonos/.translations/de.json @@ -1,14 +1,15 @@ { "config": { "abort": { - "no_devices_found": "Keine Sonos Ger\u00e4te im Netzwerk gefunden." + "no_devices_found": "Keine Sonos Ger\u00e4te im Netzwerk gefunden.", + "single_instance_allowed": "Nur eine einzige Konfiguration von Sonos ist notwendig." }, "step": { "confirm": { "description": "M\u00f6chten Sie Sonos konfigurieren?", - "title": "" + "title": "Sonos" } }, - "title": "" + "title": "Sonos" } } \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/es-419.json b/homeassistant/components/sonos/.translations/es-419.json new file mode 100644 index 00000000000..ff6924389d6 --- /dev/null +++ b/homeassistant/components/sonos/.translations/es-419.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "no_devices_found": "No se encontraron dispositivos Sonos en la red.", + "single_instance_allowed": "S\u00f3lo se necesita una \u00fanica configuraci\u00f3n de Sonos." + }, + "step": { + "confirm": { + "description": "\u00bfDesea configurar Sonos?", + "title": "Sonos" + } + }, + "title": "Sonos" + } +} \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/ko.json b/homeassistant/components/sonos/.translations/ko.json index 5453e4322cd..89933f57425 100644 --- a/homeassistant/components/sonos/.translations/ko.json +++ b/homeassistant/components/sonos/.translations/ko.json @@ -2,7 +2,7 @@ "config": { "abort": { "no_devices_found": "Sonos \uc7a5\uce58\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ubc1c\uacac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.", - "single_instance_allowed": "Sonos\uc758 \ub2e8\uc77c \uad6c\uc131 \ub9cc \ud544\uc694\ud569\ub2c8\ub2e4." + "single_instance_allowed": "\ud558\ub098\uc758 Sonos \ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4." }, "step": { "confirm": { diff --git a/homeassistant/components/sonos/.translations/pt-BR.json b/homeassistant/components/sonos/.translations/pt-BR.json new file mode 100644 index 00000000000..02d3e0c0fb9 --- /dev/null +++ b/homeassistant/components/sonos/.translations/pt-BR.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "no_devices_found": "Nenhum dispositivo Sonos encontrado na rede.", + "single_instance_allowed": "Apenas uma \u00fanica configura\u00e7\u00e3o do Sonos \u00e9 necess\u00e1ria." + }, + "step": { + "confirm": { + "description": "Voc\u00ea quer configurar o Sonos?", + "title": "" + } + }, + "title": "" + } +} \ No newline at end of file diff --git a/homeassistant/components/sonos/.translations/pt.json b/homeassistant/components/sonos/.translations/pt.json new file mode 100644 index 00000000000..a2032c76a4a --- /dev/null +++ b/homeassistant/components/sonos/.translations/pt.json @@ -0,0 +1,15 @@ +{ + "config": { + "abort": { + "no_devices_found": "Nenhum dispositivo Sonos encontrado na rede.", + "single_instance_allowed": "Apenas uma \u00fanica configura\u00e7\u00e3o do Sonos \u00e9 necess\u00e1ria." + }, + "step": { + "confirm": { + "description": "Deseja configurar o Sonos?", + "title": "" + } + }, + "title": "" + } +} \ No newline at end of file diff --git a/homeassistant/components/zone/.translations/es-419.json b/homeassistant/components/zone/.translations/es-419.json new file mode 100644 index 00000000000..b15be44b7b1 --- /dev/null +++ b/homeassistant/components/zone/.translations/es-419.json @@ -0,0 +1,21 @@ +{ + "config": { + "error": { + "name_exists": "El nombre ya existe" + }, + "step": { + "init": { + "data": { + "icon": "Icono", + "latitude": "Latitud", + "longitude": "Longitud", + "name": "Nombre", + "passive": "Pasivo", + "radius": "Radio" + }, + "title": "Definir par\u00e1metros de zona" + } + }, + "title": "Zona" + } +} \ No newline at end of file diff --git a/homeassistant/components/zone/.translations/ja.json b/homeassistant/components/zone/.translations/ja.json new file mode 100644 index 00000000000..093f5ad9938 --- /dev/null +++ b/homeassistant/components/zone/.translations/ja.json @@ -0,0 +1,13 @@ +{ + "config": { + "step": { + "init": { + "data": { + "latitude": "\u7def\u5ea6", + "longitude": "\u7d4c\u5ea6", + "name": "\u540d\u524d" + } + } + } + } +} \ No newline at end of file From a5112f317de548fc57946265c54dccae572cd38b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 2 Aug 2018 14:23:40 +0200 Subject: [PATCH 12/25] Update frontend to 20180802.0 --- homeassistant/components/frontend/__init__.py | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 5bf2b193957..bf17cf59382 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -26,7 +26,7 @@ from homeassistant.helpers.translation import async_get_translations from homeassistant.loader import bind_hass from homeassistant.util.yaml import load_yaml -REQUIREMENTS = ['home-assistant-frontend==20180726.0'] +REQUIREMENTS = ['home-assistant-frontend==20180802.0'] DOMAIN = 'frontend' DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log', diff --git a/requirements_all.txt b/requirements_all.txt index 9be2d66f327..fbe98e52cc4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -421,7 +421,7 @@ hole==0.3.0 holidays==0.9.5 # homeassistant.components.frontend -home-assistant-frontend==20180726.0 +home-assistant-frontend==20180802.0 # homeassistant.components.homekit_controller # homekit==0.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index ff95cd3be25..8876b4eb852 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -81,7 +81,7 @@ hbmqtt==0.9.2 holidays==0.9.5 # homeassistant.components.frontend -home-assistant-frontend==20180726.0 +home-assistant-frontend==20180802.0 # homeassistant.components.homematicip_cloud homematicip==0.9.8 From 8d2359026c1aa9ca06715c1081f9bc6d1c687fe0 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Aug 2018 13:48:32 +0200 Subject: [PATCH 13/25] Bump frontend to 20180803.0 --- homeassistant/components/frontend/__init__.py | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index bf17cf59382..1d2e363d574 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -26,7 +26,7 @@ from homeassistant.helpers.translation import async_get_translations from homeassistant.loader import bind_hass from homeassistant.util.yaml import load_yaml -REQUIREMENTS = ['home-assistant-frontend==20180802.0'] +REQUIREMENTS = ['home-assistant-frontend==20180803.0'] DOMAIN = 'frontend' DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log', diff --git a/requirements_all.txt b/requirements_all.txt index fbe98e52cc4..17cc02352b3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -421,7 +421,7 @@ hole==0.3.0 holidays==0.9.5 # homeassistant.components.frontend -home-assistant-frontend==20180802.0 +home-assistant-frontend==20180803.0 # homeassistant.components.homekit_controller # homekit==0.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8876b4eb852..2ea820e1e1a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -81,7 +81,7 @@ hbmqtt==0.9.2 holidays==0.9.5 # homeassistant.components.frontend -home-assistant-frontend==20180802.0 +home-assistant-frontend==20180803.0 # homeassistant.components.homematicip_cloud homematicip==0.9.8 From 0f844311c9342a03cf4d460d7581e0416088c2a8 Mon Sep 17 00:00:00 2001 From: Bryan York Date: Thu, 2 Aug 2018 13:09:19 -0700 Subject: [PATCH 14/25] Fix Min/Max Kelvin color temp attribute for Google (#15697) * Fix Min/Max Kelvin color temp attribute for Google Max Kelvin is actually Min Mireds and vice-versa. K = 1000000 / mireds * Update test_smart_home.py * Update test_trait.py --- homeassistant/components/google_assistant/trait.py | 6 ++++-- tests/components/google_assistant/test_smart_home.py | 4 ++-- tests/components/google_assistant/test_trait.py | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/google_assistant/trait.py b/homeassistant/components/google_assistant/trait.py index 74ee55c5e93..1d369eb87da 100644 --- a/homeassistant/components/google_assistant/trait.py +++ b/homeassistant/components/google_assistant/trait.py @@ -304,10 +304,12 @@ class ColorTemperatureTrait(_Trait): def sync_attributes(self): """Return color temperature attributes for a sync request.""" attrs = self.state.attributes + # Max Kelvin is Min Mireds K = 1000000 / mireds + # Min Kevin is Max Mireds K = 1000000 / mireds return { - 'temperatureMinK': color_util.color_temperature_mired_to_kelvin( - attrs.get(light.ATTR_MIN_MIREDS)), 'temperatureMaxK': color_util.color_temperature_mired_to_kelvin( + attrs.get(light.ATTR_MIN_MIREDS)), + 'temperatureMinK': color_util.color_temperature_mired_to_kelvin( attrs.get(light.ATTR_MAX_MIREDS)), } diff --git a/tests/components/google_assistant/test_smart_home.py b/tests/components/google_assistant/test_smart_home.py index cdaf4200c97..66e7747e06a 100644 --- a/tests/components/google_assistant/test_smart_home.py +++ b/tests/components/google_assistant/test_smart_home.py @@ -74,8 +74,8 @@ async def test_sync_message(hass): 'willReportState': False, 'attributes': { 'colorModel': 'rgb', - 'temperatureMinK': 6535, - 'temperatureMaxK': 2000, + 'temperatureMinK': 2000, + 'temperatureMaxK': 6535, }, 'roomHint': 'Living Room' }] diff --git a/tests/components/google_assistant/test_trait.py b/tests/components/google_assistant/test_trait.py index e6336e05246..1f7ee011e61 100644 --- a/tests/components/google_assistant/test_trait.py +++ b/tests/components/google_assistant/test_trait.py @@ -414,8 +414,8 @@ async def test_color_temperature_light(hass): })) assert trt.sync_attributes() == { - 'temperatureMinK': 5000, - 'temperatureMaxK': 2000, + 'temperatureMinK': 2000, + 'temperatureMaxK': 5000, } assert trt.query_attributes() == { From cdb86ed1542117117a0f257ebb450f240f93a683 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 3 Aug 2018 13:56:54 +0200 Subject: [PATCH 15/25] Only report color temp when in the correct color mode (#15791) --- homeassistant/components/light/deconz.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/homeassistant/components/light/deconz.py b/homeassistant/components/light/deconz.py index 08d7f5773f7..f372d308927 100644 --- a/homeassistant/components/light/deconz.py +++ b/homeassistant/components/light/deconz.py @@ -98,6 +98,9 @@ class DeconzLight(Light): @property def color_temp(self): """Return the CT color value.""" + if self._light.colormode != 'ct': + return None + return self._light.ct @property From c63fd974fb0cc0ae4a59552ff94508170414b9e8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Aug 2018 00:36:37 +0200 Subject: [PATCH 16/25] Return True from Nest setup (#15797) --- homeassistant/components/nest/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/nest/__init__.py b/homeassistant/components/nest/__init__.py index 4406062c821..1adb113bb81 100644 --- a/homeassistant/components/nest/__init__.py +++ b/homeassistant/components/nest/__init__.py @@ -93,7 +93,7 @@ async def async_nest_update_event_broker(hass, nest): async def async_setup(hass, config): """Set up Nest components.""" if DOMAIN not in config: - return + return True conf = config[DOMAIN] From 6028db21abd12eb9e97136756f8e9da4a3d7144e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 3 Aug 2018 14:23:12 +0200 Subject: [PATCH 17/25] Bumped version to 0.75.0 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index a1a1dddfbd3..6df2fa6afad 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 75 -PATCH_VERSION = '0b1' +PATCH_VERSION = '0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) From c482d48fdecf1b7448e83adb2225696826e3dc17 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 4 Aug 2018 15:21:11 +0200 Subject: [PATCH 18/25] Bump frontend to 20180804.0 --- homeassistant/components/frontend/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 1d2e363d574..540341c68f2 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -26,7 +26,7 @@ from homeassistant.helpers.translation import async_get_translations from homeassistant.loader import bind_hass from homeassistant.util.yaml import load_yaml -REQUIREMENTS = ['home-assistant-frontend==20180803.0'] +REQUIREMENTS = ['home-assistant-frontend==20180804.0'] DOMAIN = 'frontend' DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log', From b110a80fbd875e86ec06d78931cad6d561f9d164 Mon Sep 17 00:00:00 2001 From: superpuffin <35958013+superpuffin@users.noreply.github.com> Date: Mon, 30 Jul 2018 16:15:13 +0200 Subject: [PATCH 19/25] Upgrade Adafruit-DHT to 1.3.3 (#15706) * Change to newer pip package The package Adafruit_Python_DHT==1.3.2 was broken and would not install, breaking DHT sensor support in Home assistant. It has since been fixed in Adafruit-DHT==1.3.3. See: https://github.com/adafruit/Adafruit_Python_DHT/issues/99 * Update requirements_all.txt New or updated dependencies have been added to `requirements_all.txt` by running `script/gen_requirements_all.py`. * Comment out Adafruit-DHT Adafruit_Python_DHT changed name to Adafruit-DHT, which still need pyx support breaking our CI, need to be comment out. * Update requirements_all.txt --- homeassistant/components/sensor/dht.py | 2 +- requirements_all.txt | 6 +++--- script/gen_requirements_all.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/sensor/dht.py b/homeassistant/components/sensor/dht.py index 6770594b919..e3aaf2f8484 100644 --- a/homeassistant/components/sensor/dht.py +++ b/homeassistant/components/sensor/dht.py @@ -17,7 +17,7 @@ from homeassistant.helpers.entity import Entity from homeassistant.util import Throttle from homeassistant.util.temperature import celsius_to_fahrenheit -REQUIREMENTS = ['Adafruit_Python_DHT==1.3.2'] +REQUIREMENTS = ['Adafruit-DHT==1.3.3'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 17cc02352b3..b5870c413f6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -14,6 +14,9 @@ voluptuous==0.11.3 # homeassistant.components.nuimo_controller --only-binary=all nuimo==0.1.0 +# homeassistant.components.sensor.dht +# Adafruit-DHT==1.3.3 + # homeassistant.components.sensor.sht31 Adafruit-GPIO==1.0.3 @@ -23,9 +26,6 @@ Adafruit-SHT31==1.0.2 # homeassistant.components.bbb_gpio # Adafruit_BBIO==1.0.0 -# homeassistant.components.sensor.dht -# Adafruit_Python_DHT==1.3.2 - # homeassistant.components.doorbird DoorBirdPy==0.1.3 diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index d92502de078..28c96e737ff 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -11,7 +11,7 @@ COMMENT_REQUIREMENTS = ( 'RPi.GPIO', 'raspihats', 'rpi-rf', - 'Adafruit_Python_DHT', + 'Adafruit-DHT', 'Adafruit_BBIO', 'fritzconnection', 'pybluez', From 5015071816c328d4801d936f8926aae35ba6bca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=B8yer=20Iversen?= Date: Sat, 4 Aug 2018 15:23:57 +0200 Subject: [PATCH 20/25] Fix rfxtrx device id matching (#15819) * Issue #15773 Fix PT2262 devices are incorrectly matched in rfxtrx component * style --- homeassistant/components/rfxtrx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/rfxtrx.py b/homeassistant/components/rfxtrx.py index afe777ff7cc..60dbb209039 100644 --- a/homeassistant/components/rfxtrx.py +++ b/homeassistant/components/rfxtrx.py @@ -166,6 +166,7 @@ def get_pt2262_device(device_id): """Look for the device which id matches the given device_id parameter.""" for device in RFX_DEVICES.values(): if (hasattr(device, 'is_lighting4') and + device.masked_id is not None and device.masked_id == get_pt2262_deviceid(device_id, device.data_bits)): _LOGGER.debug("rfxtrx: found matching device %s for %s", From ef5095cf53103aa8c3ea4880b6f231e07e8cb178 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 4 Aug 2018 15:24:44 +0200 Subject: [PATCH 21/25] Bumped version to 0.75.1 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 6df2fa6afad..a1ee4038a6a 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 75 -PATCH_VERSION = '0' +PATCH_VERSION = '1' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) From 34ad4bd32d142c30ee5eb516bf346a59b532600e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 6 Aug 2018 12:37:28 +0200 Subject: [PATCH 22/25] Fix requirements --- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements_all.txt b/requirements_all.txt index b5870c413f6..baeb7d939e9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -421,7 +421,7 @@ hole==0.3.0 holidays==0.9.5 # homeassistant.components.frontend -home-assistant-frontend==20180803.0 +home-assistant-frontend==20180804.0 # homeassistant.components.homekit_controller # homekit==0.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 2ea820e1e1a..88b228c291c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -81,7 +81,7 @@ hbmqtt==0.9.2 holidays==0.9.5 # homeassistant.components.frontend -home-assistant-frontend==20180803.0 +home-assistant-frontend==20180804.0 # homeassistant.components.homematicip_cloud homematicip==0.9.8 From 479dfd17109a29034dc4f910e069144b0a107a4c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 5 Aug 2018 02:46:14 +0200 Subject: [PATCH 23/25] Upgrade voluptuous to 0.11.5 (#15830) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index e832314cf17..29e10838f21 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -8,7 +8,7 @@ pip>=8.0.3 pytz>=2018.04 pyyaml>=3.13,<4 requests==2.19.1 -voluptuous==0.11.3 +voluptuous==0.11.5 # Breaks Python 3.6 and is not needed for our supported Python versions enum34==1000000000.0.0 diff --git a/requirements_all.txt b/requirements_all.txt index baeb7d939e9..517ecefb1fe 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -9,7 +9,7 @@ pip>=8.0.3 pytz>=2018.04 pyyaml>=3.13,<4 requests==2.19.1 -voluptuous==0.11.3 +voluptuous==0.11.5 # homeassistant.components.nuimo_controller --only-binary=all nuimo==0.1.0 diff --git a/setup.py b/setup.py index 7519fc6a873..b319df9067d 100755 --- a/setup.py +++ b/setup.py @@ -42,7 +42,7 @@ REQUIRES = [ 'pytz>=2018.04', 'pyyaml>=3.13,<4', 'requests==2.19.1', - 'voluptuous==0.11.3', + 'voluptuous==0.11.5', ] MIN_PY_VERSION = '.'.join(map(str, hass_const.REQUIRED_PYTHON_VER)) From ccef9a3e4351056aa5da38fd358754280d0379d9 Mon Sep 17 00:00:00 2001 From: Dan Cinnamon Date: Sun, 5 Aug 2018 11:51:23 -0500 Subject: [PATCH 24/25] Fix envisalink reconnect (#15832) * Fix logic for handling connection lost/reconnect * Fixed line length issue. --- homeassistant/components/envisalink.py | 14 +++++++++----- requirements_all.txt | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/envisalink.py b/homeassistant/components/envisalink.py index 7dd4e7dc32a..9b5b25c934c 100644 --- a/homeassistant/components/envisalink.py +++ b/homeassistant/components/envisalink.py @@ -16,7 +16,7 @@ from homeassistant.helpers.entity import Entity from homeassistant.helpers.discovery import async_load_platform from homeassistant.helpers.dispatcher import async_dispatcher_send -REQUIREMENTS = ['pyenvisalink==2.2'] +REQUIREMENTS = ['pyenvisalink==2.3'] _LOGGER = logging.getLogger(__name__) @@ -111,20 +111,24 @@ def async_setup(hass, config): def login_fail_callback(data): """Handle when the evl rejects our login.""" _LOGGER.error("The Envisalink rejected your credentials") - sync_connect.set_result(False) + if not sync_connect.done(): + sync_connect.set_result(False) @callback def connection_fail_callback(data): """Network failure callback.""" _LOGGER.error("Could not establish a connection with the Envisalink") - sync_connect.set_result(False) + if not sync_connect.done(): + sync_connect.set_result(False) @callback def connection_success_callback(data): """Handle a successful connection.""" _LOGGER.info("Established a connection with the Envisalink") - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_envisalink) - sync_connect.set_result(True) + if not sync_connect.done(): + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, + stop_envisalink) + sync_connect.set_result(True) @callback def zones_updated_callback(data): diff --git a/requirements_all.txt b/requirements_all.txt index 517ecefb1fe..2da9e1a0fec 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -817,7 +817,7 @@ pyeight==0.0.9 pyemby==1.5 # homeassistant.components.envisalink -pyenvisalink==2.2 +pyenvisalink==2.3 # homeassistant.components.climate.ephember pyephember==0.1.1 From 2f15a40e973a7dd7339bb93b687356b0c7a75b1d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 6 Aug 2018 12:38:01 +0200 Subject: [PATCH 25/25] Bumped version to 0.75.2 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index a1ee4038a6a..6f0c5d50481 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 75 -PATCH_VERSION = '1' +PATCH_VERSION = '2' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3)