From 0c765a40aea0df2ab04003a765ed49e065f75bbd Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 30 Sep 2021 18:48:14 +0200 Subject: [PATCH 001/162] Bumped version to 2021.10.0b0 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index f0aec3aaa79..407edbae5ed 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0.dev0" +PATCH_VERSION: Final = "0b0" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 6ed46bf549621149e7f665afc35a34b4bd5ba5a1 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 30 Sep 2021 16:32:17 -0400 Subject: [PATCH 002/162] Add strings for new zwave_js config flow keys (#56844) --- homeassistant/components/zwave_js/strings.json | 10 ++++++++-- .../components/zwave_js/translations/en.json | 13 +++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/zwave_js/strings.json b/homeassistant/components/zwave_js/strings.json index 75c1ea76e9d..1446c1fc7aa 100644 --- a/homeassistant/components/zwave_js/strings.json +++ b/homeassistant/components/zwave_js/strings.json @@ -24,7 +24,10 @@ "title": "Enter the Z-Wave JS add-on configuration", "data": { "usb_path": "[%key:common::config_flow::data::usb_path%]", - "network_key": "Network Key" + "s0_legacy_key": "S0 Key (Legacy)", + "s2_authenticated_key": "S2 Authenticated Key", + "s2_unauthenticated_key": "S2 Unauthenticated Key", + "s2_access_control_key": "S2 Access Control Key" } }, "start_addon": { @@ -78,7 +81,10 @@ "title": "Enter the Z-Wave JS add-on configuration", "data": { "usb_path": "[%key:common::config_flow::data::usb_path%]", - "network_key": "Network Key", + "s0_legacy_key": "S0 Key (Legacy)", + "s2_authenticated_key": "S2 Authenticated Key", + "s2_unauthenticated_key": "S2 Unauthenticated Key", + "s2_access_control_key": "S2 Access Control Key", "log_level": "Log level", "emulate_hardware": "Emulate Hardware" } diff --git a/homeassistant/components/zwave_js/translations/en.json b/homeassistant/components/zwave_js/translations/en.json index abe37c4da04..b24d4f31b06 100644 --- a/homeassistant/components/zwave_js/translations/en.json +++ b/homeassistant/components/zwave_js/translations/en.json @@ -26,7 +26,10 @@ "step": { "configure_addon": { "data": { - "network_key": "Network Key", + "s0_legacy_key": "S0 Key (Legacy)", + "s2_access_control_key": "S2 Access Control Key", + "s2_authenticated_key": "S2 Authenticated Key", + "s2_unauthenticated_key": "S2 Unauthenticated Key", "usb_path": "USB Device Path" }, "title": "Enter the Z-Wave JS add-on configuration" @@ -108,7 +111,10 @@ "data": { "emulate_hardware": "Emulate Hardware", "log_level": "Log level", - "network_key": "Network Key", + "s0_legacy_key": "S0 Key (Legacy)", + "s2_access_control_key": "S2 Access Control Key", + "s2_authenticated_key": "S2 Authenticated Key", + "s2_unauthenticated_key": "S2 Unauthenticated Key", "usb_path": "USB Device Path" }, "title": "Enter the Z-Wave JS add-on configuration" @@ -132,6 +138,5 @@ "title": "The Z-Wave JS add-on is starting." } } - }, - "title": "Z-Wave JS" + } } \ No newline at end of file From baad8100f9b30324de8044732fe3ed5255097f9b Mon Sep 17 00:00:00 2001 From: Milan Meulemans Date: Thu, 30 Sep 2021 23:04:09 +0200 Subject: [PATCH 003/162] Upgrade aionanoleaf to 0.0.2 (#56845) --- homeassistant/components/nanoleaf/light.py | 4 ---- homeassistant/components/nanoleaf/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/nanoleaf/light.py b/homeassistant/components/nanoleaf/light.py index f5537d3dc1c..5902beba226 100644 --- a/homeassistant/components/nanoleaf/light.py +++ b/homeassistant/components/nanoleaf/light.py @@ -1,7 +1,6 @@ """Support for Nanoleaf Lights.""" from __future__ import annotations -from aiohttp import ServerDisconnectedError from aionanoleaf import Nanoleaf, Unavailable import voluptuous as vol @@ -176,9 +175,6 @@ class NanoleafLight(LightEntity): """Fetch new state data for this light.""" try: await self._nanoleaf.get_info() - except ServerDisconnectedError: - # Retry the request once if the device disconnected - await self._nanoleaf.get_info() except Unavailable: self._attr_available = False return diff --git a/homeassistant/components/nanoleaf/manifest.json b/homeassistant/components/nanoleaf/manifest.json index 31576fd73a7..133257dc7fe 100644 --- a/homeassistant/components/nanoleaf/manifest.json +++ b/homeassistant/components/nanoleaf/manifest.json @@ -3,7 +3,7 @@ "name": "Nanoleaf", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/nanoleaf", - "requirements": ["aionanoleaf==0.0.1"], + "requirements": ["aionanoleaf==0.0.2"], "zeroconf": ["_nanoleafms._tcp.local.", "_nanoleafapi._tcp.local."], "homekit" : { "models": [ diff --git a/requirements_all.txt b/requirements_all.txt index fdb66ea982e..d77d32b2939 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -219,7 +219,7 @@ aiomodernforms==0.1.8 aiomusiccast==0.9.2 # homeassistant.components.nanoleaf -aionanoleaf==0.0.1 +aionanoleaf==0.0.2 # homeassistant.components.keyboard_remote aionotify==0.2.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 03556b3659d..e44eaba5719 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -146,7 +146,7 @@ aiomodernforms==0.1.8 aiomusiccast==0.9.2 # homeassistant.components.nanoleaf -aionanoleaf==0.0.1 +aionanoleaf==0.0.2 # homeassistant.components.notion aionotion==3.0.2 From a70daabcea30f6f98e4cfee0e26250aee2c60fc2 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 30 Sep 2021 23:11:00 +0200 Subject: [PATCH 004/162] Correct database migration to schema version 22 (#56848) --- homeassistant/components/recorder/migration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/recorder/migration.py b/homeassistant/components/recorder/migration.py index 0d40707d825..1ced8b73207 100644 --- a/homeassistant/components/recorder/migration.py +++ b/homeassistant/components/recorder/migration.py @@ -567,7 +567,7 @@ def _apply_update(instance, session, new_version, old_version): # noqa: C901 sum_statistics = get_metadata_with_session( instance.hass, session, None, statistic_type="sum" ) - for metadata_id in sum_statistics: + for metadata_id, _ in sum_statistics.values(): last_statistic = ( session.query(Statistics) .filter_by(metadata_id=metadata_id) From 21aa635ad86e50535077d7ad10b835e448253fe5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 30 Sep 2021 14:11:43 -0700 Subject: [PATCH 005/162] Bumped version to 2021.10.0b1 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 407edbae5ed..d4789598ff0 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b0" +PATCH_VERSION: Final = "0b1" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From d97286bcd6b397fdf2d4c50ab6bbcce3669420ee Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 1 Oct 2021 16:42:42 +0200 Subject: [PATCH 006/162] Adjust state class of solarlog yield and consumption sensors (#56824) --- homeassistant/components/solarlog/const.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/solarlog/const.py b/homeassistant/components/solarlog/const.py index 3ee767f1513..0e9e5e8e5e0 100644 --- a/homeassistant/components/solarlog/const.py +++ b/homeassistant/components/solarlog/const.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from homeassistant.components.sensor import ( STATE_CLASS_MEASUREMENT, - STATE_CLASS_TOTAL_INCREASING, + STATE_CLASS_TOTAL, SensorEntityDescription, ) from homeassistant.const import ( @@ -19,7 +19,6 @@ from homeassistant.const import ( PERCENTAGE, POWER_WATT, ) -from homeassistant.util import dt DOMAIN = "solarlog" @@ -102,7 +101,7 @@ SENSOR_TYPES: tuple[SolarLogSensorEntityDescription, ...] = ( name="yield total", icon="mdi:solar-power", native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, - state_class=STATE_CLASS_TOTAL_INCREASING, + state_class=STATE_CLASS_TOTAL, factor=0.001, ), SolarLogSensorEntityDescription( @@ -145,8 +144,7 @@ SENSOR_TYPES: tuple[SolarLogSensorEntityDescription, ...] = ( name="consumption total", native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, device_class=DEVICE_CLASS_ENERGY, - state_class=STATE_CLASS_MEASUREMENT, - last_reset=dt.utc_from_timestamp(0), + state_class=STATE_CLASS_TOTAL, factor=0.001, ), SolarLogSensorEntityDescription( From 74a1f604411f059f0bf9e282fe1b67069cb99f59 Mon Sep 17 00:00:00 2001 From: Ricardo Steijn <61013287+RicArch97@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:42:32 +0200 Subject: [PATCH 007/162] Handle missing serial extended parameters in crownstone (#56864) --- .../components/crownstone/helpers.py | 4 +- .../components/crownstone/test_config_flow.py | 41 +++++++++++++++---- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/crownstone/helpers.py b/homeassistant/components/crownstone/helpers.py index ad12c28d464..58b4dcdba47 100644 --- a/homeassistant/components/crownstone/helpers.py +++ b/homeassistant/components/crownstone/helpers.py @@ -31,8 +31,8 @@ def list_ports_as_str( port.serial_number, port.manufacturer, port.description, - f"{hex(port.vid)[2:]:0>4}".upper(), - f"{hex(port.pid)[2:]:0>4}".upper(), + f"{hex(port.vid)[2:]:0>4}".upper() if port.vid else None, + f"{hex(port.pid)[2:]:0>4}".upper() if port.pid else None, ) ) ports_as_string.append(MANUAL_PATH) diff --git a/tests/components/crownstone/test_config_flow.py b/tests/components/crownstone/test_config_flow.py index 7b05c8ba530..05fde6109e7 100644 --- a/tests/components/crownstone/test_config_flow.py +++ b/tests/components/crownstone/test_config_flow.py @@ -51,6 +51,16 @@ def usb_comports() -> MockFixture: yield comports_mock +@pytest.fixture(name="pyserial_comports_none_types") +def usb_comports_none_types() -> MockFixture: + """Mock pyserial comports.""" + with patch( + "serial.tools.list_ports.comports", + MagicMock(return_value=[get_mocked_com_port_none_types()]), + ) as comports_mock: + yield comports_mock + + @pytest.fixture(name="usb_path") def usb_path() -> MockFixture: """Mock usb serial path.""" @@ -104,6 +114,19 @@ def get_mocked_com_port(): return port +def get_mocked_com_port_none_types(): + """Mock of a serial port with NoneTypes.""" + port = ListPortInfo("/dev/ttyUSB1234") + port.device = "/dev/ttyUSB1234" + port.serial_number = None + port.manufacturer = None + port.description = "crownstone dongle - crownstone dongle" + port.vid = None + port.pid = None + + return port + + def create_mocked_entry_data_conf(email: str, password: str): """Set a result for the entry data for comparison.""" mock_data: dict[str, str | None] = {} @@ -262,7 +285,7 @@ async def test_successful_login_no_usb( async def test_successful_login_with_usb( crownstone_setup: MockFixture, - pyserial_comports: MockFixture, + pyserial_comports_none_types: MockFixture, usb_path: MockFixture, hass: HomeAssistant, ): @@ -282,17 +305,18 @@ async def test_successful_login_with_usb( # should show usb form assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "usb_config" - assert pyserial_comports.call_count == 1 + assert pyserial_comports_none_types.call_count == 1 - # create a mocked port - port = get_mocked_com_port() + # create a mocked port which should be in + # the list returned from list_ports_as_str, from .helpers + port = get_mocked_com_port_none_types() port_select = usb.human_readable_device_name( port.device, port.serial_number, port.manufacturer, port.description, - f"{hex(port.vid)[2:]:0>4}".upper(), - f"{hex(port.pid)[2:]:0>4}".upper(), + port.vid, + port.pid, ) # select a port from the list @@ -301,7 +325,7 @@ async def test_successful_login_with_usb( ) assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "usb_sphere_config" - assert pyserial_comports.call_count == 2 + assert pyserial_comports_none_types.call_count == 2 assert usb_path.call_count == 1 # select a sphere @@ -406,7 +430,8 @@ async def test_options_flow_setup_usb( assert result["step_id"] == "usb_config" assert pyserial_comports.call_count == 1 - # create a mocked port + # create a mocked port which should be in + # the list returned from list_ports_as_str, from .helpers port = get_mocked_com_port() port_select = usb.human_readable_device_name( port.device, From 1f1f2a681122132e078fc4ca508d53b5185d8966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Fri, 1 Oct 2021 09:12:45 +0200 Subject: [PATCH 008/162] Opengarage bug fix (#56869) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Opengarage bug fix Signed-off-by: Daniel Hjelseth Høyer * Opengarage bug fix Signed-off-by: Daniel Hjelseth Høyer * Deprecated open garage config Signed-off-by: Daniel Hjelseth Høyer * Deprecated open garage config Signed-off-by: Daniel Hjelseth Høyer --- homeassistant/components/opengarage/config_flow.py | 13 +++++++------ homeassistant/components/opengarage/cover.py | 9 +++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/opengarage/config_flow.py b/homeassistant/components/opengarage/config_flow.py index 9121391b4e0..6ddc186cb9c 100644 --- a/homeassistant/components/opengarage/config_flow.py +++ b/homeassistant/components/opengarage/config_flow.py @@ -60,13 +60,14 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): async def async_step_import(self, import_info): """Set the config entry up from yaml.""" - import_info[CONF_HOST] = ( - f"{'https' if import_info[CONF_SSL] else 'http'}://" - f"{import_info.get(CONF_HOST)}" - ) - del import_info[CONF_SSL] - return await self.async_step_user(import_info) + user_input = { + CONF_DEVICE_KEY: import_info[CONF_DEVICE_KEY], + CONF_HOST: f"{'https' if import_info.get(CONF_SSL, False) else 'http'}://{import_info[CONF_HOST]}", + CONF_PORT: import_info.get(CONF_PORT, DEFAULT_PORT), + CONF_VERIFY_SSL: import_info.get(CONF_VERIFY_SSL, False), + } + return await self.async_step_user(user_input) async def async_step_user( self, user_input: dict[str, Any] | None = None diff --git a/homeassistant/components/opengarage/cover.py b/homeassistant/components/opengarage/cover.py index bf23d3286ad..12a1103f7df 100644 --- a/homeassistant/components/opengarage/cover.py +++ b/homeassistant/components/opengarage/cover.py @@ -50,15 +50,16 @@ COVER_SCHEMA = vol.Schema( ) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( - vol.All( - cv.deprecated(DOMAIN), - {vol.Required(CONF_COVERS): cv.schema_with_slug_keys(COVER_SCHEMA)}, - ), + {vol.Required(CONF_COVERS): cv.schema_with_slug_keys(COVER_SCHEMA)} ) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the OpenGarage covers.""" + _LOGGER.warning( + "Open Garage YAML configuration is deprecated, " + "it has been imported into the UI automatically and can be safely removed" + ) devices = config.get(CONF_COVERS) for device_config in devices.values(): hass.async_create_task( From 666fbc98770f67d066c7ba6a83a370a2798182b7 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Fri, 1 Oct 2021 11:50:49 +0200 Subject: [PATCH 009/162] Fix check_control_message short description (#56876) --- homeassistant/components/bmw_connected_drive/binary_sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/bmw_connected_drive/binary_sensor.py b/homeassistant/components/bmw_connected_drive/binary_sensor.py index a7fd72fc1a7..225ec5f7f99 100644 --- a/homeassistant/components/bmw_connected_drive/binary_sensor.py +++ b/homeassistant/components/bmw_connected_drive/binary_sensor.py @@ -122,7 +122,7 @@ class BMWConnectedDriveSensor(BMWConnectedDriveBaseEntity, BinarySensorEntity): if has_check_control_messages: cbs_list = [] for message in check_control_messages: - cbs_list.append(message["ccmDescriptionShort"]) + cbs_list.append(message.description_short) result["check_control_messages"] = cbs_list else: result["check_control_messages"] = "OK" From 91b8d5fcd1cfd7a45d45051ffa54b7455e1b0d9d Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Fri, 1 Oct 2021 12:11:06 +0200 Subject: [PATCH 010/162] Bump aioesphomeapi from 9.1.0 to 9.1.2 (#56879) --- homeassistant/components/esphome/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/esphome/manifest.json b/homeassistant/components/esphome/manifest.json index 857aebdc4dd..28371e89d8e 100644 --- a/homeassistant/components/esphome/manifest.json +++ b/homeassistant/components/esphome/manifest.json @@ -3,7 +3,7 @@ "name": "ESPHome", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/esphome", - "requirements": ["aioesphomeapi==9.1.0"], + "requirements": ["aioesphomeapi==9.1.2"], "zeroconf": ["_esphomelib._tcp.local."], "codeowners": ["@OttoWinter", "@jesserockz"], "after_dependencies": ["zeroconf", "tag"], diff --git a/requirements_all.txt b/requirements_all.txt index d77d32b2939..dd2447b9bda 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -164,7 +164,7 @@ aioeagle==1.1.0 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==9.1.0 +aioesphomeapi==9.1.2 # homeassistant.components.flo aioflo==0.4.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e44eaba5719..8ba707f471c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -109,7 +109,7 @@ aioeagle==1.1.0 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==9.1.0 +aioesphomeapi==9.1.2 # homeassistant.components.flo aioflo==0.4.1 From 2856355c285f27b930e4993a5af57fb9c3457e41 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Fri, 1 Oct 2021 18:27:32 +0200 Subject: [PATCH 011/162] Fix bmw_connected_drive battery icon (#56884) --- homeassistant/components/bmw_connected_drive/sensor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/bmw_connected_drive/sensor.py b/homeassistant/components/bmw_connected_drive/sensor.py index 76d183bf8e8..104a2eb78d9 100644 --- a/homeassistant/components/bmw_connected_drive/sensor.py +++ b/homeassistant/components/bmw_connected_drive/sensor.py @@ -513,6 +513,9 @@ class BMWConnectedDriveSensor(BMWConnectedDriveBaseEntity, SensorEntity): self._attr_entity_registry_enabled_default = attribute_info.get( attribute, [None, None, None, True] )[3] + self._attr_icon = self._attribute_info.get( + self._attribute, [None, None, None, None] + )[0] self._attr_device_class = attribute_info.get( attribute, [None, None, None, None] )[1] @@ -570,6 +573,3 @@ class BMWConnectedDriveSensor(BMWConnectedDriveBaseEntity, SensorEntity): self._attr_icon = icon_for_battery_level( battery_level=vehicle_state.charging_level_hv, charging=charging_state ) - self._attr_icon = self._attribute_info.get( - self._attribute, [None, None, None, None] - )[0] From c9346e9af1d948727d4f9800ac0c2b231bd02d59 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Fri, 1 Oct 2021 16:18:49 +0200 Subject: [PATCH 012/162] Revert fritz pref_disable_new_entities handling (#56891) --- homeassistant/components/fritz/common.py | 3 --- homeassistant/components/fritz/device_tracker.py | 9 ++------- homeassistant/components/fritz/switch.py | 13 +++---------- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/homeassistant/components/fritz/common.py b/homeassistant/components/fritz/common.py index acb733709a3..0fb062af2d7 100644 --- a/homeassistant/components/fritz/common.py +++ b/homeassistant/components/fritz/common.py @@ -54,7 +54,6 @@ def _is_tracked(mac: str, current_devices: ValuesView) -> bool: def device_filter_out_from_trackers( mac: str, device: FritzDevice, - pref_disable_new_entities: bool, current_devices: ValuesView, ) -> bool: """Check if device should be filtered out from trackers.""" @@ -63,8 +62,6 @@ def device_filter_out_from_trackers( reason = "Missing IP" elif _is_tracked(mac, current_devices): reason = "Already tracked" - elif pref_disable_new_entities: - reason = "Disabled System Options" if reason: _LOGGER.debug( diff --git a/homeassistant/components/fritz/device_tracker.py b/homeassistant/components/fritz/device_tracker.py index f3134f32a27..9483d8163e0 100644 --- a/homeassistant/components/fritz/device_tracker.py +++ b/homeassistant/components/fritz/device_tracker.py @@ -80,9 +80,7 @@ async def async_setup_entry( @callback def update_router() -> None: """Update the values of the router.""" - _async_add_entities( - router, async_add_entities, data_fritz, entry.pref_disable_new_entities - ) + _async_add_entities(router, async_add_entities, data_fritz) entry.async_on_unload( async_dispatcher_connect(hass, router.signal_device_new, update_router) @@ -96,7 +94,6 @@ def _async_add_entities( router: FritzBoxTools, async_add_entities: AddEntitiesCallback, data_fritz: FritzData, - pref_disable_new_entities: bool, ) -> None: """Add new tracker entities from the router.""" @@ -105,9 +102,7 @@ def _async_add_entities( data_fritz.tracked[router.unique_id] = set() for mac, device in router.devices.items(): - if device_filter_out_from_trackers( - mac, device, pref_disable_new_entities, data_fritz.tracked.values() - ): + if device_filter_out_from_trackers(mac, device, data_fritz.tracked.values()): continue new_tracked.append(FritzBoxTracker(router, device)) diff --git a/homeassistant/components/fritz/switch.py b/homeassistant/components/fritz/switch.py index c337c568d18..a53d0867a3c 100644 --- a/homeassistant/components/fritz/switch.py +++ b/homeassistant/components/fritz/switch.py @@ -277,7 +277,6 @@ def wifi_entities_list( def profile_entities_list( router: FritzBoxTools, data_fritz: FritzData, - pref_disable_new_entities: bool, ) -> list[FritzBoxProfileSwitch]: """Add new tracker entities from the router.""" @@ -291,7 +290,7 @@ def profile_entities_list( for mac, device in router.devices.items(): if device_filter_out_from_trackers( - mac, device, pref_disable_new_entities, data_fritz.profile_switches.values() + mac, device, data_fritz.profile_switches.values() ): continue @@ -306,14 +305,13 @@ def all_entities_list( device_friendly_name: str, data_fritz: FritzData, local_ip: str, - pref_disable_new_entities: bool, ) -> list[Entity]: """Get a list of all entities.""" return [ *deflection_entities_list(fritzbox_tools, device_friendly_name), *port_entities_list(fritzbox_tools, device_friendly_name, local_ip), *wifi_entities_list(fritzbox_tools, device_friendly_name), - *profile_entities_list(fritzbox_tools, data_fritz, pref_disable_new_entities), + *profile_entities_list(fritzbox_tools, data_fritz), ] @@ -337,7 +335,6 @@ async def async_setup_entry( entry.title, data_fritz, local_ip, - entry.pref_disable_new_entities, ) async_add_entities(entities_list) @@ -345,11 +342,7 @@ async def async_setup_entry( @callback def update_router() -> None: """Update the values of the router.""" - async_add_entities( - profile_entities_list( - fritzbox_tools, data_fritz, entry.pref_disable_new_entities - ) - ) + async_add_entities(profile_entities_list(fritzbox_tools, data_fritz)) entry.async_on_unload( async_dispatcher_connect(hass, fritzbox_tools.signal_device_new, update_router) From f102bf3850768d108b94eccef15b124c3fb5609f Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 1 Oct 2021 16:50:09 +0200 Subject: [PATCH 013/162] Use native unit of measurement in deCONZ sensors (#56897) --- homeassistant/components/deconz/sensor.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/deconz/sensor.py b/homeassistant/components/deconz/sensor.py index e0e979ccf0b..b486f6b8677 100644 --- a/homeassistant/components/deconz/sensor.py +++ b/homeassistant/components/deconz/sensor.py @@ -70,13 +70,13 @@ ENTITY_DESCRIPTIONS = { key="battery", device_class=DEVICE_CLASS_BATTERY, state_class=STATE_CLASS_MEASUREMENT, - unit_of_measurement=PERCENTAGE, + native_unit_of_measurement=PERCENTAGE, ), Consumption: SensorEntityDescription( key="consumption", device_class=DEVICE_CLASS_ENERGY, state_class=STATE_CLASS_TOTAL_INCREASING, - unit_of_measurement=ENERGY_KILO_WATT_HOUR, + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, ), Daylight: SensorEntityDescription( key="daylight", @@ -87,30 +87,30 @@ ENTITY_DESCRIPTIONS = { key="humidity", device_class=DEVICE_CLASS_HUMIDITY, state_class=STATE_CLASS_MEASUREMENT, - unit_of_measurement=PERCENTAGE, + native_unit_of_measurement=PERCENTAGE, ), LightLevel: SensorEntityDescription( key="lightlevel", device_class=DEVICE_CLASS_ILLUMINANCE, - unit_of_measurement=LIGHT_LUX, + native_unit_of_measurement=LIGHT_LUX, ), Power: SensorEntityDescription( key="power", device_class=DEVICE_CLASS_POWER, state_class=STATE_CLASS_MEASUREMENT, - unit_of_measurement=POWER_WATT, + native_unit_of_measurement=POWER_WATT, ), Pressure: SensorEntityDescription( key="pressure", device_class=DEVICE_CLASS_PRESSURE, state_class=STATE_CLASS_MEASUREMENT, - unit_of_measurement=PRESSURE_HPA, + native_unit_of_measurement=PRESSURE_HPA, ), Temperature: SensorEntityDescription( key="temperature", device_class=DEVICE_CLASS_TEMPERATURE, state_class=STATE_CLASS_MEASUREMENT, - unit_of_measurement=TEMP_CELSIUS, + native_unit_of_measurement=TEMP_CELSIUS, ), } From 9a218ff2410004072336e6426620bc31eb9ef15e Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Fri, 1 Oct 2021 17:10:01 +0200 Subject: [PATCH 014/162] CLIPGenericFlag should be deCONZ sensor not binary sensor (#56901) --- .../components/deconz/binary_sensor.py | 2 -- homeassistant/components/deconz/sensor.py | 2 ++ tests/components/deconz/test_binary_sensor.py | 18 ++++++++++++++++-- tests/components/deconz/test_sensor.py | 18 ++++++++++++++++-- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/deconz/binary_sensor.py b/homeassistant/components/deconz/binary_sensor.py index 96de780c137..33b68f25cab 100644 --- a/homeassistant/components/deconz/binary_sensor.py +++ b/homeassistant/components/deconz/binary_sensor.py @@ -4,7 +4,6 @@ from pydeconz.sensor import ( CarbonMonoxide, Fire, GenericFlag, - GenericStatus, OpenClose, Presence, Vibration, @@ -36,7 +35,6 @@ DECONZ_BINARY_SENSORS = ( CarbonMonoxide, Fire, GenericFlag, - GenericStatus, OpenClose, Presence, Vibration, diff --git a/homeassistant/components/deconz/sensor.py b/homeassistant/components/deconz/sensor.py index b486f6b8677..8b82c2fa7bf 100644 --- a/homeassistant/components/deconz/sensor.py +++ b/homeassistant/components/deconz/sensor.py @@ -4,6 +4,7 @@ from pydeconz.sensor import ( Battery, Consumption, Daylight, + GenericStatus, Humidity, LightLevel, Power, @@ -52,6 +53,7 @@ DECONZ_SENSORS = ( AirQuality, Consumption, Daylight, + GenericStatus, Humidity, LightLevel, Power, diff --git a/tests/components/deconz/test_binary_sensor.py b/tests/components/deconz/test_binary_sensor.py index 2a1b3c154f0..7f986ce4b81 100644 --- a/tests/components/deconz/test_binary_sensor.py +++ b/tests/components/deconz/test_binary_sensor.py @@ -181,6 +181,17 @@ async def test_allow_clip_sensor(hass, aioclient_mock): "config": {}, "uniqueid": "00:00:00:00:00:00:00:02-00", }, + "3": { + "config": {"on": True, "reachable": True}, + "etag": "fda064fca03f17389d0799d7cb1883ee", + "manufacturername": "Philips", + "modelid": "CLIPGenericFlag", + "name": "Clip Flag Boot Time", + "state": {"flag": True, "lastupdated": "2021-09-30T07:09:06.281"}, + "swversion": "1.0", + "type": "CLIPGenericFlag", + "uniqueid": "/sensors/3", + }, } } @@ -189,9 +200,10 @@ async def test_allow_clip_sensor(hass, aioclient_mock): hass, aioclient_mock, options={CONF_ALLOW_CLIP_SENSOR: True} ) - assert len(hass.states.async_all()) == 2 + assert len(hass.states.async_all()) == 3 assert hass.states.get("binary_sensor.presence_sensor").state == STATE_OFF assert hass.states.get("binary_sensor.clip_presence_sensor").state == STATE_OFF + assert hass.states.get("binary_sensor.clip_flag_boot_time").state == STATE_ON # Disallow clip sensors @@ -202,6 +214,7 @@ async def test_allow_clip_sensor(hass, aioclient_mock): assert len(hass.states.async_all()) == 1 assert not hass.states.get("binary_sensor.clip_presence_sensor") + assert not hass.states.get("binary_sensor.clip_flag_boot_time") # Allow clip sensors @@ -210,8 +223,9 @@ async def test_allow_clip_sensor(hass, aioclient_mock): ) await hass.async_block_till_done() - assert len(hass.states.async_all()) == 2 + assert len(hass.states.async_all()) == 3 assert hass.states.get("binary_sensor.clip_presence_sensor").state == STATE_OFF + assert hass.states.get("binary_sensor.clip_flag_boot_time").state == STATE_ON async def test_add_new_binary_sensor(hass, aioclient_mock, mock_deconz_websocket): diff --git a/tests/components/deconz/test_sensor.py b/tests/components/deconz/test_sensor.py index 33f9c8c6a2c..624a1bec7ff 100644 --- a/tests/components/deconz/test_sensor.py +++ b/tests/components/deconz/test_sensor.py @@ -196,6 +196,17 @@ async def test_allow_clip_sensors(hass, aioclient_mock): "config": {"reachable": True}, "uniqueid": "00:00:00:00:00:00:00:01-00", }, + "3": { + "config": {"on": True, "reachable": True}, + "etag": "a5ed309124d9b7a21ef29fc278f2625e", + "manufacturername": "Philips", + "modelid": "CLIPGenericStatus", + "name": "CLIP Flur", + "state": {"lastupdated": "2021-10-01T10:23:06.779", "status": 0}, + "swversion": "1.0", + "type": "CLIPGenericStatus", + "uniqueid": "/sensors/3", + }, } } with patch.dict(DECONZ_WEB_REQUEST, data): @@ -205,8 +216,9 @@ async def test_allow_clip_sensors(hass, aioclient_mock): options={CONF_ALLOW_CLIP_SENSOR: True}, ) - assert len(hass.states.async_all()) == 3 + assert len(hass.states.async_all()) == 4 assert hass.states.get("sensor.clip_light_level_sensor").state == "999.8" + assert hass.states.get("sensor.clip_flur").state == "0" # Disallow clip sensors @@ -217,6 +229,7 @@ async def test_allow_clip_sensors(hass, aioclient_mock): assert len(hass.states.async_all()) == 2 assert not hass.states.get("sensor.clip_light_level_sensor") + assert not hass.states.get("sensor.clip_flur") # Allow clip sensors @@ -225,8 +238,9 @@ async def test_allow_clip_sensors(hass, aioclient_mock): ) await hass.async_block_till_done() - assert len(hass.states.async_all()) == 3 + assert len(hass.states.async_all()) == 4 assert hass.states.get("sensor.clip_light_level_sensor").state == "999.8" + assert hass.states.get("sensor.clip_flur").state == "0" async def test_add_new_sensor(hass, aioclient_mock, mock_deconz_websocket): From d6357bcbbe84635c13c9ba25a3a9a1f47b397ffc Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 1 Oct 2021 09:31:17 -0700 Subject: [PATCH 015/162] Bumped version to 2021.10.0b2 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index d4789598ff0..6c6e56f5927 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b1" +PATCH_VERSION: Final = "0b2" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 94b8877e2a4f240454bbd125c36e174666430011 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sat, 2 Oct 2021 12:59:05 +0000 Subject: [PATCH 016/162] [ci skip] Translation update --- .../accuweather/translations/hu.json | 2 +- .../components/adax/translations/es.json | 9 +- .../components/adax/translations/hu.json | 2 +- .../components/adax/translations/id.json | 20 ++++ .../components/adguard/translations/he.json | 3 + .../components/adguard/translations/hu.json | 4 +- .../components/adguard/translations/id.json | 2 +- .../components/agent_dvr/translations/hu.json | 4 +- .../components/airthings/translations/ca.json | 21 ++++ .../components/airthings/translations/de.json | 21 ++++ .../components/airthings/translations/en.json | 21 ++++ .../components/airthings/translations/et.json | 21 ++++ .../components/airthings/translations/he.json | 20 ++++ .../components/airthings/translations/hu.json | 21 ++++ .../components/airthings/translations/it.json | 21 ++++ .../components/airthings/translations/nl.json | 21 ++++ .../components/airthings/translations/no.json | 21 ++++ .../components/airthings/translations/ru.json | 21 ++++ .../airthings/translations/zh-Hant.json | 21 ++++ .../components/airtouch4/translations/es.json | 6 +- .../components/airtouch4/translations/hu.json | 2 +- .../components/airtouch4/translations/id.json | 17 ++++ .../components/airvisual/translations/hu.json | 2 +- .../alarmdecoder/translations/hu.json | 2 +- .../components/almond/translations/hu.json | 6 +- .../components/almond/translations/id.json | 2 +- .../components/ambee/translations/es.json | 14 +++ .../components/ambee/translations/hu.json | 2 +- .../components/ambee/translations/id.json | 6 +- .../ambee/translations/sensor.id.json | 9 ++ .../amberelectric/translations/ca.json | 22 +++++ .../amberelectric/translations/de.json | 22 +++++ .../amberelectric/translations/et.json | 22 +++++ .../amberelectric/translations/hu.json | 22 +++++ .../amberelectric/translations/it.json | 22 +++++ .../amberelectric/translations/nl.json | 22 +++++ .../amberelectric/translations/no.json | 22 +++++ .../amberelectric/translations/ru.json | 22 +++++ .../amberelectric/translations/zh-Hant.json | 22 +++++ .../ambiclimate/translations/ca.json | 2 +- .../ambiclimate/translations/hu.json | 6 +- .../components/apple_tv/translations/hu.json | 8 +- .../components/apple_tv/translations/id.json | 2 +- .../components/arcam_fmj/translations/hu.json | 6 +- .../components/arcam_fmj/translations/id.json | 2 +- .../components/asuswrt/translations/hu.json | 2 +- .../components/asuswrt/translations/ru.json | 2 +- .../components/atag/translations/hu.json | 2 +- .../components/august/translations/ca.json | 2 +- .../components/august/translations/hu.json | 2 +- .../components/auth/translations/fi.json | 5 + .../components/auth/translations/hu.json | 8 +- .../automation/translations/hu.json | 2 +- .../components/awair/translations/ca.json | 2 +- .../components/awair/translations/hu.json | 2 +- .../components/axis/translations/hu.json | 6 +- .../azure_devops/translations/ca.json | 2 +- .../azure_devops/translations/id.json | 2 +- .../binary_sensor/translations/id.json | 3 + .../binary_sensor/translations/is.json | 2 +- .../components/blebox/translations/hu.json | 2 +- .../components/blebox/translations/id.json | 2 +- .../components/blink/translations/hu.json | 2 +- .../bmw_connected_drive/translations/ca.json | 2 +- .../components/bond/translations/es.json | 4 +- .../components/bond/translations/hu.json | 4 +- .../components/bond/translations/id.json | 2 +- .../components/bosch_shc/translations/es.json | 9 +- .../components/bosch_shc/translations/hu.json | 6 +- .../components/braviatv/translations/hu.json | 4 +- .../components/broadlink/translations/es.json | 2 +- .../components/broadlink/translations/hu.json | 10 +- .../components/brother/translations/hu.json | 6 +- .../components/brother/translations/id.json | 2 +- .../components/bsblan/translations/hu.json | 2 +- .../components/bsblan/translations/id.json | 2 +- .../buienradar/translations/id.json | 7 ++ .../components/canary/translations/id.json | 2 +- .../components/cast/translations/hu.json | 6 +- .../components/cast/translations/id.json | 6 +- .../components/cast/translations/nl.json | 2 +- .../cert_expiry/translations/hu.json | 6 +- .../components/climacell/translations/hu.json | 2 +- .../cloudflare/translations/he.json | 2 +- .../cloudflare/translations/id.json | 2 +- .../components/co2signal/translations/es.json | 4 + .../components/co2signal/translations/hu.json | 4 +- .../components/co2signal/translations/id.json | 30 ++++++ .../coolmaster/translations/hu.json | 2 +- .../coronavirus/translations/id.json | 3 +- .../crownstone/translations/ca.json | 96 +++++++++++++++++++ .../crownstone/translations/cs.json | 31 ++++++ .../crownstone/translations/de.json | 96 +++++++++++++++++++ .../crownstone/translations/en.json | 21 ++++ .../crownstone/translations/es.json | 69 +++++++++++++ .../crownstone/translations/et.json | 96 +++++++++++++++++++ .../crownstone/translations/he.json | 53 ++++++++++ .../crownstone/translations/hu.json | 96 +++++++++++++++++++ .../crownstone/translations/id.json | 38 ++++++++ .../crownstone/translations/it.json | 96 +++++++++++++++++++ .../crownstone/translations/ko.json | 16 ++++ .../crownstone/translations/nl.json | 96 +++++++++++++++++++ .../crownstone/translations/no.json | 96 +++++++++++++++++++ .../crownstone/translations/ru.json | 96 +++++++++++++++++++ .../crownstone/translations/zh-Hant.json | 96 +++++++++++++++++++ .../components/daikin/translations/hu.json | 4 +- .../components/deconz/translations/es.json | 2 +- .../components/deconz/translations/hu.json | 16 ++-- .../components/deconz/translations/id.json | 6 +- .../components/demo/translations/he.json | 3 + .../components/demo/translations/hu.json | 2 +- .../components/demo/translations/ro.json | 13 +++ .../components/denonavr/translations/hu.json | 2 +- .../components/denonavr/translations/id.json | 2 +- .../devolo_home_control/translations/ca.json | 2 +- .../devolo_home_control/translations/id.json | 10 +- .../devolo_home_control/translations/ko.json | 7 ++ .../components/dexcom/translations/ca.json | 2 +- .../dialogflow/translations/hu.json | 4 +- .../components/directv/translations/hu.json | 4 +- .../components/directv/translations/id.json | 2 +- .../components/dlna_dmr/translations/ca.json | 44 +++++++++ .../components/dlna_dmr/translations/de.json | 44 +++++++++ .../components/dlna_dmr/translations/et.json | 44 +++++++++ .../components/dlna_dmr/translations/hu.json | 44 +++++++++ .../components/dlna_dmr/translations/it.json | 44 +++++++++ .../components/dlna_dmr/translations/nl.json | 44 +++++++++ .../components/dlna_dmr/translations/no.json | 44 +++++++++ .../components/dlna_dmr/translations/ru.json | 44 +++++++++ .../dlna_dmr/translations/zh-Hant.json | 44 +++++++++ .../components/doorbird/translations/hu.json | 4 +- .../components/doorbird/translations/id.json | 2 +- .../components/dsmr/translations/ca.json | 2 +- .../components/dsmr/translations/hu.json | 2 +- .../components/dunehd/translations/hu.json | 2 +- .../components/elgato/translations/hu.json | 4 +- .../components/elgato/translations/id.json | 8 +- .../components/emonitor/translations/hu.json | 4 +- .../components/emonitor/translations/id.json | 2 +- .../emulated_roku/translations/hu.json | 4 +- .../components/energy/translations/el.json | 3 + .../enphase_envoy/translations/hu.json | 2 +- .../enphase_envoy/translations/id.json | 2 +- .../components/epson/translations/hu.json | 2 +- .../components/esphome/translations/ca.json | 16 +++- .../components/esphome/translations/cs.json | 3 +- .../components/esphome/translations/de.json | 16 +++- .../components/esphome/translations/en.json | 16 +++- .../components/esphome/translations/es.json | 16 +++- .../components/esphome/translations/et.json | 16 +++- .../components/esphome/translations/he.json | 8 +- .../components/esphome/translations/hu.json | 30 ++++-- .../components/esphome/translations/id.json | 5 +- .../components/esphome/translations/it.json | 16 +++- .../components/esphome/translations/nl.json | 16 +++- .../components/esphome/translations/no.json | 16 +++- .../components/esphome/translations/ru.json | 16 +++- .../esphome/translations/zh-Hant.json | 16 +++- .../components/ezviz/translations/ca.json | 2 +- .../components/ezviz/translations/hu.json | 2 +- .../fireservicerota/translations/ca.json | 2 +- .../fjaraskupan/translations/es.json | 8 ++ .../fjaraskupan/translations/id.json | 13 +++ .../flick_electric/translations/ca.json | 2 +- .../flick_electric/translations/he.json | 4 +- .../flick_electric/translations/id.json | 4 +- .../components/flipr/translations/es.json | 11 ++- .../components/flipr/translations/id.json | 20 ++++ .../components/flo/translations/hu.json | 2 +- .../components/flume/translations/ca.json | 2 +- .../forecast_solar/translations/es.json | 5 +- .../forecast_solar/translations/id.json | 4 +- .../forked_daapd/translations/hu.json | 6 +- .../forked_daapd/translations/id.json | 2 +- .../components/foscam/translations/hu.json | 2 +- .../components/freebox/translations/hu.json | 4 +- .../freedompro/translations/id.json | 7 ++ .../components/fritz/translations/es.json | 6 +- .../components/fritz/translations/hu.json | 4 +- .../components/fritz/translations/ko.json | 38 ++++++++ .../components/fritz/translations/ru.json | 2 +- .../components/fritzbox/translations/hu.json | 6 +- .../components/fritzbox/translations/id.json | 2 +- .../fritzbox_callmonitor/translations/hu.json | 2 +- .../fritzbox_callmonitor/translations/id.json | 2 +- .../garages_amsterdam/translations/es.json | 2 + .../components/geofency/translations/hu.json | 4 +- .../components/glances/translations/hu.json | 2 +- .../components/goalzero/translations/es.json | 1 + .../components/goalzero/translations/hu.json | 6 +- .../components/gogogate2/translations/id.json | 2 +- .../components/gpslogger/translations/hu.json | 4 +- .../components/gree/translations/hu.json | 2 +- .../components/gree/translations/nl.json | 2 +- .../growatt_server/translations/es.json | 1 + .../growatt_server/translations/id.json | 1 + .../components/guardian/translations/hu.json | 6 +- .../components/hangouts/translations/fi.json | 2 + .../components/hangouts/translations/hu.json | 2 +- .../components/harmony/translations/hu.json | 4 +- .../components/harmony/translations/id.json | 2 +- .../components/hassio/translations/he.json | 10 +- .../components/heos/translations/hu.json | 4 +- .../components/hive/translations/ca.json | 2 +- .../components/hive/translations/hu.json | 6 +- .../components/hlk_sw16/translations/hu.json | 2 +- .../home_connect/translations/hu.json | 2 +- .../home_plus_control/translations/ca.json | 2 +- .../home_plus_control/translations/hu.json | 4 +- .../components/homekit/translations/ca.json | 3 +- .../components/homekit/translations/de.json | 1 + .../components/homekit/translations/el.json | 11 +++ .../components/homekit/translations/es.json | 6 +- .../components/homekit/translations/et.json | 3 +- .../components/homekit/translations/he.json | 3 + .../components/homekit/translations/hu.json | 11 ++- .../components/homekit/translations/id.json | 8 +- .../components/homekit/translations/it.json | 3 +- .../components/homekit/translations/nl.json | 3 +- .../components/homekit/translations/no.json | 3 +- .../components/homekit/translations/ru.json | 5 +- .../homekit/translations/zh-Hant.json | 3 +- .../homekit_controller/translations/hu.json | 14 +-- .../homekit_controller/translations/id.json | 2 +- .../homematicip_cloud/translations/fi.json | 9 ++ .../homematicip_cloud/translations/hu.json | 2 +- .../components/honeywell/translations/es.json | 6 +- .../components/honeywell/translations/id.json | 15 +++ .../huawei_lte/translations/hu.json | 4 +- .../huawei_lte/translations/id.json | 4 +- .../components/hue/translations/hu.json | 12 +-- .../translations/hu.json | 2 +- .../hvv_departures/translations/hu.json | 2 +- .../components/hyperion/translations/hu.json | 8 +- .../components/ialarm/translations/hu.json | 2 +- .../components/iaqualink/translations/hu.json | 2 +- .../components/icloud/translations/ca.json | 2 +- .../components/icloud/translations/hu.json | 2 +- .../components/ifttt/translations/hu.json | 6 +- .../components/insteon/translations/ca.json | 2 +- .../components/insteon/translations/hu.json | 14 +-- .../components/ios/translations/hu.json | 2 +- .../components/ios/translations/nl.json | 2 +- .../components/iotawatt/translations/el.json | 3 +- .../components/iotawatt/translations/es.json | 3 +- .../components/iotawatt/translations/hu.json | 2 +- .../components/iotawatt/translations/id.json | 17 ++++ .../components/iotawatt/translations/nl.json | 9 ++ .../components/ipp/translations/hu.json | 8 +- .../components/ipp/translations/id.json | 2 +- .../components/isy994/translations/es.json | 2 +- .../components/isy994/translations/hu.json | 6 +- .../components/isy994/translations/id.json | 2 +- .../components/juicenet/translations/ca.json | 2 +- .../keenetic_ndms2/translations/ca.json | 2 +- .../keenetic_ndms2/translations/hu.json | 2 +- .../keenetic_ndms2/translations/id.json | 1 + .../keenetic_ndms2/translations/ru.json | 2 +- .../components/kmtronic/translations/hu.json | 2 +- .../components/kodi/translations/hu.json | 6 +- .../components/kodi/translations/id.json | 2 +- .../components/konnected/translations/hu.json | 6 +- .../components/konnected/translations/id.json | 2 +- .../kostal_plenticore/translations/hu.json | 2 +- .../components/kraken/translations/es.json | 6 +- .../components/kraken/translations/hu.json | 2 +- .../components/kraken/translations/id.json | 12 +++ .../components/kraken/translations/nl.json | 2 +- .../components/kulersky/translations/hu.json | 2 +- .../components/kulersky/translations/nl.json | 2 +- .../components/life360/translations/ca.json | 2 +- .../components/lifx/translations/hu.json | 2 +- .../litterrobot/translations/ca.json | 2 +- .../litterrobot/translations/hu.json | 2 +- .../components/local_ip/translations/hu.json | 2 +- .../components/local_ip/translations/nl.json | 2 +- .../components/locative/translations/hu.json | 4 +- .../components/locative/translations/nl.json | 2 +- .../logi_circle/translations/ca.json | 2 +- .../logi_circle/translations/hu.json | 6 +- .../lutron_caseta/translations/es.json | 4 +- .../lutron_caseta/translations/hu.json | 4 +- .../lutron_caseta/translations/id.json | 2 +- .../components/lyric/translations/hu.json | 2 +- .../components/lyric/translations/id.json | 6 +- .../components/mailgun/translations/hu.json | 6 +- .../components/mazda/translations/ca.json | 2 +- .../components/mazda/translations/hu.json | 2 +- .../meteo_france/translations/hu.json | 2 +- .../meteoclimatic/translations/es.json | 4 + .../meteoclimatic/translations/id.json | 11 +++ .../components/mikrotik/translations/hu.json | 2 +- .../components/mikrotik/translations/ru.json | 2 +- .../components/mill/translations/ca.json | 2 +- .../minecraft_server/translations/hu.json | 4 +- .../mobile_app/translations/hu.json | 4 +- .../modem_callerid/translations/ca.json | 26 +++++ .../modem_callerid/translations/cs.json | 19 ++++ .../modem_callerid/translations/de.json | 26 +++++ .../modem_callerid/translations/en.json | 12 +-- .../modem_callerid/translations/es.json | 16 ++++ .../modem_callerid/translations/et.json | 26 +++++ .../modem_callerid/translations/he.json | 19 ++++ .../modem_callerid/translations/hu.json | 26 +++++ .../modem_callerid/translations/id.json | 20 ++++ .../modem_callerid/translations/it.json | 26 +++++ .../modem_callerid/translations/nl.json | 26 +++++ .../modem_callerid/translations/no.json | 26 +++++ .../modem_callerid/translations/ru.json | 26 +++++ .../modem_callerid/translations/zh-Hant.json | 26 +++++ .../modern_forms/translations/es.json | 10 ++ .../modern_forms/translations/hu.json | 8 +- .../modern_forms/translations/id.json | 22 +++++ .../modern_forms/translations/nl.json | 2 +- .../motion_blinds/translations/hu.json | 2 +- .../components/motioneye/translations/hu.json | 4 +- .../components/motioneye/translations/ko.json | 25 +++++ .../components/mqtt/translations/es.json | 1 + .../components/mqtt/translations/fi.json | 3 + .../components/mqtt/translations/he.json | 34 +++++++ .../components/mqtt/translations/hu.json | 10 +- .../components/mqtt/translations/id.json | 5 +- .../components/mutesync/translations/hu.json | 2 +- .../components/mutesync/translations/id.json | 15 +++ .../components/myq/translations/id.json | 8 +- .../components/nam/translations/hu.json | 4 +- .../components/nanoleaf/translations/el.json | 1 + .../components/nanoleaf/translations/es.json | 8 ++ .../components/nanoleaf/translations/hu.json | 4 +- .../components/nanoleaf/translations/id.json | 22 +++++ .../components/neato/translations/es.json | 2 +- .../components/neato/translations/hu.json | 4 +- .../components/neato/translations/nl.json | 2 +- .../components/nest/translations/fi.json | 3 + .../components/nest/translations/he.json | 5 +- .../components/nest/translations/hu.json | 2 +- .../components/netatmo/translations/hu.json | 2 +- .../components/netgear/translations/ca.json | 34 +++++++ .../components/netgear/translations/cs.json | 15 +++ .../components/netgear/translations/de.json | 34 +++++++ .../components/netgear/translations/en.json | 18 ++-- .../components/netgear/translations/es.json | 18 ++++ .../components/netgear/translations/et.json | 34 +++++++ .../components/netgear/translations/he.json | 26 +++++ .../components/netgear/translations/hu.json | 34 +++++++ .../components/netgear/translations/id.json | 18 ++++ .../components/netgear/translations/it.json | 34 +++++++ .../components/netgear/translations/nl.json | 34 +++++++ .../components/netgear/translations/no.json | 34 +++++++ .../netgear/translations/pt-BR.json | 28 ++++++ .../components/netgear/translations/ru.json | 34 +++++++ .../netgear/translations/zh-Hant.json | 34 +++++++ .../nfandroidtv/translations/es.json | 7 +- .../nfandroidtv/translations/hu.json | 2 +- .../nfandroidtv/translations/id.json | 10 ++ .../nightscout/translations/hu.json | 2 +- .../nightscout/translations/id.json | 2 +- .../nightscout/translations/no.json | 2 +- .../nmap_tracker/translations/es.json | 1 + .../nmap_tracker/translations/hu.json | 8 +- .../nmap_tracker/translations/id.json | 1 + .../nmap_tracker/translations/nl.json | 1 + .../nmap_tracker/translations/ru.json | 2 +- .../components/notion/translations/ca.json | 13 ++- .../components/notion/translations/de.json | 13 ++- .../components/notion/translations/en.json | 1 + .../components/notion/translations/et.json | 13 ++- .../components/notion/translations/he.json | 12 ++- .../components/notion/translations/hu.json | 13 ++- .../components/notion/translations/it.json | 13 ++- .../components/notion/translations/nl.json | 13 ++- .../components/notion/translations/no.json | 13 ++- .../components/notion/translations/ru.json | 13 ++- .../notion/translations/zh-Hant.json | 13 ++- .../components/nuheat/translations/de.json | 2 +- .../components/nuki/translations/hu.json | 2 +- .../components/nut/translations/hu.json | 2 +- .../components/nws/translations/hu.json | 2 +- .../components/nzbget/translations/hu.json | 2 +- .../components/nzbget/translations/id.json | 2 +- .../ondilo_ico/translations/hu.json | 2 +- .../components/onewire/translations/hu.json | 2 +- .../components/onvif/translations/hu.json | 14 +-- .../components/onvif/translations/id.json | 9 ++ .../opengarage/translations/ca.json | 22 +++++ .../opengarage/translations/de.json | 22 +++++ .../opengarage/translations/en.json | 22 +++++ .../opengarage/translations/es.json | 11 +++ .../opengarage/translations/et.json | 22 +++++ .../opengarage/translations/hu.json | 22 +++++ .../opengarage/translations/it.json | 22 +++++ .../opengarage/translations/nl.json | 22 +++++ .../opengarage/translations/no.json | 22 +++++ .../opengarage/translations/ru.json | 22 +++++ .../opengarage/translations/zh-Hant.json | 22 +++++ .../components/openuv/translations/es.json | 4 + .../components/openuv/translations/nl.json | 4 + .../openweathermap/translations/hu.json | 2 +- .../ovo_energy/translations/ca.json | 2 +- .../ovo_energy/translations/id.json | 2 +- .../components/owntracks/translations/hu.json | 4 +- .../components/ozw/translations/ca.json | 2 +- .../components/ozw/translations/hu.json | 6 +- .../p1_monitor/translations/es.json | 3 +- .../p1_monitor/translations/hu.json | 2 +- .../p1_monitor/translations/id.json | 16 ++++ .../panasonic_viera/translations/hu.json | 4 +- .../philips_js/translations/hu.json | 2 +- .../components/pi_hole/translations/hu.json | 2 +- .../components/picnic/translations/id.json | 5 + .../components/picnic/translations/ko.json | 21 ++++ .../components/plaato/translations/ca.json | 2 +- .../components/plaato/translations/es.json | 2 +- .../components/plaato/translations/hu.json | 6 +- .../components/plaato/translations/nl.json | 2 +- .../components/plant/translations/hu.json | 2 +- .../components/plex/translations/hu.json | 10 +- .../components/plugwise/translations/id.json | 2 +- .../plum_lightpad/translations/ca.json | 2 +- .../components/point/translations/he.json | 3 +- .../components/point/translations/hu.json | 8 +- .../components/point/translations/nl.json | 2 +- .../components/poolsense/translations/hu.json | 2 +- .../components/poolsense/translations/nl.json | 2 +- .../components/powerwall/translations/id.json | 2 +- .../components/profiler/translations/hu.json | 2 +- .../components/profiler/translations/nl.json | 2 +- .../progettihwsw/translations/he.json | 28 +++--- .../progettihwsw/translations/hu.json | 2 +- .../components/prosegur/translations/el.json | 11 +++ .../components/prosegur/translations/es.json | 10 +- .../components/prosegur/translations/id.json | 27 ++++++ .../components/ps4/translations/he.json | 3 + .../components/ps4/translations/hu.json | 4 +- .../pvpc_hourly_pricing/translations/hu.json | 2 +- .../pvpc_hourly_pricing/translations/id.json | 6 +- .../rainforest_eagle/translations/es.json | 7 +- .../rainforest_eagle/translations/hu.json | 2 +- .../rainforest_eagle/translations/id.json | 19 ++++ .../rainmachine/translations/hu.json | 2 +- .../components/renault/translations/ca.json | 2 +- .../components/renault/translations/cs.json | 9 +- .../components/renault/translations/el.json | 9 ++ .../components/renault/translations/es.json | 16 +++- .../components/renault/translations/hu.json | 2 +- .../components/renault/translations/id.json | 26 +++++ .../components/renault/translations/nl.json | 9 +- .../components/rfxtrx/translations/ca.json | 12 ++- .../components/rfxtrx/translations/de.json | 10 ++ .../components/rfxtrx/translations/en.json | 25 +++-- .../components/rfxtrx/translations/es.json | 10 ++ .../components/rfxtrx/translations/et.json | 10 ++ .../components/rfxtrx/translations/hu.json | 12 ++- .../components/rfxtrx/translations/it.json | 10 ++ .../components/rfxtrx/translations/nl.json | 10 ++ .../components/rfxtrx/translations/no.json | 10 ++ .../components/rfxtrx/translations/ru.json | 10 ++ .../rfxtrx/translations/zh-Hant.json | 10 ++ .../components/risco/translations/hu.json | 4 +- .../components/roku/translations/hu.json | 10 +- .../components/roku/translations/id.json | 2 +- .../components/roomba/translations/es.json | 2 +- .../components/roomba/translations/hu.json | 10 +- .../components/roomba/translations/id.json | 10 +- .../components/roon/translations/hu.json | 8 +- .../components/rpi_power/translations/hu.json | 4 +- .../components/rpi_power/translations/nl.json | 2 +- .../ruckus_unleashed/translations/hu.json | 2 +- .../components/samsungtv/translations/bg.json | 7 ++ .../components/samsungtv/translations/ca.json | 1 + .../components/samsungtv/translations/de.json | 1 + .../components/samsungtv/translations/en.json | 4 +- .../components/samsungtv/translations/es.json | 12 ++- .../components/samsungtv/translations/et.json | 1 + .../components/samsungtv/translations/hu.json | 11 ++- .../components/samsungtv/translations/id.json | 13 ++- .../components/samsungtv/translations/it.json | 1 + .../components/samsungtv/translations/nl.json | 1 + .../components/samsungtv/translations/no.json | 1 + .../components/samsungtv/translations/ru.json | 1 + .../samsungtv/translations/zh-Hant.json | 1 + .../screenlogic/translations/hu.json | 2 +- .../screenlogic/translations/id.json | 2 +- .../components/sensor/translations/el.json | 6 +- .../components/sensor/translations/id.json | 20 ++++ .../components/sentry/translations/hu.json | 2 +- .../components/sharkiq/translations/ca.json | 2 +- .../components/shelly/translations/ca.json | 8 +- .../components/shelly/translations/cs.json | 3 +- .../components/shelly/translations/de.json | 8 +- .../components/shelly/translations/en.json | 10 +- .../components/shelly/translations/es.json | 8 +- .../components/shelly/translations/et.json | 8 +- .../components/shelly/translations/he.json | 28 +++++- .../components/shelly/translations/hu.json | 12 ++- .../components/shelly/translations/id.json | 2 + .../components/shelly/translations/it.json | 8 +- .../components/shelly/translations/nl.json | 8 +- .../components/shelly/translations/no.json | 8 +- .../components/shelly/translations/ru.json | 10 +- .../shelly/translations/zh-Hant.json | 8 +- .../shopping_list/translations/hu.json | 2 +- .../components/sia/translations/es.json | 13 ++- .../components/sia/translations/id.json | 50 ++++++++++ .../simplisafe/translations/hu.json | 2 +- .../simplisafe/translations/id.json | 2 +- .../components/sma/translations/hu.json | 2 +- .../components/smappee/translations/hu.json | 6 +- .../components/smappee/translations/id.json | 2 +- .../smartthings/translations/hu.json | 8 +- .../components/smarttub/translations/ca.json | 2 +- .../components/smarttub/translations/hu.json | 4 +- .../components/smarttub/translations/id.json | 1 + .../components/smarttub/translations/ko.json | 3 + .../components/solarlog/translations/hu.json | 2 +- .../components/soma/translations/hu.json | 2 +- .../components/somfy/translations/hu.json | 2 +- .../somfy_mylink/translations/hu.json | 2 +- .../somfy_mylink/translations/id.json | 2 +- .../components/sonarr/translations/hu.json | 2 +- .../components/sonarr/translations/id.json | 2 +- .../components/songpal/translations/hu.json | 2 +- .../components/songpal/translations/id.json | 2 +- .../components/sonos/translations/he.json | 1 + .../components/sonos/translations/hu.json | 2 +- .../components/sonos/translations/id.json | 1 + .../speedtestdotnet/translations/hu.json | 4 +- .../speedtestdotnet/translations/nl.json | 2 +- .../components/spotify/translations/hu.json | 2 +- .../squeezebox/translations/hu.json | 4 +- .../squeezebox/translations/id.json | 2 +- .../components/subaru/translations/ca.json | 2 +- .../surepetcare/translations/ca.json | 20 ++++ .../surepetcare/translations/cs.json | 20 ++++ .../surepetcare/translations/de.json | 20 ++++ .../surepetcare/translations/en.json | 20 ++++ .../surepetcare/translations/es.json | 20 ++++ .../surepetcare/translations/et.json | 20 ++++ .../surepetcare/translations/he.json | 20 ++++ .../surepetcare/translations/hu.json | 20 ++++ .../surepetcare/translations/id.json | 20 ++++ .../surepetcare/translations/it.json | 20 ++++ .../surepetcare/translations/nl.json | 20 ++++ .../surepetcare/translations/no.json | 20 ++++ .../surepetcare/translations/pt-BR.json | 20 ++++ .../surepetcare/translations/ru.json | 20 ++++ .../surepetcare/translations/zh-Hant.json | 20 ++++ .../components/switch/translations/he.json | 15 +++ .../components/switchbot/translations/ca.json | 37 +++++++ .../components/switchbot/translations/cs.json | 14 +++ .../components/switchbot/translations/de.json | 37 +++++++ .../components/switchbot/translations/en.json | 17 ++-- .../components/switchbot/translations/es.json | 35 +++++++ .../components/switchbot/translations/et.json | 37 +++++++ .../components/switchbot/translations/he.json | 33 +++++++ .../components/switchbot/translations/hu.json | 39 ++++++++ .../components/switchbot/translations/id.json | 35 +++++++ .../components/switchbot/translations/it.json | 37 +++++++ .../components/switchbot/translations/nl.json | 37 +++++++ .../components/switchbot/translations/no.json | 37 +++++++ .../components/switchbot/translations/ro.json | 7 ++ .../components/switchbot/translations/ru.json | 37 +++++++ .../switchbot/translations/zh-Hant.json | 37 +++++++ .../switcher_kis/translations/es.json | 13 +++ .../switcher_kis/translations/hu.json | 2 +- .../switcher_kis/translations/id.json | 13 +++ .../switcher_kis/translations/nl.json | 2 +- .../components/syncthru/translations/id.json | 2 +- .../synology_dsm/translations/es.json | 16 +++- .../synology_dsm/translations/hu.json | 11 ++- .../synology_dsm/translations/id.json | 17 +++- .../synology_dsm/translations/it.json | 7 ++ .../synology_dsm/translations/nl.json | 7 ++ .../system_bridge/translations/hu.json | 2 +- .../components/tasmota/translations/hu.json | 4 +- .../tellduslive/translations/he.json | 3 +- .../tellduslive/translations/hu.json | 6 +- .../components/tibber/translations/hu.json | 2 +- .../components/tile/translations/ca.json | 2 +- .../components/toon/translations/he.json | 3 +- .../components/toon/translations/hu.json | 4 +- .../totalconnect/translations/ca.json | 2 +- .../totalconnect/translations/es.json | 2 +- .../totalconnect/translations/hu.json | 2 +- .../totalconnect/translations/id.json | 2 +- .../components/tplink/translations/ca.json | 19 ++++ .../components/tplink/translations/de.json | 19 ++++ .../components/tplink/translations/en.json | 6 +- .../components/tplink/translations/et.json | 19 ++++ .../components/tplink/translations/hu.json | 21 +++- .../components/tplink/translations/it.json | 19 ++++ .../components/tplink/translations/nl.json | 19 ++++ .../components/tplink/translations/no.json | 19 ++++ .../components/tplink/translations/ru.json | 19 ++++ .../tplink/translations/zh-Hant.json | 19 ++++ .../components/traccar/translations/hu.json | 4 +- .../components/tractive/translations/es.json | 11 ++- .../components/tradfri/translations/fi.json | 3 + .../components/tradfri/translations/hu.json | 6 +- .../transmission/translations/hu.json | 4 +- .../components/tuya/translations/af.json | 8 ++ .../components/tuya/translations/ca.json | 79 +++++++++++++++ .../components/tuya/translations/cs.json | 60 ++++++++++++ .../components/tuya/translations/de.json | 79 +++++++++++++++ .../components/tuya/translations/en.json | 74 +++++++++++--- .../components/tuya/translations/es.json | 79 +++++++++++++++ .../components/tuya/translations/et.json | 79 +++++++++++++++ .../components/tuya/translations/fi.json | 17 ++++ .../components/tuya/translations/fr.json | 65 +++++++++++++ .../components/tuya/translations/he.json | 30 ++++++ .../components/tuya/translations/hu.json | 65 +++++++++++++ .../components/tuya/translations/id.json | 65 +++++++++++++ .../components/tuya/translations/it.json | 79 +++++++++++++++ .../components/tuya/translations/ka.json | 37 +++++++ .../components/tuya/translations/ko.json | 65 +++++++++++++ .../components/tuya/translations/lb.json | 59 ++++++++++++ .../components/tuya/translations/nl.json | 78 +++++++++++++++ .../components/tuya/translations/no.json | 65 +++++++++++++ .../components/tuya/translations/pl.json | 65 +++++++++++++ .../components/tuya/translations/pt-BR.json | 17 ++++ .../components/tuya/translations/pt.json | 25 +++++ .../components/tuya/translations/ru.json | 79 +++++++++++++++ .../components/tuya/translations/sl.json | 11 +++ .../components/tuya/translations/sv.json | 17 ++++ .../components/tuya/translations/tr.json | 60 ++++++++++++ .../components/tuya/translations/uk.json | 63 ++++++++++++ .../components/tuya/translations/zh-Hans.json | 71 ++++++++++---- .../components/tuya/translations/zh-Hant.json | 79 +++++++++++++++ .../components/twilio/translations/hu.json | 6 +- .../components/twilio/translations/nl.json | 2 +- .../components/twinkly/translations/hu.json | 2 +- .../components/unifi/translations/hu.json | 14 +-- .../components/unifi/translations/id.json | 2 +- .../components/unifi/translations/ru.json | 2 +- .../components/updater/translations/hu.json | 2 +- .../components/upnp/translations/fi.json | 3 + .../components/upnp/translations/hu.json | 2 +- .../components/upnp/translations/id.json | 2 +- .../uptimerobot/translations/ca.json | 2 +- .../uptimerobot/translations/es.json | 12 +-- .../uptimerobot/translations/id.json | 26 +++++ .../components/vera/translations/hu.json | 12 +-- .../components/verisure/translations/ca.json | 2 +- .../components/verisure/translations/hu.json | 2 +- .../components/vilfo/translations/hu.json | 2 +- .../components/vizio/translations/hu.json | 6 +- .../components/volumio/translations/hu.json | 4 +- .../components/wallbox/translations/es.json | 8 +- .../components/wallbox/translations/id.json | 6 +- .../components/watttime/translations/ca.json | 34 +++++++ .../components/watttime/translations/cs.json | 30 ++++++ .../components/watttime/translations/de.json | 34 +++++++ .../components/watttime/translations/es.json | 34 +++++++ .../components/watttime/translations/et.json | 34 +++++++ .../components/watttime/translations/he.json | 30 ++++++ .../components/watttime/translations/hu.json | 34 +++++++ .../components/watttime/translations/id.json | 26 +++++ .../components/watttime/translations/it.json | 34 +++++++ .../components/watttime/translations/nl.json | 34 +++++++ .../components/watttime/translations/no.json | 34 +++++++ .../components/watttime/translations/ru.json | 34 +++++++ .../watttime/translations/zh-Hant.json | 34 +++++++ .../waze_travel_time/translations/id.json | 1 + .../components/wemo/translations/hu.json | 2 +- .../components/wemo/translations/id.json | 5 + .../components/whirlpool/translations/ca.json | 17 ++++ .../components/whirlpool/translations/cs.json | 17 ++++ .../components/whirlpool/translations/de.json | 17 ++++ .../components/whirlpool/translations/en.json | 7 +- .../components/whirlpool/translations/es.json | 17 ++++ .../components/whirlpool/translations/et.json | 17 ++++ .../components/whirlpool/translations/he.json | 17 ++++ .../components/whirlpool/translations/hu.json | 17 ++++ .../components/whirlpool/translations/id.json | 17 ++++ .../components/whirlpool/translations/it.json | 17 ++++ .../components/whirlpool/translations/nl.json | 17 ++++ .../components/whirlpool/translations/no.json | 17 ++++ .../whirlpool/translations/pt-BR.json | 17 ++++ .../components/whirlpool/translations/ru.json | 17 ++++ .../whirlpool/translations/zh-Hant.json | 17 ++++ .../components/wilight/translations/hu.json | 2 +- .../components/wilight/translations/id.json | 2 +- .../components/withings/translations/ca.json | 2 +- .../components/withings/translations/hu.json | 6 +- .../components/withings/translations/id.json | 2 +- .../components/wled/translations/hu.json | 8 +- .../components/wled/translations/id.json | 2 +- .../components/xbox/translations/hu.json | 2 +- .../xiaomi_aqara/translations/hu.json | 2 +- .../xiaomi_aqara/translations/id.json | 2 +- .../xiaomi_miio/translations/es.json | 7 +- .../xiaomi_miio/translations/hu.json | 4 +- .../xiaomi_miio/translations/id.json | 5 +- .../xiaomi_miio/translations/select.id.json | 9 ++ .../yale_smart_alarm/translations/ca.json | 2 +- .../yale_smart_alarm/translations/el.json | 11 +++ .../yale_smart_alarm/translations/es.json | 12 +-- .../yale_smart_alarm/translations/id.json | 28 ++++++ .../yamaha_musiccast/translations/es.json | 4 + .../yamaha_musiccast/translations/hu.json | 4 +- .../yamaha_musiccast/translations/nl.json | 2 +- .../components/yeelight/translations/es.json | 2 +- .../components/yeelight/translations/hu.json | 8 +- .../components/yeelight/translations/id.json | 4 +- .../components/youless/translations/es.json | 2 +- .../components/youless/translations/hu.json | 2 +- .../components/youless/translations/id.json | 15 +++ .../components/zerproc/translations/hu.json | 2 +- .../components/zerproc/translations/nl.json | 2 +- .../components/zha/translations/es.json | 3 +- .../components/zha/translations/hu.json | 2 +- .../components/zha/translations/id.json | 10 +- .../zoneminder/translations/hu.json | 2 +- .../components/zwave/translations/ca.json | 2 +- .../components/zwave/translations/hu.json | 6 +- .../components/zwave_js/translations/ca.json | 21 +++- .../components/zwave_js/translations/de.json | 17 ++++ .../components/zwave_js/translations/el.json | 1 + .../components/zwave_js/translations/en.json | 5 +- .../components/zwave_js/translations/es.json | 6 ++ .../components/zwave_js/translations/et.json | 17 ++++ .../components/zwave_js/translations/hu.json | 17 +++- .../components/zwave_js/translations/id.json | 15 ++- .../components/zwave_js/translations/it.json | 17 ++++ .../components/zwave_js/translations/nl.json | 11 ++- .../components/zwave_js/translations/no.json | 9 ++ .../components/zwave_js/translations/ru.json | 17 ++++ .../zwave_js/translations/zh-Hant.json | 17 ++++ 728 files changed, 8458 insertions(+), 822 deletions(-) create mode 100644 homeassistant/components/adax/translations/id.json create mode 100644 homeassistant/components/airthings/translations/ca.json create mode 100644 homeassistant/components/airthings/translations/de.json create mode 100644 homeassistant/components/airthings/translations/en.json create mode 100644 homeassistant/components/airthings/translations/et.json create mode 100644 homeassistant/components/airthings/translations/he.json create mode 100644 homeassistant/components/airthings/translations/hu.json create mode 100644 homeassistant/components/airthings/translations/it.json create mode 100644 homeassistant/components/airthings/translations/nl.json create mode 100644 homeassistant/components/airthings/translations/no.json create mode 100644 homeassistant/components/airthings/translations/ru.json create mode 100644 homeassistant/components/airthings/translations/zh-Hant.json create mode 100644 homeassistant/components/airtouch4/translations/id.json create mode 100644 homeassistant/components/ambee/translations/sensor.id.json create mode 100644 homeassistant/components/amberelectric/translations/ca.json create mode 100644 homeassistant/components/amberelectric/translations/de.json create mode 100644 homeassistant/components/amberelectric/translations/et.json create mode 100644 homeassistant/components/amberelectric/translations/hu.json create mode 100644 homeassistant/components/amberelectric/translations/it.json create mode 100644 homeassistant/components/amberelectric/translations/nl.json create mode 100644 homeassistant/components/amberelectric/translations/no.json create mode 100644 homeassistant/components/amberelectric/translations/ru.json create mode 100644 homeassistant/components/amberelectric/translations/zh-Hant.json create mode 100644 homeassistant/components/co2signal/translations/id.json create mode 100644 homeassistant/components/crownstone/translations/ca.json create mode 100644 homeassistant/components/crownstone/translations/cs.json create mode 100644 homeassistant/components/crownstone/translations/de.json create mode 100644 homeassistant/components/crownstone/translations/es.json create mode 100644 homeassistant/components/crownstone/translations/et.json create mode 100644 homeassistant/components/crownstone/translations/he.json create mode 100644 homeassistant/components/crownstone/translations/hu.json create mode 100644 homeassistant/components/crownstone/translations/id.json create mode 100644 homeassistant/components/crownstone/translations/it.json create mode 100644 homeassistant/components/crownstone/translations/ko.json create mode 100644 homeassistant/components/crownstone/translations/nl.json create mode 100644 homeassistant/components/crownstone/translations/no.json create mode 100644 homeassistant/components/crownstone/translations/ru.json create mode 100644 homeassistant/components/crownstone/translations/zh-Hant.json create mode 100644 homeassistant/components/demo/translations/he.json create mode 100644 homeassistant/components/demo/translations/ro.json create mode 100644 homeassistant/components/dlna_dmr/translations/ca.json create mode 100644 homeassistant/components/dlna_dmr/translations/de.json create mode 100644 homeassistant/components/dlna_dmr/translations/et.json create mode 100644 homeassistant/components/dlna_dmr/translations/hu.json create mode 100644 homeassistant/components/dlna_dmr/translations/it.json create mode 100644 homeassistant/components/dlna_dmr/translations/nl.json create mode 100644 homeassistant/components/dlna_dmr/translations/no.json create mode 100644 homeassistant/components/dlna_dmr/translations/ru.json create mode 100644 homeassistant/components/dlna_dmr/translations/zh-Hant.json create mode 100644 homeassistant/components/energy/translations/el.json create mode 100644 homeassistant/components/fjaraskupan/translations/es.json create mode 100644 homeassistant/components/fjaraskupan/translations/id.json create mode 100644 homeassistant/components/flipr/translations/id.json create mode 100644 homeassistant/components/fritz/translations/ko.json create mode 100644 homeassistant/components/homekit/translations/el.json create mode 100644 homeassistant/components/honeywell/translations/id.json create mode 100644 homeassistant/components/iotawatt/translations/id.json create mode 100644 homeassistant/components/kraken/translations/id.json create mode 100644 homeassistant/components/meteoclimatic/translations/id.json create mode 100644 homeassistant/components/modem_callerid/translations/ca.json create mode 100644 homeassistant/components/modem_callerid/translations/cs.json create mode 100644 homeassistant/components/modem_callerid/translations/de.json create mode 100644 homeassistant/components/modem_callerid/translations/es.json create mode 100644 homeassistant/components/modem_callerid/translations/et.json create mode 100644 homeassistant/components/modem_callerid/translations/he.json create mode 100644 homeassistant/components/modem_callerid/translations/hu.json create mode 100644 homeassistant/components/modem_callerid/translations/id.json create mode 100644 homeassistant/components/modem_callerid/translations/it.json create mode 100644 homeassistant/components/modem_callerid/translations/nl.json create mode 100644 homeassistant/components/modem_callerid/translations/no.json create mode 100644 homeassistant/components/modem_callerid/translations/ru.json create mode 100644 homeassistant/components/modem_callerid/translations/zh-Hant.json create mode 100644 homeassistant/components/modern_forms/translations/id.json create mode 100644 homeassistant/components/motioneye/translations/ko.json create mode 100644 homeassistant/components/mutesync/translations/id.json create mode 100644 homeassistant/components/nanoleaf/translations/id.json create mode 100644 homeassistant/components/netgear/translations/ca.json create mode 100644 homeassistant/components/netgear/translations/cs.json create mode 100644 homeassistant/components/netgear/translations/de.json create mode 100644 homeassistant/components/netgear/translations/es.json create mode 100644 homeassistant/components/netgear/translations/et.json create mode 100644 homeassistant/components/netgear/translations/he.json create mode 100644 homeassistant/components/netgear/translations/hu.json create mode 100644 homeassistant/components/netgear/translations/id.json create mode 100644 homeassistant/components/netgear/translations/it.json create mode 100644 homeassistant/components/netgear/translations/nl.json create mode 100644 homeassistant/components/netgear/translations/no.json create mode 100644 homeassistant/components/netgear/translations/pt-BR.json create mode 100644 homeassistant/components/netgear/translations/ru.json create mode 100644 homeassistant/components/netgear/translations/zh-Hant.json create mode 100644 homeassistant/components/nfandroidtv/translations/id.json create mode 100644 homeassistant/components/opengarage/translations/ca.json create mode 100644 homeassistant/components/opengarage/translations/de.json create mode 100644 homeassistant/components/opengarage/translations/en.json create mode 100644 homeassistant/components/opengarage/translations/es.json create mode 100644 homeassistant/components/opengarage/translations/et.json create mode 100644 homeassistant/components/opengarage/translations/hu.json create mode 100644 homeassistant/components/opengarage/translations/it.json create mode 100644 homeassistant/components/opengarage/translations/nl.json create mode 100644 homeassistant/components/opengarage/translations/no.json create mode 100644 homeassistant/components/opengarage/translations/ru.json create mode 100644 homeassistant/components/opengarage/translations/zh-Hant.json create mode 100644 homeassistant/components/p1_monitor/translations/id.json create mode 100644 homeassistant/components/picnic/translations/ko.json create mode 100644 homeassistant/components/prosegur/translations/el.json create mode 100644 homeassistant/components/prosegur/translations/id.json create mode 100644 homeassistant/components/rainforest_eagle/translations/id.json create mode 100644 homeassistant/components/renault/translations/el.json create mode 100644 homeassistant/components/renault/translations/id.json create mode 100644 homeassistant/components/samsungtv/translations/bg.json create mode 100644 homeassistant/components/sia/translations/id.json create mode 100644 homeassistant/components/surepetcare/translations/ca.json create mode 100644 homeassistant/components/surepetcare/translations/cs.json create mode 100644 homeassistant/components/surepetcare/translations/de.json create mode 100644 homeassistant/components/surepetcare/translations/en.json create mode 100644 homeassistant/components/surepetcare/translations/es.json create mode 100644 homeassistant/components/surepetcare/translations/et.json create mode 100644 homeassistant/components/surepetcare/translations/he.json create mode 100644 homeassistant/components/surepetcare/translations/hu.json create mode 100644 homeassistant/components/surepetcare/translations/id.json create mode 100644 homeassistant/components/surepetcare/translations/it.json create mode 100644 homeassistant/components/surepetcare/translations/nl.json create mode 100644 homeassistant/components/surepetcare/translations/no.json create mode 100644 homeassistant/components/surepetcare/translations/pt-BR.json create mode 100644 homeassistant/components/surepetcare/translations/ru.json create mode 100644 homeassistant/components/surepetcare/translations/zh-Hant.json create mode 100644 homeassistant/components/switchbot/translations/ca.json create mode 100644 homeassistant/components/switchbot/translations/cs.json create mode 100644 homeassistant/components/switchbot/translations/de.json create mode 100644 homeassistant/components/switchbot/translations/es.json create mode 100644 homeassistant/components/switchbot/translations/et.json create mode 100644 homeassistant/components/switchbot/translations/he.json create mode 100644 homeassistant/components/switchbot/translations/hu.json create mode 100644 homeassistant/components/switchbot/translations/id.json create mode 100644 homeassistant/components/switchbot/translations/it.json create mode 100644 homeassistant/components/switchbot/translations/nl.json create mode 100644 homeassistant/components/switchbot/translations/no.json create mode 100644 homeassistant/components/switchbot/translations/ro.json create mode 100644 homeassistant/components/switchbot/translations/ru.json create mode 100644 homeassistant/components/switchbot/translations/zh-Hant.json create mode 100644 homeassistant/components/switcher_kis/translations/es.json create mode 100644 homeassistant/components/switcher_kis/translations/id.json create mode 100644 homeassistant/components/tuya/translations/af.json create mode 100644 homeassistant/components/tuya/translations/ca.json create mode 100644 homeassistant/components/tuya/translations/cs.json create mode 100644 homeassistant/components/tuya/translations/de.json create mode 100644 homeassistant/components/tuya/translations/es.json create mode 100644 homeassistant/components/tuya/translations/et.json create mode 100644 homeassistant/components/tuya/translations/fi.json create mode 100644 homeassistant/components/tuya/translations/fr.json create mode 100644 homeassistant/components/tuya/translations/he.json create mode 100644 homeassistant/components/tuya/translations/hu.json create mode 100644 homeassistant/components/tuya/translations/id.json create mode 100644 homeassistant/components/tuya/translations/it.json create mode 100644 homeassistant/components/tuya/translations/ka.json create mode 100644 homeassistant/components/tuya/translations/ko.json create mode 100644 homeassistant/components/tuya/translations/lb.json create mode 100644 homeassistant/components/tuya/translations/nl.json create mode 100644 homeassistant/components/tuya/translations/no.json create mode 100644 homeassistant/components/tuya/translations/pl.json create mode 100644 homeassistant/components/tuya/translations/pt-BR.json create mode 100644 homeassistant/components/tuya/translations/pt.json create mode 100644 homeassistant/components/tuya/translations/ru.json create mode 100644 homeassistant/components/tuya/translations/sl.json create mode 100644 homeassistant/components/tuya/translations/sv.json create mode 100644 homeassistant/components/tuya/translations/tr.json create mode 100644 homeassistant/components/tuya/translations/uk.json create mode 100644 homeassistant/components/tuya/translations/zh-Hant.json create mode 100644 homeassistant/components/uptimerobot/translations/id.json create mode 100644 homeassistant/components/watttime/translations/ca.json create mode 100644 homeassistant/components/watttime/translations/cs.json create mode 100644 homeassistant/components/watttime/translations/de.json create mode 100644 homeassistant/components/watttime/translations/es.json create mode 100644 homeassistant/components/watttime/translations/et.json create mode 100644 homeassistant/components/watttime/translations/he.json create mode 100644 homeassistant/components/watttime/translations/hu.json create mode 100644 homeassistant/components/watttime/translations/id.json create mode 100644 homeassistant/components/watttime/translations/it.json create mode 100644 homeassistant/components/watttime/translations/nl.json create mode 100644 homeassistant/components/watttime/translations/no.json create mode 100644 homeassistant/components/watttime/translations/ru.json create mode 100644 homeassistant/components/watttime/translations/zh-Hant.json create mode 100644 homeassistant/components/whirlpool/translations/ca.json create mode 100644 homeassistant/components/whirlpool/translations/cs.json create mode 100644 homeassistant/components/whirlpool/translations/de.json create mode 100644 homeassistant/components/whirlpool/translations/es.json create mode 100644 homeassistant/components/whirlpool/translations/et.json create mode 100644 homeassistant/components/whirlpool/translations/he.json create mode 100644 homeassistant/components/whirlpool/translations/hu.json create mode 100644 homeassistant/components/whirlpool/translations/id.json create mode 100644 homeassistant/components/whirlpool/translations/it.json create mode 100644 homeassistant/components/whirlpool/translations/nl.json create mode 100644 homeassistant/components/whirlpool/translations/no.json create mode 100644 homeassistant/components/whirlpool/translations/pt-BR.json create mode 100644 homeassistant/components/whirlpool/translations/ru.json create mode 100644 homeassistant/components/whirlpool/translations/zh-Hant.json create mode 100644 homeassistant/components/xiaomi_miio/translations/select.id.json create mode 100644 homeassistant/components/yale_smart_alarm/translations/el.json create mode 100644 homeassistant/components/yale_smart_alarm/translations/id.json create mode 100644 homeassistant/components/youless/translations/id.json diff --git a/homeassistant/components/accuweather/translations/hu.json b/homeassistant/components/accuweather/translations/hu.json index 7b4d270f78b..8b0409d1f22 100644 --- a/homeassistant/components/accuweather/translations/hu.json +++ b/homeassistant/components/accuweather/translations/hu.json @@ -6,7 +6,7 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_api_key": "\u00c9rv\u00e9nytelen API kulcs", - "requests_exceeded": "T\u00fall\u00e9pt\u00e9k az Accuweather API-hoz beny\u00fajtott k\u00e9relmek megengedett sz\u00e1m\u00e1t. Meg kell v\u00e1rnia vagy m\u00f3dos\u00edtania kell az API-kulcsot." + "requests_exceeded": "Accuweather API-hoz enged\u00e9lyezett lek\u00e9r\u00e9sek sz\u00e1ma t\u00fal lett l\u00e9pve. Meg kell v\u00e1rnia m\u00edg a tilt\u00e1s lej\u00e1r vagy m\u00f3dos\u00edtania kell az API-kulcsot." }, "step": { "user": { diff --git a/homeassistant/components/adax/translations/es.json b/homeassistant/components/adax/translations/es.json index 20ecaaa0dd2..985d0ab663f 100644 --- a/homeassistant/components/adax/translations/es.json +++ b/homeassistant/components/adax/translations/es.json @@ -1,10 +1,17 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, + "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida" + }, "step": { "user": { "data": { "account_id": "ID de la cuenta", - "host": "Anfitri\u00f3n", + "host": "Host", "password": "Contrase\u00f1a" } } diff --git a/homeassistant/components/adax/translations/hu.json b/homeassistant/components/adax/translations/hu.json index 726381a4dd7..94397487c87 100644 --- a/homeassistant/components/adax/translations/hu.json +++ b/homeassistant/components/adax/translations/hu.json @@ -11,7 +11,7 @@ "user": { "data": { "account_id": "Fi\u00f3k ID", - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "password": "Jelsz\u00f3" } } diff --git a/homeassistant/components/adax/translations/id.json b/homeassistant/components/adax/translations/id.json new file mode 100644 index 00000000000..e554913bdc8 --- /dev/null +++ b/homeassistant/components/adax/translations/id.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid" + }, + "step": { + "user": { + "data": { + "account_id": "ID Akun", + "host": "Host", + "password": "Kata Sandi" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/adguard/translations/he.json b/homeassistant/components/adguard/translations/he.json index e2114d19d97..9970667cf40 100644 --- a/homeassistant/components/adguard/translations/he.json +++ b/homeassistant/components/adguard/translations/he.json @@ -7,6 +7,9 @@ "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" }, "step": { + "hassio_confirm": { + "title": "AdGuard Home \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05e8\u05d7\u05d1\u05ea Assistant Assistant" + }, "user": { "data": { "host": "\u05de\u05d0\u05e8\u05d7", diff --git a/homeassistant/components/adguard/translations/hu.json b/homeassistant/components/adguard/translations/hu.json index 8a860caf79d..3939de8aea5 100644 --- a/homeassistant/components/adguard/translations/hu.json +++ b/homeassistant/components/adguard/translations/hu.json @@ -9,12 +9,12 @@ }, "step": { "hassio_confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Home Assistant-ot, hogy csatlakozzon az AdGuard Home-hoz, amelyet a kieg\u00e9sz\u00edt\u0151 biztos\u00edt: {addon} ?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot AdGuard Home-hoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", "title": "Az AdGuard Home a Home Assistant kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata", diff --git a/homeassistant/components/adguard/translations/id.json b/homeassistant/components/adguard/translations/id.json index d3334997f59..91d06526184 100644 --- a/homeassistant/components/adguard/translations/id.json +++ b/homeassistant/components/adguard/translations/id.json @@ -9,7 +9,7 @@ }, "step": { "hassio_confirm": { - "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke AdGuard Home yang disediakan oleh add-on Supervisor {addon}?", + "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke AdGuard Home yang disediakan oleh add-on: {addon}?", "title": "AdGuard Home melalui add-on Home Assistant" }, "user": { diff --git a/homeassistant/components/agent_dvr/translations/hu.json b/homeassistant/components/agent_dvr/translations/hu.json index fff86517073..b8fec1c281d 100644 --- a/homeassistant/components/agent_dvr/translations/hu.json +++ b/homeassistant/components/agent_dvr/translations/hu.json @@ -4,13 +4,13 @@ "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van" }, "error": { - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "\u00c1ll\u00edtsa be az Agent DVR-t" diff --git a/homeassistant/components/airthings/translations/ca.json b/homeassistant/components/airthings/translations/ca.json new file mode 100644 index 00000000000..c90f9cc6364 --- /dev/null +++ b/homeassistant/components/airthings/translations/ca.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "El compte ja est\u00e0 configurat" + }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "description": "Inicia sessi\u00f3 a {url} per obtenir les credencials", + "id": "ID", + "secret": "Secret" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/de.json b/homeassistant/components/airthings/translations/de.json new file mode 100644 index 00000000000..7bd5e347776 --- /dev/null +++ b/homeassistant/components/airthings/translations/de.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Konto wurde bereits konfiguriert" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "description": "Melde dich unter {url} an, um deine Zugangsdaten zu finden", + "id": "ID", + "secret": "Geheimnis" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/en.json b/homeassistant/components/airthings/translations/en.json new file mode 100644 index 00000000000..a7430dedd81 --- /dev/null +++ b/homeassistant/components/airthings/translations/en.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Account is already configured" + }, + "error": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "description": "Login at {url} to find your credentials", + "id": "ID", + "secret": "Secret" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/et.json b/homeassistant/components/airthings/translations/et.json new file mode 100644 index 00000000000..708416f16c1 --- /dev/null +++ b/homeassistant/components/airthings/translations/et.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Konto on juba h\u00e4\u00e4lestatud" + }, + "error": { + "cannot_connect": "\u00dchendamine nurjus", + "invalid_auth": "Tuvastamise t\u00f5rge", + "unknown": "Ootamatu t\u00f5rge" + }, + "step": { + "user": { + "data": { + "description": "Logi sisse aadressil {url}, et leida oma mandaadid", + "id": "Kasutajatunnus", + "secret": "Salas\u00f5na" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/he.json b/homeassistant/components/airthings/translations/he.json new file mode 100644 index 00000000000..c6c0d910ae4 --- /dev/null +++ b/homeassistant/components/airthings/translations/he.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "step": { + "user": { + "data": { + "id": "\u05de\u05d6\u05d4\u05d4", + "secret": "\u05e1\u05d5\u05d3" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/hu.json b/homeassistant/components/airthings/translations/hu.json new file mode 100644 index 00000000000..136348d38b4 --- /dev/null +++ b/homeassistant/components/airthings/translations/hu.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van" + }, + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s", + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" + }, + "step": { + "user": { + "data": { + "description": "Jelentkezzen be a {url} c\u00edmen hogy megkapja hiteles\u00edt\u0151 adatait", + "id": "Azonos\u00edt\u00f3", + "secret": "Titok" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/it.json b/homeassistant/components/airthings/translations/it.json new file mode 100644 index 00000000000..68a0c152f56 --- /dev/null +++ b/homeassistant/components/airthings/translations/it.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "L'account \u00e8 gi\u00e0 configurato" + }, + "error": { + "cannot_connect": "Impossibile connettersi", + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "description": "Accedi a {url} per trovare le tue credenziali", + "id": "ID", + "secret": "Segreto" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/nl.json b/homeassistant/components/airthings/translations/nl.json new file mode 100644 index 00000000000..3f0e753b375 --- /dev/null +++ b/homeassistant/components/airthings/translations/nl.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Account is al geconfigureerd" + }, + "error": { + "cannot_connect": "Kan geen verbinding maken", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, + "step": { + "user": { + "data": { + "description": "Log in op {url} om uw inloggegevens te vinden", + "id": "ID", + "secret": "Geheim" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/no.json b/homeassistant/components/airthings/translations/no.json new file mode 100644 index 00000000000..8609dff2e16 --- /dev/null +++ b/homeassistant/components/airthings/translations/no.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "Kontoen er allerede konfigurert" + }, + "error": { + "cannot_connect": "Tilkobling mislyktes", + "invalid_auth": "Ugyldig godkjenning", + "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "description": "Logg p\u00e5 {url} \u00e5 finne legitimasjonen din", + "id": "ID", + "secret": "Hemmelig" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/ru.json b/homeassistant/components/airthings/translations/ru.json new file mode 100644 index 00000000000..6ec7077860e --- /dev/null +++ b/homeassistant/components/airthings/translations/ru.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant." + }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "description": "\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435: {url}", + "id": "ID", + "secret": "\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043e\u0434" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airthings/translations/zh-Hant.json b/homeassistant/components/airthings/translations/zh-Hant.json new file mode 100644 index 00000000000..0cafeb9886d --- /dev/null +++ b/homeassistant/components/airthings/translations/zh-Hant.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "description": "\u767b\u5165 {url} \u4ee5\u53d6\u5f97\u6191\u8b49", + "id": "ID", + "secret": "\u5bc6\u78bc" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airtouch4/translations/es.json b/homeassistant/components/airtouch4/translations/es.json index eeae1153555..65616d2a2e9 100644 --- a/homeassistant/components/airtouch4/translations/es.json +++ b/homeassistant/components/airtouch4/translations/es.json @@ -1,12 +1,16 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, "error": { + "cannot_connect": "No se pudo conectar", "no_units": "No se pudo encontrar ning\u00fan grupo AirTouch 4." }, "step": { "user": { "data": { - "host": "Anfitri\u00f3n" + "host": "Host" }, "title": "Configura los detalles de conexi\u00f3n de tu AirTouch 4." } diff --git a/homeassistant/components/airtouch4/translations/hu.json b/homeassistant/components/airtouch4/translations/hu.json index c5d54de31de..861582fad3e 100644 --- a/homeassistant/components/airtouch4/translations/hu.json +++ b/homeassistant/components/airtouch4/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "Gazdag\u00e9p" + "host": "C\u00edm" }, "title": "\u00c1ll\u00edtsa be az AirTouch 4 csatlakoz\u00e1si adatait." } diff --git a/homeassistant/components/airtouch4/translations/id.json b/homeassistant/components/airtouch4/translations/id.json new file mode 100644 index 00000000000..c8236f5ec73 --- /dev/null +++ b/homeassistant/components/airtouch4/translations/id.json @@ -0,0 +1,17 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung" + }, + "step": { + "user": { + "data": { + "host": "Host" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/airvisual/translations/hu.json b/homeassistant/components/airvisual/translations/hu.json index 043a2402283..48d4f5b98eb 100644 --- a/homeassistant/components/airvisual/translations/hu.json +++ b/homeassistant/components/airvisual/translations/hu.json @@ -32,7 +32,7 @@ }, "node_pro": { "data": { - "ip_address": "Hoszt", + "ip_address": "C\u00edm", "password": "Jelsz\u00f3" }, "description": "Szem\u00e9lyes AirVisual egys\u00e9g figyel\u00e9se. A jelsz\u00f3 lek\u00e9rhet\u0151 a k\u00e9sz\u00fcl\u00e9k felhaszn\u00e1l\u00f3i fel\u00fclet\u00e9r\u0151l.", diff --git a/homeassistant/components/alarmdecoder/translations/hu.json b/homeassistant/components/alarmdecoder/translations/hu.json index ace9c7059ca..3c9781672f4 100644 --- a/homeassistant/components/alarmdecoder/translations/hu.json +++ b/homeassistant/components/alarmdecoder/translations/hu.json @@ -14,7 +14,7 @@ "data": { "device_baudrate": "Eszk\u00f6z \u00e1tviteli sebess\u00e9ge", "device_path": "Eszk\u00f6z el\u00e9r\u00e9si \u00fatja", - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "Konfigur\u00e1lja a csatlakoz\u00e1si be\u00e1ll\u00edt\u00e1sokat" diff --git a/homeassistant/components/almond/translations/hu.json b/homeassistant/components/almond/translations/hu.json index 568cd7270de..27932696561 100644 --- a/homeassistant/components/almond/translations/hu.json +++ b/homeassistant/components/almond/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, "step": { "hassio_confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Home Assistant alkalmaz\u00e1st az Almondhoz val\u00f3 csatlakoz\u00e1shoz, amelyet a Supervisor kieg\u00e9sz\u00edt\u0151 biztos\u00edt: {addon} ?", - "title": "Almond a Supervisor kieg\u00e9sz\u00edt\u0151n kereszt\u00fcl" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot az Almondhoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", + "title": "Almond - Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal" }, "pick_implementation": { "title": "V\u00e1lassz hiteles\u00edt\u00e9si m\u00f3dszert" diff --git a/homeassistant/components/almond/translations/id.json b/homeassistant/components/almond/translations/id.json index 21a627132c4..8e4302220b5 100644 --- a/homeassistant/components/almond/translations/id.json +++ b/homeassistant/components/almond/translations/id.json @@ -8,7 +8,7 @@ }, "step": { "hassio_confirm": { - "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke Almond yang disediakan oleh add-on Supervisor {addon}?", + "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke Almond yang disediakan oleh add-on: {addon}?", "title": "Almond melalui add-on Home Assistant" }, "pick_implementation": { diff --git a/homeassistant/components/ambee/translations/es.json b/homeassistant/components/ambee/translations/es.json index de5ce971fa0..7f4f8b75de5 100644 --- a/homeassistant/components/ambee/translations/es.json +++ b/homeassistant/components/ambee/translations/es.json @@ -1,12 +1,26 @@ { "config": { + "abort": { + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" + }, + "error": { + "cannot_connect": "No se pudo conectar", + "invalid_api_key": "Clave API no v\u00e1lida" + }, "step": { "reauth_confirm": { "data": { + "api_key": "Clave API", "description": "Vuelva a autenticarse con su cuenta de Ambee." } }, "user": { + "data": { + "api_key": "Clave API", + "latitude": "Latitud", + "longitude": "Longitud", + "name": "Nombre" + }, "description": "Configure Ambee para que se integre con Home Assistant." } } diff --git a/homeassistant/components/ambee/translations/hu.json b/homeassistant/components/ambee/translations/hu.json index 4cf99c596f0..299d97914bc 100644 --- a/homeassistant/components/ambee/translations/hu.json +++ b/homeassistant/components/ambee/translations/hu.json @@ -21,7 +21,7 @@ "longitude": "Hossz\u00fas\u00e1g", "name": "N\u00e9v" }, - "description": "\u00c1ll\u00edtsa be az Ambee-t a Homeassistanttal val\u00f3 integr\u00e1ci\u00f3hoz." + "description": "\u00c1ll\u00edtsa be Ambee-t Home Assistant-tal val\u00f3 integr\u00e1ci\u00f3hoz." } } } diff --git a/homeassistant/components/ambee/translations/id.json b/homeassistant/components/ambee/translations/id.json index ecf627579fe..a5790d95ecd 100644 --- a/homeassistant/components/ambee/translations/id.json +++ b/homeassistant/components/ambee/translations/id.json @@ -10,7 +10,8 @@ "step": { "reauth_confirm": { "data": { - "api_key": "Kunci API" + "api_key": "Kunci API", + "description": "Autentikasi ulang dengan akun Ambee Anda." } }, "user": { @@ -19,7 +20,8 @@ "latitude": "Lintang", "longitude": "Bujur", "name": "Nama" - } + }, + "description": "Siapkan Ambee Anda untuk diintegrasikan dengan Home Assistant." } } } diff --git a/homeassistant/components/ambee/translations/sensor.id.json b/homeassistant/components/ambee/translations/sensor.id.json new file mode 100644 index 00000000000..61bdea468ee --- /dev/null +++ b/homeassistant/components/ambee/translations/sensor.id.json @@ -0,0 +1,9 @@ +{ + "state": { + "ambee__risk": { + "high": "Tinggi", + "low": "Rendah", + "moderate": "Sedang" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/ca.json b/homeassistant/components/amberelectric/translations/ca.json new file mode 100644 index 00000000000..cf9bca64df6 --- /dev/null +++ b/homeassistant/components/amberelectric/translations/ca.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Nom del lloc", + "site_nmi": "NMI del lloc" + }, + "description": "Selecciona l'NMI del lloc que vulguis afegir", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "Token d'API", + "site_id": "ID del lloc" + }, + "description": "Ves a {api_url} per generar una clau API", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/de.json b/homeassistant/components/amberelectric/translations/de.json new file mode 100644 index 00000000000..2143795f479 --- /dev/null +++ b/homeassistant/components/amberelectric/translations/de.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Name des Standorts", + "site_nmi": "Standort NMI" + }, + "description": "W\u00e4hle die NMI des Standorts, den du hinzuf\u00fcgen m\u00f6chtest", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "API-Token", + "site_id": "Site-ID" + }, + "description": "Gehe zu {api_url}, um einen API-Schl\u00fcssel zu generieren", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/et.json b/homeassistant/components/amberelectric/translations/et.json new file mode 100644 index 00000000000..05a7e6c6dc2 --- /dev/null +++ b/homeassistant/components/amberelectric/translations/et.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Saidi nimi", + "site_nmi": "Saidi NMI" + }, + "description": "Vali lisatava saidi NMI", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "API v\u00f5ti", + "site_id": "Saidi ID" + }, + "description": "API-v\u00f5tme saamiseks ava {api_url}.", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/hu.json b/homeassistant/components/amberelectric/translations/hu.json new file mode 100644 index 00000000000..9811f5a5f8f --- /dev/null +++ b/homeassistant/components/amberelectric/translations/hu.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Hely neve", + "site_nmi": "Hely NMI" + }, + "description": "V\u00e1lassza ki a hozz\u00e1adni k\u00edv\u00e1nt hely NMI-j\u00e9t.", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "API Token", + "site_id": "Hely ID" + }, + "description": "API-kulcs gener\u00e1l\u00e1s\u00e1hoz l\u00e1togasson el ide: {api_url}", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/it.json b/homeassistant/components/amberelectric/translations/it.json new file mode 100644 index 00000000000..5b061561954 --- /dev/null +++ b/homeassistant/components/amberelectric/translations/it.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Nome del sito", + "site_nmi": "Sito NMI" + }, + "description": "Seleziona l'NMI del sito che desideri aggiungere", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "Token API", + "site_id": "ID sito" + }, + "description": "Vai su {api_url} per generare una chiave API", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/nl.json b/homeassistant/components/amberelectric/translations/nl.json new file mode 100644 index 00000000000..a874c12f283 --- /dev/null +++ b/homeassistant/components/amberelectric/translations/nl.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Sitenaam", + "site_nmi": "Site NMI" + }, + "description": "Selecteer de NMI van de site die u wilt toevoegen", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "API Token", + "site_id": "Site ID" + }, + "description": "Ga naar {api_url} om een API sleutel aan te maken", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/no.json b/homeassistant/components/amberelectric/translations/no.json new file mode 100644 index 00000000000..90d4bd930b9 --- /dev/null +++ b/homeassistant/components/amberelectric/translations/no.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "Side navn", + "site_nmi": "Nettsted NMI" + }, + "description": "Velg NMI for nettstedet du vil legge til", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "API-token", + "site_id": "Nettsted -ID" + }, + "description": "G\u00e5 til {api_url} \u00e5 generere en API -n\u00f8kkel", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/ru.json b/homeassistant/components/amberelectric/translations/ru.json new file mode 100644 index 00000000000..4b8caee72ee --- /dev/null +++ b/homeassistant/components/amberelectric/translations/ru.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0430", + "site_nmi": "NMI \u0443\u0447\u0430\u0441\u0442\u043a\u0430" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 NMI \u0443\u0447\u0430\u0441\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "\u0422\u043e\u043a\u0435\u043d API", + "site_id": "ID \u0443\u0447\u0430\u0441\u0442\u043a\u0430" + }, + "description": "\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 {api_url} \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 API.", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/amberelectric/translations/zh-Hant.json b/homeassistant/components/amberelectric/translations/zh-Hant.json new file mode 100644 index 00000000000..0af0e5e60bb --- /dev/null +++ b/homeassistant/components/amberelectric/translations/zh-Hant.json @@ -0,0 +1,22 @@ +{ + "config": { + "step": { + "site": { + "data": { + "site_name": "\u4f4d\u5740\u540d\u7a31", + "site_nmi": "\u4f4d\u5740 NMI" + }, + "description": "\u9078\u64c7\u6240\u8981\u65b0\u589e\u7684\u4f4d\u5740 NMI", + "title": "Amber Electric" + }, + "user": { + "data": { + "api_token": "API \u6b0a\u6756", + "site_id": "\u4f4d\u5740 ID" + }, + "description": "\u9023\u7dda\u81f3 {api_url} \u4ee5\u7522\u751f API \u5bc6\u9470", + "title": "Amber Electric" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/ambiclimate/translations/ca.json b/homeassistant/components/ambiclimate/translations/ca.json index 8e54a222217..234cb1a413c 100644 --- a/homeassistant/components/ambiclimate/translations/ca.json +++ b/homeassistant/components/ambiclimate/translations/ca.json @@ -2,7 +2,7 @@ "config": { "abort": { "access_token": "S'ha produ\u00eft un error desconegut al generat un token d'acc\u00e9s.", - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "missing_configuration": "El component no est\u00e0 configurat. Mira'n la documentaci\u00f3." }, "create_entry": { diff --git a/homeassistant/components/ambiclimate/translations/hu.json b/homeassistant/components/ambiclimate/translations/hu.json index 3898535c427..597645658d8 100644 --- a/homeassistant/components/ambiclimate/translations/hu.json +++ b/homeassistant/components/ambiclimate/translations/hu.json @@ -3,18 +3,18 @@ "abort": { "access_token": "Ismeretlen hiba a hozz\u00e1f\u00e9r\u00e9si token gener\u00e1l\u00e1s\u00e1ban.", "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t." + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t." }, "create_entry": { "default": "Sikeres hiteles\u00edt\u00e9s" }, "error": { - "follow_link": "K\u00e9rlek, k\u00f6vesd a hivatkoz\u00e1st \u00e9s hiteles\u00edtsd magad miel\u0151tt megnyomod a K\u00fcld\u00e9s gombot", + "follow_link": "K\u00e9rem, k\u00f6vesse a hivatkoz\u00e1st \u00e9s hiteles\u00edtse mag\u00e1t miel\u0151tt megnyomn\u00e1 a K\u00fcld\u00e9s gombot", "no_token": "Nem hiteles\u00edtett Ambiclimate" }, "step": { "auth": { - "description": "K\u00e9rj\u00fck, k\u00f6vesse ezt a [link] ({authorization_url} Author_url}) \u00e9s ** Enged\u00e9lyezze ** a hozz\u00e1f\u00e9r\u00e9st Ambiclimate -fi\u00f3kj\u00e1hoz, majd t\u00e9rjen vissza, \u00e9s nyomja meg az al\u00e1bbi ** K\u00fcld\u00e9s ** gombot.\n (Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a megadott visszah\u00edv\u00e1si URL {cb_url})", + "description": "K\u00e9rj\u00fck, k\u00f6vesse ezt a [link]({authorization_url}}) \u00e9s ** Enged\u00e9lyezze ** a hozz\u00e1f\u00e9r\u00e9st Ambiclimate -fi\u00f3kj\u00e1hoz, majd t\u00e9rjen vissza, \u00e9s nyomja meg az al\u00e1bbi ** K\u00fcld\u00e9s ** gombot.\n(Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a megadott visszah\u00edv\u00e1si URL {cb_url})", "title": "Ambiclimate hiteles\u00edt\u00e9se" } } diff --git a/homeassistant/components/apple_tv/translations/hu.json b/homeassistant/components/apple_tv/translations/hu.json index 2b6275fc9f5..3d254422baf 100644 --- a/homeassistant/components/apple_tv/translations/hu.json +++ b/homeassistant/components/apple_tv/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured_device": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "backoff": "Az eszk\u00f6z jelenleg nem fogadja el a p\u00e1ros\u00edt\u00e1si k\u00e9relmeket (lehet, hogy t\u00fal sokszor adott meg \u00e9rv\u00e9nytelen PIN-k\u00f3dot), pr\u00f3b\u00e1lkozzon \u00fajra k\u00e9s\u0151bb.", "device_did_not_pair": "A p\u00e1ros\u00edt\u00e1s folyamat\u00e1t az eszk\u00f6zr\u0151l nem pr\u00f3b\u00e1lt\u00e1k befejezni.", "invalid_config": "Az eszk\u00f6z konfigur\u00e1l\u00e1sa nem teljes. K\u00e9rj\u00fck, pr\u00f3b\u00e1lja meg \u00fajra hozz\u00e1adni.", @@ -19,7 +19,7 @@ "flow_title": "{name}", "step": { "confirm": { - "description": "Arra k\u00e9sz\u00fcl, hogy felvegye a (z) {name} nev\u0171 Apple TV-t a Home Assistant programba. \n\n ** A folyamat befejez\u00e9s\u00e9hez t\u00f6bb PIN-k\u00f3dot kell megadnia. ** \n\n Felh\u00edvjuk figyelm\u00e9t, hogy ezzel az integr\u00e1ci\u00f3val * nem fogja tudni kikapcsolni az Apple TV-t. Csak a Home Assistant m\u00e9dialej\u00e1tsz\u00f3ja kapcsol ki!", + "description": "Arra k\u00e9sz\u00fcl, hogy felvegye {name} nev\u0171 Apple TV-t a Home Assistant p\u00e9ld\u00e1ny\u00e1ba. \n\n ** A folyamat befejez\u00e9s\u00e9hez t\u00f6bb PIN-k\u00f3dot kell megadnia. ** \n\nFelh\u00edvjuk figyelm\u00e9t, hogy ezzel az integr\u00e1ci\u00f3val *nem* fogja tudni kikapcsolni az Apple TV-t. Csak a Home Assistant saj\u00e1t m\u00e9dialej\u00e1tsz\u00f3ja kapcsol ki!", "title": "Apple TV sikeresen hozz\u00e1adva" }, "pair_no_pin": { @@ -30,7 +30,7 @@ "data": { "pin": "PIN-k\u00f3d" }, - "description": "P\u00e1ros\u00edt\u00e1sra van sz\u00fcks\u00e9g a(z) {protocol} protokollhoz. K\u00e9rj\u00fck, adja meg a k\u00e9perny\u0151n megjelen\u0151 PIN-k\u00f3dot. A vezet\u0151 null\u00e1kat el kell hagyni, azaz \u00edrja be a 123 \u00e9rt\u00e9ket, ha a megjelen\u00edtett k\u00f3d 0123.", + "description": "P\u00e1ros\u00edt\u00e1sra van sz\u00fcks\u00e9g a(z) {protocol} protokollhoz. K\u00e9rj\u00fck, adja meg a k\u00e9perny\u0151n megjelen\u0151 PIN-k\u00f3dot. A vezet\u0151 null\u00e1kat el kell hagyni, pl. \u00edrja be a 123 \u00e9rt\u00e9ket, ha a megjelen\u00edtett k\u00f3d 0123.", "title": "P\u00e1ros\u00edt\u00e1s" }, "reconfigure": { @@ -45,7 +45,7 @@ "data": { "device_input": "Eszk\u00f6z" }, - "description": "El\u0151sz\u00f6r \u00edrja be a hozz\u00e1adni k\u00edv\u00e1nt Apple TV eszk\u00f6znev\u00e9t (pl. Konyha vagy H\u00e1l\u00f3szoba) vagy IP-c\u00edm\u00e9t. Ha valamilyen eszk\u00f6zt automatikusan tal\u00e1ltak a h\u00e1l\u00f3zat\u00e1n, az al\u00e1bb l\u00e1that\u00f3. \n\n Ha nem l\u00e1tja eszk\u00f6z\u00e9t, vagy b\u00e1rmilyen probl\u00e9m\u00e1t tapasztal, pr\u00f3b\u00e1lja meg megadni az eszk\u00f6z IP-c\u00edm\u00e9t. \n\n {devices}", + "description": "El\u0151sz\u00f6r \u00edrja be a hozz\u00e1adni k\u00edv\u00e1nt Apple TV eszk\u00f6znev\u00e9t (pl. Konyha vagy H\u00e1l\u00f3szoba) vagy IP-c\u00edm\u00e9t. Ha valamilyen eszk\u00f6zt automatikusan tal\u00e1ltak a h\u00e1l\u00f3zat\u00e1n, az al\u00e1bb l\u00e1that\u00f3. \n\nHa nem l\u00e1tja eszk\u00f6z\u00e9t, vagy b\u00e1rmilyen probl\u00e9m\u00e1t tapasztal, pr\u00f3b\u00e1lja meg megadni az eszk\u00f6z IP-c\u00edm\u00e9t. \n\n {devices}", "title": "\u00daj Apple TV be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/apple_tv/translations/id.json b/homeassistant/components/apple_tv/translations/id.json index 5646b498242..209ecbf8a83 100644 --- a/homeassistant/components/apple_tv/translations/id.json +++ b/homeassistant/components/apple_tv/translations/id.json @@ -16,7 +16,7 @@ "no_usable_service": "Perangkat ditemukan tetapi kami tidak dapat mengidentifikasi berbagai cara untuk membuat koneksi ke perangkat tersebut. Jika Anda terus melihat pesan ini, coba tentukan alamat IP-nya atau mulai ulang Apple TV Anda.", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Apple TV: {name}", + "flow_title": "{name}", "step": { "confirm": { "description": "Anda akan menambahkan Apple TV bernama `{name}` ke Home Assistant.\n\n** Untuk menyelesaikan proses, Anda mungkin harus memasukkan kode PIN beberapa kali.**\n\nPerhatikan bahwa Anda *tidak* akan dapat mematikan Apple TV dengan integrasi ini. Hanya pemutar media di Home Assistant yang akan dimatikan!", diff --git a/homeassistant/components/arcam_fmj/translations/hu.json b/homeassistant/components/arcam_fmj/translations/hu.json index 9539ad39bed..c7532f24b76 100644 --- a/homeassistant/components/arcam_fmj/translations/hu.json +++ b/homeassistant/components/arcam_fmj/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, "error": { @@ -16,10 +16,10 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, - "description": "K\u00e9rj\u00fck, adja meg az eszk\u00f6z gazdag\u00e9pnev\u00e9t vagy IP-c\u00edm\u00e9t." + "description": "K\u00e9rj\u00fck, adja meg az eszk\u00f6z hosztnev\u00e9t vagy c\u00edm\u00e9t" } } }, diff --git a/homeassistant/components/arcam_fmj/translations/id.json b/homeassistant/components/arcam_fmj/translations/id.json index 96b10140948..cee43cbb4e9 100644 --- a/homeassistant/components/arcam_fmj/translations/id.json +++ b/homeassistant/components/arcam_fmj/translations/id.json @@ -5,7 +5,7 @@ "already_in_progress": "Alur konfigurasi sedang berlangsung", "cannot_connect": "Gagal terhubung" }, - "flow_title": "Arcam FMJ di {host}", + "flow_title": "{host}", "step": { "confirm": { "description": "Ingin menambahkan Arcam FMJ `{host}` ke Home Assistant?" diff --git a/homeassistant/components/asuswrt/translations/hu.json b/homeassistant/components/asuswrt/translations/hu.json index 891150c1038..ff64372f1b0 100644 --- a/homeassistant/components/asuswrt/translations/hu.json +++ b/homeassistant/components/asuswrt/translations/hu.json @@ -14,7 +14,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "mode": "M\u00f3d", "name": "N\u00e9v", "password": "Jelsz\u00f3", diff --git a/homeassistant/components/asuswrt/translations/ru.json b/homeassistant/components/asuswrt/translations/ru.json index a2090b1faf6..f77fcb4fb3a 100644 --- a/homeassistant/components/asuswrt/translations/ru.json +++ b/homeassistant/components/asuswrt/translations/ru.json @@ -32,7 +32,7 @@ "step": { "init": { "data": { - "consider_home": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \"\u041d\u0435 \u0434\u043e\u043c\u0430\"", + "consider_home": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0434\u043e\u043c\u0430", "dnsmasq": "\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 dnsmasq.leases", "interface": "\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, eth0, eth1 \u0438 \u0442. \u0434.)", "require_ip": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u043c (\u0434\u043b\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430)", diff --git a/homeassistant/components/atag/translations/hu.json b/homeassistant/components/atag/translations/hu.json index 8c3b4a055b0..aa605923dfd 100644 --- a/homeassistant/components/atag/translations/hu.json +++ b/homeassistant/components/atag/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "Csatlakoz\u00e1s az eszk\u00f6zh\u00f6z" diff --git a/homeassistant/components/august/translations/ca.json b/homeassistant/components/august/translations/ca.json index f0b1fa43c3d..ee9a860b1d1 100644 --- a/homeassistant/components/august/translations/ca.json +++ b/homeassistant/components/august/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/august/translations/hu.json b/homeassistant/components/august/translations/hu.json index aeaef514e71..22e16dda305 100644 --- a/homeassistant/components/august/translations/hu.json +++ b/homeassistant/components/august/translations/hu.json @@ -14,7 +14,7 @@ "data": { "password": "Jelsz\u00f3" }, - "description": "Add meg a(z) {username} jelszav\u00e1t.", + "description": "Adja meg a(z) {username} jelszav\u00e1t.", "title": "August fi\u00f3k \u00fajrahiteles\u00edt\u00e9se" }, "user_validate": { diff --git a/homeassistant/components/auth/translations/fi.json b/homeassistant/components/auth/translations/fi.json index 92e4f03c0f9..ca174d81e6e 100644 --- a/homeassistant/components/auth/translations/fi.json +++ b/homeassistant/components/auth/translations/fi.json @@ -12,6 +12,11 @@ "title": "Ilmoita kertaluonteinen salasana" }, "totp": { + "step": { + "init": { + "title": "M\u00e4\u00e4rit\u00e4 kaksivaiheinen todennus TOTP:n avulla" + } + }, "title": "TOTP" } } diff --git a/homeassistant/components/auth/translations/hu.json b/homeassistant/components/auth/translations/hu.json index 5e7b1835093..47ecf846e0f 100644 --- a/homeassistant/components/auth/translations/hu.json +++ b/homeassistant/components/auth/translations/hu.json @@ -9,11 +9,11 @@ }, "step": { "init": { - "description": "K\u00e9rlek, v\u00e1lassz egyet az \u00e9rtes\u00edt\u00e9si szolg\u00e1ltat\u00e1sok k\u00f6z\u00fcl:", + "description": "K\u00e9rem, v\u00e1lasszon egyet az \u00e9rtes\u00edt\u00e9si szolg\u00e1ltat\u00e1sok k\u00f6z\u00fcl:", "title": "\u00c1ll\u00edtsa be az \u00e9rtes\u00edt\u00e9si \u00f6sszetev\u0151 \u00e1ltal megadott egyszeri jelsz\u00f3t" }, "setup": { - "description": "Az egyszeri jelsz\u00f3 el lett k\u00fcldve a(z) **notify.{notify_service}** szolg\u00e1ltat\u00e1ssal. K\u00e9rlek, add meg al\u00e1bb:", + "description": "Az egyszeri jelsz\u00f3 el lett k\u00fcldve a(z) **notify.{notify_service}** szolg\u00e1ltat\u00e1ssal. K\u00e9rem, adja meg al\u00e1bb:", "title": "Be\u00e1ll\u00edt\u00e1s ellen\u0151rz\u00e9se" } }, @@ -21,11 +21,11 @@ }, "totp": { "error": { - "invalid_code": "\u00c9rv\u00e9nytelen k\u00f3d, pr\u00f3b\u00e1ld \u00fajra. Ha ez a hiba folyamatosan el\u0151fordul, akkor gy\u0151z\u0151dj meg r\u00f3la, hogy a Home Assistant rendszered \u00f3r\u00e1ja pontosan j\u00e1r." + "invalid_code": "\u00c9rv\u00e9nytelen k\u00f3d, pr\u00f3b\u00e1lja \u00fajra. Ha ez a hiba folyamatosan el\u0151fordul, akkor gy\u0151z\u0151dj\u00f6n meg r\u00f3la, hogy a Home Assistant rendszer\u00e9nek \u00f3r\u00e1ja pontosan j\u00e1r." }, "step": { "init": { - "description": "Ahhoz, hogy haszn\u00e1lhasd a k\u00e9tfaktoros hiteles\u00edt\u00e9st id\u0151alap\u00fa egyszeri jelszavakkal, szkenneld be a QR k\u00f3dot a hiteles\u00edt\u00e9si applik\u00e1ci\u00f3ddal. Ha m\u00e9g nincsen, akkor a [Google Hiteles\u00edt\u0151](https://support.google.com/accounts/answer/1066447)t vagy az [Authy](https://authy.com/)-t aj\u00e1nljuk.\n\n{qr_code}\n\nA k\u00f3d beolvas\u00e1sa ut\u00e1n add meg a hat sz\u00e1mjegy\u0171 k\u00f3dot az applik\u00e1ci\u00f3b\u00f3l a telep\u00edt\u00e9s ellen\u0151rz\u00e9s\u00e9hez. Ha probl\u00e9m\u00e1ba \u00fctk\u00f6z\u00f6l a QR k\u00f3d beolvas\u00e1s\u00e1n\u00e1l, akkor ind\u00edts egy k\u00e9zi be\u00e1ll\u00edt\u00e1st a **`{code}`** k\u00f3ddal.", + "description": "Ahhoz, hogy haszn\u00e1lhassa a k\u00e9tfaktoros hiteles\u00edt\u00e9st id\u0151alap\u00fa egyszeri jelszavakkal, szkennelje be a QR k\u00f3dot a hiteles\u00edt\u00e9si applik\u00e1ci\u00f3j\u00e1val. Ha m\u00e9g nincs ilyenje, akkor aj\u00e1nljuk figyelm\u00e9be a [Google Hiteles\u00edt\u0151](https://support.google.com/accounts/answer/1066447)t vagy az [Authy](https://authy.com/)-t.\n\n{qr_code}\n\nA k\u00f3d beolvas\u00e1sa ut\u00e1n adja meg a hat sz\u00e1mjegy\u0171 k\u00f3dot az applik\u00e1ci\u00f3b\u00f3l a telep\u00edt\u00e9s ellen\u0151rz\u00e9s\u00e9hez. Ha probl\u00e9m\u00e1ba \u00fctk\u00f6zne a QR k\u00f3d beolvas\u00e1s\u00e1n\u00e1l, akkor ind\u00edtson egy k\u00e9zi be\u00e1ll\u00edt\u00e1st a **`{code}`** k\u00f3ddal.", "title": "K\u00e9tfaktoros hiteles\u00edt\u00e9s be\u00e1ll\u00edt\u00e1sa TOTP haszn\u00e1lat\u00e1val" } }, diff --git a/homeassistant/components/automation/translations/hu.json b/homeassistant/components/automation/translations/hu.json index 85640af23ba..559523b1b12 100644 --- a/homeassistant/components/automation/translations/hu.json +++ b/homeassistant/components/automation/translations/hu.json @@ -5,5 +5,5 @@ "on": "Be" } }, - "title": "Automatiz\u00e1l\u00e1s" + "title": "Automatizmus" } \ No newline at end of file diff --git a/homeassistant/components/awair/translations/ca.json b/homeassistant/components/awair/translations/ca.json index 2e75af9e744..ac69e06df1e 100644 --- a/homeassistant/components/awair/translations/ca.json +++ b/homeassistant/components/awair/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "no_devices_found": "No s'han trobat dispositius a la xarxa", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, diff --git a/homeassistant/components/awair/translations/hu.json b/homeassistant/components/awair/translations/hu.json index f465186a95b..62187becd37 100644 --- a/homeassistant/components/awair/translations/hu.json +++ b/homeassistant/components/awair/translations/hu.json @@ -15,7 +15,7 @@ "access_token": "Hozz\u00e1f\u00e9r\u00e9si token", "email": "E-mail" }, - "description": "Add meg \u00fajra az Awair fejleszt\u0151i hozz\u00e1f\u00e9r\u00e9si tokent." + "description": "Adja meg \u00fajra az Awair fejleszt\u0151i hozz\u00e1f\u00e9r\u00e9si tokent." }, "user": { "data": { diff --git a/homeassistant/components/axis/translations/hu.json b/homeassistant/components/axis/translations/hu.json index 709de5851ad..0cddf167437 100644 --- a/homeassistant/components/axis/translations/hu.json +++ b/homeassistant/components/axis/translations/hu.json @@ -7,15 +7,15 @@ }, "error": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s" }, - "flow_title": "Axis eszk\u00f6z: {name} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" diff --git a/homeassistant/components/azure_devops/translations/ca.json b/homeassistant/components/azure_devops/translations/ca.json index b3eb6e4eb8e..e6811e54078 100644 --- a/homeassistant/components/azure_devops/translations/ca.json +++ b/homeassistant/components/azure_devops/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/azure_devops/translations/id.json b/homeassistant/components/azure_devops/translations/id.json index 42292805b08..bad7c022b93 100644 --- a/homeassistant/components/azure_devops/translations/id.json +++ b/homeassistant/components/azure_devops/translations/id.json @@ -9,7 +9,7 @@ "invalid_auth": "Autentikasi tidak valid", "project_error": "Tidak bisa mendapatkan info proyek." }, - "flow_title": "Azure DevOps: {project_url}", + "flow_title": "{project_url}", "step": { "reauth": { "data": { diff --git a/homeassistant/components/binary_sensor/translations/id.json b/homeassistant/components/binary_sensor/translations/id.json index ac880aa28fa..54dcb66dd7a 100644 --- a/homeassistant/components/binary_sensor/translations/id.json +++ b/homeassistant/components/binary_sensor/translations/id.json @@ -178,6 +178,9 @@ "off": "Tidak ada", "on": "Terdeteksi" }, + "update": { + "on": "Pembaruan tersedia" + }, "vibration": { "off": "Tidak ada", "on": "Terdeteksi" diff --git a/homeassistant/components/binary_sensor/translations/is.json b/homeassistant/components/binary_sensor/translations/is.json index f53316ebd73..bd1ed9c389a 100644 --- a/homeassistant/components/binary_sensor/translations/is.json +++ b/homeassistant/components/binary_sensor/translations/is.json @@ -45,7 +45,7 @@ "on": "Hreyfing" }, "occupancy": { - "off": "Hreinsa", + "off": "Engin vi\u00f0vera", "on": "Uppg\u00f6tva\u00f0" }, "presence": { diff --git a/homeassistant/components/blebox/translations/hu.json b/homeassistant/components/blebox/translations/hu.json index ce51a8a0967..056402ea13f 100644 --- a/homeassistant/components/blebox/translations/hu.json +++ b/homeassistant/components/blebox/translations/hu.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt", - "unsupported_version": "A BleBox eszk\u00f6z elavult firmware-rel rendelkezik. El\u0151sz\u00f6r friss\u00edtsd." + "unsupported_version": "A BleBox eszk\u00f6z elavult firmware-rel rendelkezik. K\u00e9rem, friss\u00edtse el\u0151bb." }, "flow_title": "{name} ({host})", "step": { diff --git a/homeassistant/components/blebox/translations/id.json b/homeassistant/components/blebox/translations/id.json index 2ef604d1bff..f0bb4d34746 100644 --- a/homeassistant/components/blebox/translations/id.json +++ b/homeassistant/components/blebox/translations/id.json @@ -9,7 +9,7 @@ "unknown": "Kesalahan yang tidak diharapkan", "unsupported_version": "Firmware Perangkat BleBox sudah usang. Tingkatkan terlebih dulu." }, - "flow_title": "Perangkat BleBox: {name} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/blink/translations/hu.json b/homeassistant/components/blink/translations/hu.json index 135a2f7ef2e..1822dfbcf50 100644 --- a/homeassistant/components/blink/translations/hu.json +++ b/homeassistant/components/blink/translations/hu.json @@ -14,7 +14,7 @@ "data": { "2fa": "K\u00e9tfaktoros k\u00f3d" }, - "description": "Add meg az e-mail c\u00edmedre k\u00fcld\u00f6tt pint", + "description": "Adja meg az e-mail c\u00edm\u00e9re k\u00fcld\u00f6tt PIN-t", "title": "K\u00e9tfaktoros hiteles\u00edt\u00e9s" }, "user": { diff --git a/homeassistant/components/bmw_connected_drive/translations/ca.json b/homeassistant/components/bmw_connected_drive/translations/ca.json index d6bd70064c3..eb12ac6fc3b 100644 --- a/homeassistant/components/bmw_connected_drive/translations/ca.json +++ b/homeassistant/components/bmw_connected_drive/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3", diff --git a/homeassistant/components/bond/translations/es.json b/homeassistant/components/bond/translations/es.json index d9918238515..33d3dbb4408 100644 --- a/homeassistant/components/bond/translations/es.json +++ b/homeassistant/components/bond/translations/es.json @@ -9,13 +9,13 @@ "old_firmware": "Firmware antiguo no compatible en el dispositivo Bond - actual\u00edzalo antes de continuar", "unknown": "Error inesperado" }, - "flow_title": "Bond: {bond_id} ({host})", + "flow_title": "{name} ({host})", "step": { "confirm": { "data": { "access_token": "Token de acceso" }, - "description": "\u00bfQuieres configurar {bond_id}?" + "description": "\u00bfQuieres configurar {name}?" }, "user": { "data": { diff --git a/homeassistant/components/bond/translations/hu.json b/homeassistant/components/bond/translations/hu.json index 535d3586b93..c1bac971f4b 100644 --- a/homeassistant/components/bond/translations/hu.json +++ b/homeassistant/components/bond/translations/hu.json @@ -15,12 +15,12 @@ "data": { "access_token": "Hozz\u00e1f\u00e9r\u00e9si token" }, - "description": "Szeretn\u00e9d be\u00e1ll\u00edtani a(z) {name}-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}-t?" }, "user": { "data": { "access_token": "Hozz\u00e1f\u00e9r\u00e9si token", - "host": "Hoszt" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/bond/translations/id.json b/homeassistant/components/bond/translations/id.json index 56c633cf31c..00a9dbac45d 100644 --- a/homeassistant/components/bond/translations/id.json +++ b/homeassistant/components/bond/translations/id.json @@ -9,7 +9,7 @@ "old_firmware": "Firmware lama yang tidak didukung pada perangkat Bond - tingkatkan versi sebelum melanjutkan", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Bond: {name} ({host})", + "flow_title": "{name} ({host})", "step": { "confirm": { "data": { diff --git a/homeassistant/components/bosch_shc/translations/es.json b/homeassistant/components/bosch_shc/translations/es.json index 6de8f923f5a..df180029c55 100644 --- a/homeassistant/components/bosch_shc/translations/es.json +++ b/homeassistant/components/bosch_shc/translations/es.json @@ -1,6 +1,12 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" + }, "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "pairing_failed": "El emparejamiento ha fallado; compruebe que el Bosch Smart Home Controller est\u00e1 en modo de emparejamiento (el LED parpadea) y que su contrase\u00f1a es correcta.", "session_error": "Error de sesi\u00f3n: La API devuelve un resultado no correcto.", "unknown": "Error inesperado" @@ -16,7 +22,8 @@ } }, "reauth_confirm": { - "description": "La integraci\u00f3n bosch_shc necesita volver a autentificar su cuenta" + "description": "La integraci\u00f3n bosch_shc necesita volver a autentificar su cuenta", + "title": "Volver a autenticar la integraci\u00f3n" }, "user": { "data": { diff --git a/homeassistant/components/bosch_shc/translations/hu.json b/homeassistant/components/bosch_shc/translations/hu.json index 8b4ebc6be32..cf0090475b7 100644 --- a/homeassistant/components/bosch_shc/translations/hu.json +++ b/homeassistant/components/bosch_shc/translations/hu.json @@ -14,7 +14,7 @@ "flow_title": "Bosch SHC: {name}", "step": { "confirm_discovery": { - "description": "K\u00e9rj\u00fck, addig nyomja a Bosch Smart Home Controller el\u00fcls\u0151 gombj\u00e1t, am\u00edg a LED villogni nem kezd.\n K\u00e9szen \u00e1ll a (z) {model} @ {host} be\u00e1ll\u00edt\u00e1s\u00e1nak folytat\u00e1s\u00e1ra a Home Assistant seg\u00edts\u00e9g\u00e9vel?" + "description": "K\u00e9rj\u00fck, addig nyomja a Bosch Smart Home Controller el\u00fcls\u0151 gombj\u00e1t, am\u00edg a LED villogni nem kezd.\nK\u00e9szen \u00e1ll {model} @ {host} be\u00e1ll\u00edt\u00e1s\u00e1nak folytat\u00e1s\u00e1ra Home Assistant seg\u00edts\u00e9g\u00e9vel?" }, "credentials": { "data": { @@ -27,9 +27,9 @@ }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "\u00c1ll\u00edtsa be a Bosch intelligens otthoni vez\u00e9rl\u0151t, hogy lehet\u0151v\u00e9 tegye a fel\u00fcgyeletet \u00e9s a vez\u00e9rl\u00e9st a Home Assistant seg\u00edts\u00e9g\u00e9vel.", + "description": "\u00c1ll\u00edtsa be a Bosch intelligens otthoni vez\u00e9rl\u0151t, hogy lehet\u0151v\u00e9 tegye a fel\u00fcgyeletet \u00e9s a vez\u00e9rl\u00e9st Home Assistant seg\u00edts\u00e9g\u00e9vel.", "title": "SHC hiteles\u00edt\u00e9si param\u00e9terek" } } diff --git a/homeassistant/components/braviatv/translations/hu.json b/homeassistant/components/braviatv/translations/hu.json index 5f96af8bad7..00e88955c81 100644 --- a/homeassistant/components/braviatv/translations/hu.json +++ b/homeassistant/components/braviatv/translations/hu.json @@ -14,12 +14,12 @@ "data": { "pin": "PIN-k\u00f3d" }, - "description": "\u00cdrja be a Sony Bravia TV -n l\u00e1that\u00f3 PIN -k\u00f3dot. \n\n Ha a PIN -k\u00f3d nem jelenik meg, t\u00f6r\u00f6lje a Home Assistant regisztr\u00e1ci\u00f3j\u00e1t a t\u00e9v\u00e9n, l\u00e9pjen a k\u00f6vetkez\u0151re: Be\u00e1ll\u00edt\u00e1sok - > H\u00e1l\u00f3zat - > T\u00e1voli eszk\u00f6z be\u00e1ll\u00edt\u00e1sai - > T\u00e1vol\u00edtsa el a t\u00e1voli eszk\u00f6z regisztr\u00e1ci\u00f3j\u00e1t.", + "description": "\u00cdrja be a Sony Bravia TV -n l\u00e1that\u00f3 PIN -k\u00f3dot. \n\nHa a PIN -k\u00f3d nem jelenik meg, t\u00f6r\u00f6lje a Home Assistant regisztr\u00e1ci\u00f3j\u00e1t a t\u00e9v\u00e9n, l\u00e9pjen a k\u00f6vetkez\u0151re: Be\u00e1ll\u00edt\u00e1sok - > H\u00e1l\u00f3zat - > T\u00e1voli eszk\u00f6z be\u00e1ll\u00edt\u00e1sai - > T\u00e1vol\u00edtsa el a t\u00e1voli eszk\u00f6z regisztr\u00e1ci\u00f3j\u00e1t.", "title": "Sony Bravia TV enged\u00e9lyez\u00e9se" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "\u00c1ll\u00edtsa be a Sony Bravia TV integr\u00e1ci\u00f3t. Ha probl\u00e9m\u00e1i vannak a konfigur\u00e1ci\u00f3val, l\u00e1togasson el a k\u00f6vetkez\u0151 oldalra: https://www.home-assistant.io/integrations/braviatv \n\n Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a TV be van kapcsolva.", "title": "Sony Bravia TV" diff --git a/homeassistant/components/broadlink/translations/es.json b/homeassistant/components/broadlink/translations/es.json index e7a35c2876f..d0020c55bca 100644 --- a/homeassistant/components/broadlink/translations/es.json +++ b/homeassistant/components/broadlink/translations/es.json @@ -38,7 +38,7 @@ "user": { "data": { "host": "Host", - "timeout": "Se acab\u00f3 el tiempo" + "timeout": "L\u00edmite de tiempo" }, "title": "Conectarse al dispositivo" } diff --git a/homeassistant/components/broadlink/translations/hu.json b/homeassistant/components/broadlink/translations/hu.json index 8b8dce984e5..3d792f43597 100644 --- a/homeassistant/components/broadlink/translations/hu.json +++ b/homeassistant/components/broadlink/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_host": "\u00c9rv\u00e9nytelen hosztn\u00e9v vagy IP-c\u00edm", "not_supported": "Az eszk\u00f6z nem t\u00e1mogatott", @@ -22,22 +22,22 @@ "data": { "name": "N\u00e9v" }, - "title": "V\u00e1lassz egy nevet az eszk\u00f6znek" + "title": "V\u00e1lasszonegy nevet az eszk\u00f6znek" }, "reset": { - "description": "{name} ({model} a {host} c\u00edmen) z\u00e1rolva van. A hiteles\u00edt\u00e9shez \u00e9s a konfigur\u00e1ci\u00f3 befejez\u00e9s\u00e9hez fel kell oldani az eszk\u00f6z z\u00e1rol\u00e1s\u00e1t. Utas\u00edt\u00e1sok:\n 1. Nyisd meg a Broadlink alkalmaz\u00e1st.\n 2. Kattints az eszk\u00f6zre.\n 3. Kattints a jobb fels\u0151 sarokban tal\u00e1lhat\u00f3 `...` gombra.\n 4. G\u00f6rgess az oldal alj\u00e1ra.\n 5. Kapcsold ki a z\u00e1rol\u00e1s\u00e1t.", + "description": "{name} ({model} a {host} c\u00edmen) z\u00e1rolva van. A hiteles\u00edt\u00e9shez \u00e9s a konfigur\u00e1ci\u00f3 befejez\u00e9s\u00e9hez fel kell oldani az eszk\u00f6z z\u00e1rol\u00e1s\u00e1t. Utas\u00edt\u00e1sok:\n 1. Nyissa meg a Broadlink alkalmaz\u00e1st.\n 2. Kattintson az eszk\u00f6zre.\n 3. Kattintson a jobb fels\u0151 sarokban tal\u00e1lhat\u00f3 `...` gombra.\n 4. G\u00f6rgessen az oldal alj\u00e1ra.\n 5. Kapcsolja ki a z\u00e1rol\u00e1s\u00e1t.", "title": "Az eszk\u00f6z felold\u00e1sa" }, "unlock": { "data": { "unlock": "Igen, csin\u00e1ld." }, - "description": "{name} ({model} a {host} c\u00edmen) z\u00e1rolva van. Ez hiteles\u00edt\u00e9si probl\u00e9m\u00e1khoz vezethet a Home Assistantban. Szeretn\u00e9d feloldani?", + "description": "{name} ({model} a {host} c\u00edmen) z\u00e1rolva van. Ez hiteles\u00edt\u00e9si probl\u00e9m\u00e1khoz vezethet Home Assistant-ban. Szeretn\u00e9 feloldani?", "title": "Az eszk\u00f6z felold\u00e1sa (opcion\u00e1lis)" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "timeout": "Id\u0151t\u00fall\u00e9p\u00e9s" }, "title": "Csatlakoz\u00e1s az eszk\u00f6zh\u00f6z" diff --git a/homeassistant/components/brother/translations/hu.json b/homeassistant/components/brother/translations/hu.json index ae950f58f72..9d733e4cda6 100644 --- a/homeassistant/components/brother/translations/hu.json +++ b/homeassistant/components/brother/translations/hu.json @@ -9,11 +9,11 @@ "snmp_error": "Az SNMP szerver ki van kapcsolva, vagy a nyomtat\u00f3 nem t\u00e1mogatott.", "wrong_host": "\u00c9rv\u00e9nytelen \u00e1llom\u00e1sn\u00e9v vagy IP-c\u00edm." }, - "flow_title": "Brother nyomtat\u00f3: {model} {serial_number}", + "flow_title": "{model} {serial_number}", "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "type": "A nyomtat\u00f3 t\u00edpusa" }, "description": "A Brother nyomtat\u00f3 integr\u00e1ci\u00f3j\u00e1nak be\u00e1ll\u00edt\u00e1sa. Ha probl\u00e9m\u00e1id vannak a konfigur\u00e1ci\u00f3val, l\u00e1togass el a k\u00f6vetkez\u0151 oldalra: https://www.home-assistant.io/integrations/brother" @@ -22,7 +22,7 @@ "data": { "type": "A nyomtat\u00f3 t\u00edpusa" }, - "description": "Hozz\u00e1 akarja adni a {model} Brother nyomtat\u00f3t, amelynek sorsz\u00e1ma: {serial_number} `, a Home Assistant-hoz?", + "description": "Hozz\u00e1 szeretn\u00e9 adni a {model} Brother nyomtat\u00f3t, amelynek sorsz\u00e1ma: `{serial_number}`, Home Assistant-hoz?", "title": "Felfedezett Brother nyomtat\u00f3" } } diff --git a/homeassistant/components/brother/translations/id.json b/homeassistant/components/brother/translations/id.json index 5e0b562017c..ed02999710e 100644 --- a/homeassistant/components/brother/translations/id.json +++ b/homeassistant/components/brother/translations/id.json @@ -9,7 +9,7 @@ "snmp_error": "Server SNMP dimatikan atau printer tidak didukung.", "wrong_host": "Nama host atau alamat IP tidak valid." }, - "flow_title": "Printer Brother: {model} {serial_number}", + "flow_title": "{model} {serial_number}", "step": { "user": { "data": { diff --git a/homeassistant/components/bsblan/translations/hu.json b/homeassistant/components/bsblan/translations/hu.json index 51feb8b75d7..60a781cc758 100644 --- a/homeassistant/components/bsblan/translations/hu.json +++ b/homeassistant/components/bsblan/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "passkey": "Jelsz\u00f3 karakterl\u00e1nc", "password": "Jelsz\u00f3", "port": "Port", diff --git a/homeassistant/components/bsblan/translations/id.json b/homeassistant/components/bsblan/translations/id.json index 6e8ac0bd4cb..83fdb88aae4 100644 --- a/homeassistant/components/bsblan/translations/id.json +++ b/homeassistant/components/bsblan/translations/id.json @@ -6,7 +6,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "BSB-Lan: {name}", + "flow_title": "{name}", "step": { "user": { "data": { diff --git a/homeassistant/components/buienradar/translations/id.json b/homeassistant/components/buienradar/translations/id.json index 194ecb51c12..a4331fced9f 100644 --- a/homeassistant/components/buienradar/translations/id.json +++ b/homeassistant/components/buienradar/translations/id.json @@ -1,8 +1,15 @@ { "config": { + "abort": { + "already_configured": "Lokasi sudah dikonfigurasi" + }, + "error": { + "already_configured": "Lokasi sudah dikonfigurasi" + }, "step": { "user": { "data": { + "latitude": "Lintang", "longitude": "Bujur" } } diff --git a/homeassistant/components/canary/translations/id.json b/homeassistant/components/canary/translations/id.json index 5f092847b4d..6fdc76feb72 100644 --- a/homeassistant/components/canary/translations/id.json +++ b/homeassistant/components/canary/translations/id.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "Canary: {name}", + "flow_title": "{name}", "step": { "user": { "data": { diff --git a/homeassistant/components/cast/translations/hu.json b/homeassistant/components/cast/translations/hu.json index 0f64f8de6fe..2d74d3183c8 100644 --- a/homeassistant/components/cast/translations/hu.json +++ b/homeassistant/components/cast/translations/hu.json @@ -11,11 +11,11 @@ "data": { "known_hosts": "Ismert hosztok" }, - "description": "K\u00e9rj\u00fck, add meg a Google Cast konfigur\u00e1ci\u00f3t.", + "description": "Ismert c\u00edmek - A cast eszk\u00f6z\u00f6k hostneveinek vagy IP-c\u00edmeinek vessz\u0151vel elv\u00e1lasztott list\u00e1ja, akkor haszn\u00e1lja, ha az mDNS felder\u00edt\u00e9s nem m\u0171k\u00f6dik.", "title": "Google Cast konfigur\u00e1ci\u00f3" }, "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } }, @@ -29,7 +29,7 @@ "ignore_cec": "A CEC figyelmen k\u00edv\u00fcl hagy\u00e1sa", "uuid": "Enged\u00e9lyezett UUID-k" }, - "description": "Enged\u00e9lyezett UUID - vessz\u0151vel elv\u00e1lasztott lista a Cast-eszk\u00f6z\u00f6k UUID-j\u00e9b\u0151l, amelyeket hozz\u00e1 lehet adni a Home Assistanthoz. Csak akkor haszn\u00e1lja, ha nem akarja hozz\u00e1adni az \u00f6sszes rendelkez\u00e9sre \u00e1ll\u00f3 cast eszk\u00f6zt.\n CEC figyelmen k\u00edv\u00fcl hagy\u00e1sa - vessz\u0151vel elv\u00e1lasztott Chromecast-lista, amelynek figyelmen k\u00edv\u00fcl kell hagynia a CEC-adatokat az akt\u00edv bemenet meghat\u00e1roz\u00e1s\u00e1hoz. Ezt tov\u00e1bb\u00edtjuk a pychromecast.IGNORE_CEC c\u00edmre.", + "description": "Enged\u00e9lyezett UUID - vessz\u0151vel elv\u00e1lasztott lista a Cast-eszk\u00f6z\u00f6k UUID-j\u00e9b\u0151l, amelyeket hozz\u00e1 lehet adni Home Assistant-hoz. Csak akkor haszn\u00e1lja, ha nem akarja hozz\u00e1adni az \u00f6sszes rendelkez\u00e9sre \u00e1ll\u00f3 cast eszk\u00f6zt.\nCEC figyelmen k\u00edv\u00fcl hagy\u00e1sa - vessz\u0151vel elv\u00e1lasztott Chromecast-lista, amelynek figyelmen k\u00edv\u00fcl kell hagynia a CEC-adatokat az akt\u00edv bemenet meghat\u00e1roz\u00e1s\u00e1hoz. Ezt tov\u00e1bb\u00edtjuk a pychromecast.IGNORE_CEC c\u00edmre.", "title": "Speci\u00e1lis Google Cast-konfigur\u00e1ci\u00f3" }, "basic_options": { diff --git a/homeassistant/components/cast/translations/id.json b/homeassistant/components/cast/translations/id.json index b2c8d515548..b0a54f52897 100644 --- a/homeassistant/components/cast/translations/id.json +++ b/homeassistant/components/cast/translations/id.json @@ -9,10 +9,10 @@ "step": { "config": { "data": { - "known_hosts": "Daftar opsional host yang diketahui jika penemuan mDNS tidak berfungsi." + "known_hosts": "Host yang dikenal" }, - "description": "Masukkan konfigurasi Google Cast.", - "title": "Google Cast" + "description": "Host yang Dikenal - Daftar nama host atau alamat IP perangkat cast, dipisahkan dengan tanda koma, gunakan jika penemuan mDNS tidak berfungsi.", + "title": "Konfigurasi Google Cast" }, "confirm": { "description": "Ingin memulai penyiapan?" diff --git a/homeassistant/components/cast/translations/nl.json b/homeassistant/components/cast/translations/nl.json index fec645993b9..26dc954ef13 100644 --- a/homeassistant/components/cast/translations/nl.json +++ b/homeassistant/components/cast/translations/nl.json @@ -15,7 +15,7 @@ "title": "Google Cast configuratie" }, "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } }, diff --git a/homeassistant/components/cert_expiry/translations/hu.json b/homeassistant/components/cert_expiry/translations/hu.json index de459c324df..26f31465115 100644 --- a/homeassistant/components/cert_expiry/translations/hu.json +++ b/homeassistant/components/cert_expiry/translations/hu.json @@ -6,13 +6,13 @@ }, "error": { "connection_refused": "A kapcsolat megtagadva a gazdag\u00e9phez val\u00f3 csatlakoz\u00e1skor", - "connection_timeout": "T\u00fall\u00e9p\u00e9s, amikor ehhez a gazdag\u00e9phez kapcsol\u00f3dik", - "resolve_failed": "Ez a gazdag\u00e9p nem oldhat\u00f3 fel" + "connection_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s, ehhez a c\u00edmhez kapcsol\u00f3d\u00e1skor", + "resolve_failed": "Ez a c\u00edm nem oldhat\u00f3 fel" }, "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "A tan\u00fas\u00edtv\u00e1ny neve", "port": "Port" }, diff --git a/homeassistant/components/climacell/translations/hu.json b/homeassistant/components/climacell/translations/hu.json index 909a5cdf1b5..3454a489455 100644 --- a/homeassistant/components/climacell/translations/hu.json +++ b/homeassistant/components/climacell/translations/hu.json @@ -15,7 +15,7 @@ "longitude": "Hossz\u00fas\u00e1g", "name": "N\u00e9v" }, - "description": "Ha a Sz\u00e9less\u00e9g \u00e9s Hossz\u00fas\u00e1g nincs megadva, akkor a Home Assistant konfigur\u00e1ci\u00f3j\u00e1ban l\u00e9v\u0151 alap\u00e9rtelmezett \u00e9rt\u00e9keket fogjuk haszn\u00e1lni. Minden el\u0151rejelz\u00e9si t\u00edpushoz l\u00e9trej\u00f6n egy entit\u00e1s, de alap\u00e9rtelmez\u00e9s szerint csak az \u00e1ltalad kiv\u00e1lasztottak lesznek enged\u00e9lyezve." + "description": "Ha a Sz\u00e9less\u00e9g \u00e9s Hossz\u00fas\u00e1g nincs megadva, akkor a Home Assistant konfigur\u00e1ci\u00f3j\u00e1ban l\u00e9v\u0151 alap\u00e9rtelmezett \u00e9rt\u00e9keket fogjuk haszn\u00e1lni. Minden el\u0151rejelz\u00e9si t\u00edpushoz l\u00e9trej\u00f6n egy entit\u00e1s, de alap\u00e9rtelmez\u00e9s szerint csak az \u00d6n \u00e1ltal kiv\u00e1lasztottak lesznek enged\u00e9lyezve." } } }, diff --git a/homeassistant/components/cloudflare/translations/he.json b/homeassistant/components/cloudflare/translations/he.json index fb0a20a223b..1f53e94240c 100644 --- a/homeassistant/components/cloudflare/translations/he.json +++ b/homeassistant/components/cloudflare/translations/he.json @@ -29,7 +29,7 @@ }, "zone": { "data": { - "zone": "\u05d0\u05b5\u05d6\u05d5\u05b9\u05e8" + "zone": "\u05d0\u05d6\u05d5\u05e8" } } } diff --git a/homeassistant/components/cloudflare/translations/id.json b/homeassistant/components/cloudflare/translations/id.json index c7878017de3..73f0455273c 100644 --- a/homeassistant/components/cloudflare/translations/id.json +++ b/homeassistant/components/cloudflare/translations/id.json @@ -10,7 +10,7 @@ "invalid_auth": "Autentikasi tidak valid", "invalid_zone": "Zona tidak valid" }, - "flow_title": "Cloudflare: {name}", + "flow_title": "{name}", "step": { "reauth_confirm": { "data": { diff --git a/homeassistant/components/co2signal/translations/es.json b/homeassistant/components/co2signal/translations/es.json index 61f21c21ca3..921dd22a76a 100644 --- a/homeassistant/components/co2signal/translations/es.json +++ b/homeassistant/components/co2signal/translations/es.json @@ -1,10 +1,13 @@ { "config": { "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", "api_ratelimit": "Se ha superado el l\u00edmite de velocidad de la API", "unknown": "Error inesperado" }, "error": { + "api_ratelimit": "Excedida tasa l\u00edmite del API", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "unknown": "Error inesperado" }, "step": { @@ -21,6 +24,7 @@ }, "user": { "data": { + "api_key": "Token de acceso", "location": "Obtener datos para" }, "description": "Visite https://co2signal.com/ para solicitar un token." diff --git a/homeassistant/components/co2signal/translations/hu.json b/homeassistant/components/co2signal/translations/hu.json index 00bc19e7b49..77dcbddb8f8 100644 --- a/homeassistant/components/co2signal/translations/hu.json +++ b/homeassistant/components/co2signal/translations/hu.json @@ -2,11 +2,11 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "api_ratelimit": "API D\u00edjkorl\u00e1t t\u00fall\u00e9pve", + "api_ratelimit": "API maxim\u00e1lis lek\u00e9r\u00e9ssz\u00e1m t\u00fall\u00e9pve", "unknown": "V\u00e1ratlan hiba" }, "error": { - "api_ratelimit": "API D\u00edjkorl\u00e1t t\u00fall\u00e9pve", + "api_ratelimit": "API maxim\u00e1lis lek\u00e9r\u00e9ssz\u00e1m t\u00fall\u00e9pve", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", "unknown": "V\u00e1ratlan hiba" }, diff --git a/homeassistant/components/co2signal/translations/id.json b/homeassistant/components/co2signal/translations/id.json new file mode 100644 index 00000000000..76e72a93fd5 --- /dev/null +++ b/homeassistant/components/co2signal/translations/id.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "error": { + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Lintang", + "longitude": "Bujur" + } + }, + "country": { + "data": { + "country_code": "Kode Negara" + } + }, + "user": { + "data": { + "api_key": "Token Akses" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/coolmaster/translations/hu.json b/homeassistant/components/coolmaster/translations/hu.json index d52dba6b4b4..5f6f2eb2824 100644 --- a/homeassistant/components/coolmaster/translations/hu.json +++ b/homeassistant/components/coolmaster/translations/hu.json @@ -12,7 +12,7 @@ "fan_only": "T\u00e1mogaott csak ventil\u00e1tor m\u00f3d(ok)", "heat": "T\u00e1mogatott f\u0171t\u00e9si m\u00f3d(ok)", "heat_cool": "T\u00e1mogatott f\u0171t\u00e9si/h\u0171t\u00e9si m\u00f3d(ok)", - "host": "Hoszt", + "host": "C\u00edm", "off": "Ki lehet kapcsolni" }, "title": "\u00c1ll\u00edtsa be a CoolMasterNet kapcsolat r\u00e9szleteit." diff --git a/homeassistant/components/coronavirus/translations/id.json b/homeassistant/components/coronavirus/translations/id.json index e2626d16abb..f6bef10f8c0 100644 --- a/homeassistant/components/coronavirus/translations/id.json +++ b/homeassistant/components/coronavirus/translations/id.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Layanan sudah dikonfigurasi" + "already_configured": "Layanan sudah dikonfigurasi", + "cannot_connect": "Gagal terhubung" }, "step": { "user": { diff --git a/homeassistant/components/crownstone/translations/ca.json b/homeassistant/components/crownstone/translations/ca.json new file mode 100644 index 00000000000..9de845d87c6 --- /dev/null +++ b/homeassistant/components/crownstone/translations/ca.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "El compte ja est\u00e0 configurat", + "usb_setup_complete": "S'ha completat la configuraci\u00f3 USB de Crownstone.", + "usb_setup_unsuccessful": "La configuraci\u00f3 USB de Crownstone ha fallat." + }, + "error": { + "account_not_verified": "Compte no verificat. Activa el teu compte mitjan\u00e7ant el correu d'activaci\u00f3 de Crownstone.", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "Ruta del dispositiu USB" + }, + "description": "Selecciona el port s\u00e8rie de l'adaptador USB Crownstone o selecciona 'No utilitzar USB' si no vols configurar l'adaptador USB.\n\nBusca un dispositiu amb VID 10C4 i PID EA60.", + "title": "Configuraci\u00f3 de l'adaptador USB Crownstone" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Ruta del dispositiu USB" + }, + "description": "Introdueix manualment la ruta de l'adaptador USB Crownstone.", + "title": "Ruta manual de l'adaptador USB Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Esfera Crownstone" + }, + "description": "Selecciona la esfera Crownstone on es troba l'USB.", + "title": "Esfera Crownstone USB" + }, + "user": { + "data": { + "email": "Correu electr\u00f2nic", + "password": "Contrasenya" + }, + "title": "Compte de Crownstone" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Esfera Crownstone on es troba l'USB.", + "use_usb_option": "Utilitza un adaptador USB Crownstone per a la transmissi\u00f3 de dades locals" + } + }, + "usb_config": { + "data": { + "usb_path": "Ruta del dispositiu USB" + }, + "description": "Selecciona el port s\u00e8rie de l'adaptador USB Crownstone.\n\nBusca un dispositiu amb VID 10C4 i PID EA60.", + "title": "Configuraci\u00f3 de l'adaptador USB Crownstone" + }, + "usb_config_option": { + "data": { + "usb_path": "Ruta del dispositiu USB" + }, + "description": "Selecciona el port s\u00e8rie de l'adaptador USB Crownstone.\n\nBusca un dispositiu amb VID 10C4 i PID EA60.", + "title": "Configuraci\u00f3 de l'adaptador USB Crownstone" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Ruta del dispositiu USB" + }, + "description": "Introdueix manualment la ruta de l'adaptador USB Crownstone.", + "title": "Ruta manual de l'adaptador USB Crownstone" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "Ruta del dispositiu USB" + }, + "description": "Introdueix manualment la ruta de l'adaptador USB Crownstone.", + "title": "Ruta manual de l'adaptador USB Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Esfera Crownstone" + }, + "description": "Selecciona la esfera Crownstone on es troba l'USB.", + "title": "Esfera Crownstone USB" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Esfera Crownstone" + }, + "description": "Selecciona la esfera Crownstone on es troba l'USB.", + "title": "Esfera Crownstone USB" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/cs.json b/homeassistant/components/crownstone/translations/cs.json new file mode 100644 index 00000000000..a7aaa1746f9 --- /dev/null +++ b/homeassistant/components/crownstone/translations/cs.json @@ -0,0 +1,31 @@ +{ + "config": { + "step": { + "usb_manual_config": { + "data": { + "usb_manual_path": "Cesta k USB za\u0159\u00edzen\u00ed" + } + }, + "user": { + "data": { + "email": "E-mail", + "password": "Heslo" + } + } + } + }, + "options": { + "step": { + "usb_config_option": { + "data": { + "usb_path": "Cesta k USB za\u0159\u00edzen\u00ed" + } + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "Cesta k USB za\u0159\u00edzen\u00ed" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/de.json b/homeassistant/components/crownstone/translations/de.json new file mode 100644 index 00000000000..a969d9b2999 --- /dev/null +++ b/homeassistant/components/crownstone/translations/de.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "Konto wurde bereits konfiguriert", + "usb_setup_complete": "Crownstone USB-Einrichtung abgeschlossen.", + "usb_setup_unsuccessful": "Crownstone USB-Einrichtung war nicht erfolgreich." + }, + "error": { + "account_not_verified": "Konto nicht verifiziert. Bitte aktiviere dein Konto \u00fcber die Aktivierungs-E-Mail von Crownstone.", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "USB-Ger\u00e4te-Pfad" + }, + "description": "W\u00e4hle den seriellen Anschluss des Crownstone-USB-Dongles aus, oder w\u00e4hle \"Don't use USB\", wenn du keinen USB-Dongle einrichten m\u00f6chtest.\n\nSuche nach einem Ger\u00e4t mit VID 10C4 und PID EA60.", + "title": "Crownstone USB-Dongle-Konfiguration" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB-Ger\u00e4te-Pfad" + }, + "description": "Gib den Pfad eines Crownstone USB-Dongles manuell ein.", + "title": "Crownstone USB-Dongle manueller Pfad" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "W\u00e4hle eine Crownstone Sphere aus, in der sich der USB-Stick befindet.", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "E-Mail", + "password": "Passwort" + }, + "title": "Crownstone-Konto" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Crownstone Sphere, wo sich der USB befindet", + "use_usb_option": "Verwende einen Crownstone USB-Dongle f\u00fcr die lokale Daten\u00fcbertragung" + } + }, + "usb_config": { + "data": { + "usb_path": "USB-Ger\u00e4te-Pfad" + }, + "description": "W\u00e4hle den seriellen Anschluss des Crownstone-USB-Dongles.\n\nSuche nach einem Ger\u00e4t mit VID 10C4 und PID EA60.", + "title": "Crownstone USB-Dongle-Konfiguration" + }, + "usb_config_option": { + "data": { + "usb_path": "USB-Ger\u00e4te-Pfad" + }, + "description": "W\u00e4hle den seriellen Anschluss des Crownstone-USB-Dongles.\n\nSuche nach einem Ger\u00e4t mit VID 10C4 und PID EA60.", + "title": "Crownstone USB-Dongle-Konfiguration" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB-Ger\u00e4te-Pfad" + }, + "description": "Gib den Pfad eines Crownstone USB-Dongles manuell ein.", + "title": "Crownstone USB-Dongle manueller Pfad" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB-Ger\u00e4te-Pfad" + }, + "description": "Gib den Pfad eines Crownstone USB-Dongles manuell ein.", + "title": "Crownstone USB-Dongle manueller Pfad" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "W\u00e4hle eine Crownstone Sphere aus, in der sich der USB-Stick befindet.", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "W\u00e4hle eine Crownstone Sphere aus, in der sich der USB-Stick befindet.", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/en.json b/homeassistant/components/crownstone/translations/en.json index 09a26b9739c..d6070c90a0f 100644 --- a/homeassistant/components/crownstone/translations/en.json +++ b/homeassistant/components/crownstone/translations/en.json @@ -56,6 +56,13 @@ "description": "Select the serial port of the Crownstone USB dongle.\n\nLook for a device with VID 10C4 and PID EA60.", "title": "Crownstone USB dongle configuration" }, + "usb_config_option": { + "data": { + "usb_path": "USB Device Path" + }, + "description": "Select the serial port of the Crownstone USB dongle.\n\nLook for a device with VID 10C4 and PID EA60.", + "title": "Crownstone USB dongle configuration" + }, "usb_manual_config": { "data": { "usb_manual_path": "USB Device Path" @@ -63,12 +70,26 @@ "description": "Manually enter the path of a Crownstone USB dongle.", "title": "Crownstone USB dongle manual path" }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB Device Path" + }, + "description": "Manually enter the path of a Crownstone USB dongle.", + "title": "Crownstone USB dongle manual path" + }, "usb_sphere_config": { "data": { "usb_sphere": "Crownstone Sphere" }, "description": "Select a Crownstone Sphere where the USB is located.", "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Select a Crownstone Sphere where the USB is located.", + "title": "Crownstone USB Sphere" } } } diff --git a/homeassistant/components/crownstone/translations/es.json b/homeassistant/components/crownstone/translations/es.json new file mode 100644 index 00000000000..f9038fb22b4 --- /dev/null +++ b/homeassistant/components/crownstone/translations/es.json @@ -0,0 +1,69 @@ +{ + "config": { + "abort": { + "already_configured": "La cuenta ya ha sido configurada" + }, + "error": { + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "Ruta del dispositivo USB" + } + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Ruta del dispositivo USB" + } + }, + "user": { + "data": { + "email": "Correo electr\u00f3nico", + "password": "Contrase\u00f1a" + } + } + } + }, + "options": { + "step": { + "usb_config": { + "data": { + "usb_path": "Ruta del dispositivo USB" + }, + "description": "Seleccione el puerto serie del dispositivo USB Crownstone.\n\nBusque un dispositivo con VID 10C4 y PID EA60.", + "title": "Configuraci\u00f3n del dispositivo USB Crownstone" + }, + "usb_config_option": { + "data": { + "usb_path": "Ruta del dispositivo USB" + } + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Ruta del dispositivo USB" + }, + "description": "Introduzca manualmente la ruta de un dispositivo USB Crownstone.", + "title": "Ruta manual del dispositivo USB Crownstone" + }, + "usb_manual_config_option": { + "title": "Ruta manual del dispositivo USB Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Esfera Crownstone" + }, + "description": "Selecciona una Esfera Crownstone donde se encuentra el USB.", + "title": "USB de Esfera Crownstone" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Esfera Crownstone" + }, + "description": "Selecciona una Esfera Crownstone donde se encuentra el USB.", + "title": "USB de Esfera Crownstone" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/et.json b/homeassistant/components/crownstone/translations/et.json new file mode 100644 index 00000000000..3a651257e1a --- /dev/null +++ b/homeassistant/components/crownstone/translations/et.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "Konto on juba h\u00e4\u00e4lestatud", + "usb_setup_complete": "Crownstone'i USB seadistamine on l\u00f5petatud.", + "usb_setup_unsuccessful": "Crownstone'i USB seadistamine nurjus." + }, + "error": { + "account_not_verified": "Konto pole kinnitatud. Aktiveeri oma konto Crownstone'i aktiveerimismeili kaudu.", + "invalid_auth": "Tuvastamine nurjus", + "unknown": "Ootamatu t\u00f5rge" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "USB seadme rada" + }, + "description": "Vali Crownstone'i USB seadme jadaport v\u00f5i vali '\u00c4ra kasuta USB-d' kui ei soovi USB seadet h\u00e4\u00e4lestada. \n\n Otsi seadet mille VID on 10C4 ja PID on EA60.", + "title": "Crownstone'i USB seadme s\u00e4tted" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB seadme rada" + }, + "description": "Sisesta k\u00e4sitsi Crownstone'i USBseadme rada.", + "title": "Crownstone'i USB seadme rada" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Vali Crownstone Sphere kus USB asub.", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "E-posti aadress", + "password": "Salas\u00f5na" + }, + "title": "Crownstone'i konto" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Crownstone Sphere kus USB asub.", + "use_usb_option": "Kasuta Crownstone'i USB seadet kohalikuks andmeedastuseks" + } + }, + "usb_config": { + "data": { + "usb_path": "USB seadme rada" + }, + "description": "Vali Crownstone'i USB seadme jadaport. \n\n Otsi seadet mille VID on 10C4 ja PID on EA60.", + "title": "Crownstone'i USB seadme s\u00e4tted" + }, + "usb_config_option": { + "data": { + "usb_path": "USB seadme rada" + }, + "description": "Vali Crownstone'i USB seadme jadaport. \n\n Otsi seadet mille VID on 10C4 ja PID on EA60.", + "title": "Crownstone'i USB seadme s\u00e4tted" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB seadme rada" + }, + "description": "Sisesta k\u00e4sitsi Crownstone'i USBseadme rada.", + "title": "Crownstone'i USB seadme rada" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB seadme rada" + }, + "description": "Sisesta k\u00e4sitsi Crownstone'i USBseadme rada.", + "title": "Crownstone'i USB seadme rada" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Vali Crownstone Sphere kus USB asub.", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Vali Crownstone Sphere kus USB asub.", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/he.json b/homeassistant/components/crownstone/translations/he.json new file mode 100644 index 00000000000..af11b65839b --- /dev/null +++ b/homeassistant/components/crownstone/translations/he.json @@ -0,0 +1,53 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "error": { + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "\u05e0\u05ea\u05d9\u05d1 \u05d4\u05ea\u05e7\u05df USB" + } + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "\u05e0\u05ea\u05d9\u05d1 \u05d4\u05ea\u05e7\u05df USB" + } + }, + "user": { + "data": { + "email": "\u05d3\u05d5\u05d0\"\u05dc", + "password": "\u05e1\u05d9\u05e1\u05de\u05d4" + } + } + } + }, + "options": { + "step": { + "usb_config": { + "data": { + "usb_path": "\u05e0\u05ea\u05d9\u05d1 \u05d4\u05ea\u05e7\u05df USB" + } + }, + "usb_config_option": { + "data": { + "usb_path": "\u05e0\u05ea\u05d9\u05d1 \u05d4\u05ea\u05e7\u05df USB" + } + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "\u05e0\u05ea\u05d9\u05d1 \u05d4\u05ea\u05e7\u05df USB" + } + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "\u05e0\u05ea\u05d9\u05d1 \u05d4\u05ea\u05e7\u05df USB" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/hu.json b/homeassistant/components/crownstone/translations/hu.json new file mode 100644 index 00000000000..2c2a2e34fe1 --- /dev/null +++ b/homeassistant/components/crownstone/translations/hu.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", + "usb_setup_complete": "A Crownstone USB be\u00e1ll\u00edt\u00e1sa befejez\u0151d\u00f6tt.", + "usb_setup_unsuccessful": "A Crownstone USB be\u00e1ll\u00edt\u00e1sa sikertelen volt." + }, + "error": { + "account_not_verified": "Nem ellen\u0151rz\u00f6tt fi\u00f3k. K\u00e9rj\u00fck, aktiv\u00e1lja fi\u00f3kj\u00e1t a Crownstone-t\u00f3l kapott aktiv\u00e1l\u00f3 e-mailben.", + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" + }, + "description": "V\u00e1lassza ki a Crownstone USB kulcs soros portj\u00e1t, vagy v\u00e1lassza 'Ne haszn\u00e1ljon USB-t' ha nem szerenke egy USB kulcsot be\u00e1ll\u00edtani most.\n\nKeressen egy VID 10C4 \u00e9s PID EA60 azonos\u00edt\u00f3val rendelkez\u0151 eszk\u00f6zt.", + "title": "Crownstone USB kulcs konfigur\u00e1ci\u00f3" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" + }, + "description": "Adja meg manu\u00e1lisan a Crownstone USB kulcs \u00fatvonal\u00e1t.", + "title": "A Crownstone USB kulcs manu\u00e1lis el\u00e9r\u00e9si \u00fatja" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "V\u00e1lasszon egy Crownstone Sphere-t, ahol az USB tal\u00e1lhat\u00f3.", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "E-mail", + "password": "Jelsz\u00f3" + }, + "title": "Crownstone fi\u00f3k" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Crownstone Sphere, ahol az USB kulcs tal\u00e1lhat\u00f3", + "use_usb_option": "Crownstone USB-kulcs haszn\u00e1lata a helyi adat\u00e1tvitelhez" + } + }, + "usb_config": { + "data": { + "usb_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" + }, + "description": "V\u00e1lassza ki a Crownstone USB kulcs soros portj\u00e1t.\n\nKeressen egy VID 10C4 \u00e9s PID EA60 azonos\u00edt\u00f3val rendelkez\u0151 eszk\u00f6zt.", + "title": "Crownstone USB kulcs konfigur\u00e1ci\u00f3" + }, + "usb_config_option": { + "data": { + "usb_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" + }, + "description": "V\u00e1lassza ki a Crownstone USB kulcs soros portj\u00e1t.\n\nKeressen egy VID 10C4 \u00e9s PID EA60 azonos\u00edt\u00f3val rendelkez\u0151 eszk\u00f6zt.", + "title": "Crownstone USB kulcs konfigur\u00e1ci\u00f3" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" + }, + "description": "Adja meg manu\u00e1lisan a Crownstone USB kulcs \u00fatvonal\u00e1t.", + "title": "A Crownstone USB kulcs manu\u00e1lis el\u00e9r\u00e9si \u00fatja" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" + }, + "description": "Adja meg manu\u00e1lisan a Crownstone USB kulcs \u00fatvonal\u00e1t.", + "title": "A Crownstone USB kulcs manu\u00e1lis el\u00e9r\u00e9si \u00fatja" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "V\u00e1lasszon egy Crownstone Sphere-t, ahol az USB tal\u00e1lhat\u00f3.", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "V\u00e1lasszon egy Crownstone Sphere-t, ahol az USB tal\u00e1lhat\u00f3.", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/id.json b/homeassistant/components/crownstone/translations/id.json new file mode 100644 index 00000000000..5bd28168d9a --- /dev/null +++ b/homeassistant/components/crownstone/translations/id.json @@ -0,0 +1,38 @@ +{ + "config": { + "abort": { + "already_configured": "Akun sudah dikonfigurasi" + }, + "error": { + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "Jalur Perangkat USB" + } + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Jalur Perangkat USB" + } + }, + "user": { + "data": { + "email": "Email", + "password": "Kata Sandi" + } + } + } + }, + "options": { + "step": { + "usb_manual_config_option": { + "data": { + "usb_manual_path": "Jalur Perangkat USB" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/it.json b/homeassistant/components/crownstone/translations/it.json new file mode 100644 index 00000000000..1fb43e75684 --- /dev/null +++ b/homeassistant/components/crownstone/translations/it.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "L'account \u00e8 gi\u00e0 configurato", + "usb_setup_complete": "Configurazione USB Crownstone completata.", + "usb_setup_unsuccessful": "La configurazione USB di Crownstone non ha avuto successo." + }, + "error": { + "account_not_verified": "Account non verificato. Attiva il tuo account tramite l'e-mail di attivazione di Crownstone.", + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "Percorso del dispositivo USB" + }, + "description": "Seleziona la porta seriale della chiavetta USB Crownstone. \n\nCerca un dispositivo con VID 10C4 e PID EA60.", + "title": "Configurazione della chiavetta USB Crownstone" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Percorso del dispositivo USB" + }, + "description": "Immettere manualmente il percorso di una chiavetta USB Crownstone.", + "title": "Percorso manuale della chiavetta USB Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Sfera Crownstone" + }, + "description": "Seleziona una sfera di Crownstone dove si trova l'USB.", + "title": "Sfera USB Crownstone" + }, + "user": { + "data": { + "email": "E-mail", + "password": "Password" + }, + "title": "Account Crownstone" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Sfera di Crownstone dove si trova l'USB", + "use_usb_option": "Utilizzare una chiavetta USB Crownstone per la trasmissione locale dei dati" + } + }, + "usb_config": { + "data": { + "usb_path": "Percorso del dispositivo USB" + }, + "description": "Seleziona la porta seriale della chiavetta USB Crownstone. \n\nCerca un dispositivo con VID 10C4 e PID EA60.", + "title": "Configurazione della chiavetta USB Crownstone" + }, + "usb_config_option": { + "data": { + "usb_path": "Percorso del dispositivo USB" + }, + "description": "Seleziona la porta seriale della chiavetta USB Crownstone. \n\nCerca un dispositivo con VID 10C4 e PID EA60.", + "title": "Configurazione della chiavetta USB Crownstone" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "Percorso del dispositivo USB" + }, + "description": "Immettere manualmente il percorso di una chiavetta USB Crownstone.", + "title": "Percorso manuale della chiavetta USB Crownstone" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "Percorso del dispositivo USB" + }, + "description": "Immettere manualmente il percorso di una chiavetta USB Crownstone.", + "title": "Percorso manuale della chiavetta USB Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Sfera Crownstone" + }, + "description": "Seleziona una sfera di Crownstone dove si trova l'USB.", + "title": "Sfera USB Crownstone" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Sfera Crownstone" + }, + "description": "Seleziona una sfera Crownstone in cui si trova l'USB.", + "title": "Sfera USB Crownstone" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/ko.json b/homeassistant/components/crownstone/translations/ko.json new file mode 100644 index 00000000000..aadd2d3da42 --- /dev/null +++ b/homeassistant/components/crownstone/translations/ko.json @@ -0,0 +1,16 @@ +{ + "options": { + "step": { + "usb_config_option": { + "data": { + "usb_path": "USB \uc7a5\uce58 \uacbd\ub85c" + } + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB \uc7a5\uce58 \uacbd\ub85c" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/nl.json b/homeassistant/components/crownstone/translations/nl.json new file mode 100644 index 00000000000..1da12c8f841 --- /dev/null +++ b/homeassistant/components/crownstone/translations/nl.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "Account is al geconfigureerd", + "usb_setup_complete": "Crownstone USB installatie voltooid.", + "usb_setup_unsuccessful": "Crownstone USB installatie is mislukt." + }, + "error": { + "account_not_verified": "Account niet geverifieerd. Gelieve uw account te activeren via de activeringsmail van Crownstone.", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "USB-apparaatpad" + }, + "description": "Selecteer de seri\u00eble poort van de Crownstone USB dongle, of selecteer 'Don't use USB' als u geen USB dongle wilt instellen.\n\nZoek naar een apparaat met VID 10C4 en PID EA60.", + "title": "Crownstone USB dongle configuratie" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB-apparaatpad" + }, + "description": "Voer handmatig het pad van een Crownstone USB dongle in.", + "title": "Crownstone USB-dongle handmatig pad" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Selecteer een Crownstone Sphere waar de USB zich bevindt.", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "E-mail", + "password": "Wachtwoord" + }, + "title": "Crownstone account" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Crownstone Sphere waar de USB zich bevindt", + "use_usb_option": "Gebruik een Crownstone USB-dongle voor lokale gegevensoverdracht" + } + }, + "usb_config": { + "data": { + "usb_path": "USB-apparaatpad" + }, + "description": "Selecteer de seri\u00eble poort van de Crownstone USB dongle.\n\nZoek naar een apparaat met VID 10C4 en PID EA60.", + "title": "Crownstone USB dongle configuratie" + }, + "usb_config_option": { + "data": { + "usb_path": "USB-apparaatpad" + }, + "description": "Selecteer de seri\u00eble poort van de Crownstone USB dongle.\n\nZoek naar een apparaat met VID 10C4 en PID EA60.", + "title": "Crownstone USB dongle configuratie" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB-apparaatpad" + }, + "description": "Voer handmatig het pad van een Crownstone USB dongle in.", + "title": "Crownstone USB-dongle handmatig pad" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB-apparaatpad" + }, + "description": "Voer handmatig het pad van een Crownstone USB dongle in.", + "title": "Crownstone USB-dongle handmatig pad" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Selecteer een Crownstone Sphere waar de USB zich bevindt.", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Selecteer een Crownstone Sphere waar de USB zich bevindt.", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/no.json b/homeassistant/components/crownstone/translations/no.json new file mode 100644 index 00000000000..88f3578a9a4 --- /dev/null +++ b/homeassistant/components/crownstone/translations/no.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "Kontoen er allerede konfigurert", + "usb_setup_complete": "Crownstone USB -oppsett fullf\u00f8rt.", + "usb_setup_unsuccessful": "Crownstone USB -oppsett mislyktes." + }, + "error": { + "account_not_verified": "Kontoen er ikke bekreftet. Vennligst aktiver kontoen din via aktiverings -e -posten fra Crownstone.", + "invalid_auth": "Ugyldig godkjenning", + "unknown": "Uventet feil" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "USB enhetsbane" + }, + "description": "Velg den serielle porten p\u00e5 Crownstone USB -dongelen, eller velg 'Ikke bruk USB' hvis du ikke vil konfigurere en USB -dongle. \n\n Se etter en enhet med VID 10C4 og PID EA60.", + "title": "Crownstone USB -dongle -konfigurasjon" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB enhetsbane" + }, + "description": "Skriv inn banen til en Crownstone USB -dongle manuelt.", + "title": "Crownstone USB -dongle manuell bane" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone USB Sphere" + }, + "description": "Velg en Crownstone Sphere der USB -en er plassert.", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "E-post", + "password": "Passord" + }, + "title": "Crownstone -konto" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Velg en Crownstone Sphere der USB -en er plassert.", + "use_usb_option": "Bruk en Crownstone USB -dongle for lokal dataoverf\u00f8ring" + } + }, + "usb_config": { + "data": { + "usb_path": "USB enhetsbane" + }, + "description": "Velg serieporten til Crownstone USB -dongelen. \n\n Se etter en enhet med VID 10C4 og PID EA60.", + "title": "Crownstone USB -dongle -konfigurasjon" + }, + "usb_config_option": { + "data": { + "usb_path": "USB enhetsbane" + }, + "description": "Velg serieporten til Crownstone USB -dongelen. \n\n Se etter en enhet med VID 10C4 og PID EA60.", + "title": "Crownstone USB -dongle -konfigurasjon" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB enhetsbane" + }, + "description": "Skriv inn banen til en Crownstone USB -dongle manuelt.", + "title": "Crownstone USB -dongle manuell bane" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB enhetsbane" + }, + "description": "Skriv inn banen til en Crownstone USB -dongle manuelt.", + "title": "Crownstone USB -dongle manuell bane" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "Velg en Crownstone Sphere der USB -en er plassert.", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone USB Sphere" + }, + "description": "Velg en Crownstone Sphere der USB -en er plassert.", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/ru.json b/homeassistant/components/crownstone/translations/ru.json new file mode 100644 index 00000000000..7dfd88bd63e --- /dev/null +++ b/homeassistant/components/crownstone/translations/ru.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant.", + "usb_setup_complete": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Crownstone USB \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.", + "usb_setup_unsuccessful": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Crownstone USB \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c." + }, + "error": { + "account_not_verified": "\u0423\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430. \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0451 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0438\u0441\u044c\u043c\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435.", + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "usb_config": { + "data": { + "usb_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Crownstone \u0438\u043b\u0438 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 'Don't use USB', \u0435\u0441\u043b\u0438 \u0412\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \n\n\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 VID 10C4 \u0438 PID EA60.", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Crownstone" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Crownstone.", + "title": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Crownstone Sphere, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c" + }, + "title": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c Crownstone" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Crownstone Sphere, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "use_usb_option": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Crownstone \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445" + } + }, + "usb_config": { + "data": { + "usb_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Crownstone. \n\n\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 VID 10C4 \u0438 PID EA60.", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Crownstone" + }, + "usb_config_option": { + "data": { + "usb_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Crownstone. \n\n\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 VID 10C4 \u0438 PID EA60.", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Crownstone" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Crownstone.", + "title": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Crownstone" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Crownstone.", + "title": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Crownstone" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Crownstone Sphere, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Crownstone Sphere, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/crownstone/translations/zh-Hant.json b/homeassistant/components/crownstone/translations/zh-Hant.json new file mode 100644 index 00000000000..2c362ba0bcb --- /dev/null +++ b/homeassistant/components/crownstone/translations/zh-Hant.json @@ -0,0 +1,96 @@ +{ + "config": { + "abort": { + "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "usb_setup_complete": "Crownstone USB \u8a2d\u5b9a\u5b8c\u6210\u3002", + "usb_setup_unsuccessful": "Crownstone USB \u8a2d\u5b9a\u6210\u529f\u3002" + }, + "error": { + "account_not_verified": "\u5e33\u865f\u5c1a\u672a\u9a57\u8b49\u3001\u8acb\u900f\u904e\u4f86\u81ea Crownstone \u7684\u9a57\u8b49\u90f5\u4ef6\u555f\u52d5\u60a8\u7684\u5e33\u865f\u3002", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "usb_config": { + "data": { + "usb_path": "USB \u88dd\u7f6e\u8def\u5f91" + }, + "description": "\u9078\u64c7 Crownstone USB \u88dd\u7f6e\u5e8f\u5217\u57e0\uff0c\u6216\u5047\u5982\u60a8\u4e0d\u60f3\u8a2d\u5b9a USB \u88dd\u7f6e\u7684\u8a71\u3001\u8acb\u9078\u64c7 '\u4e0d\u4f7f\u7528 USB'\u3002\n\n\u8acb\u641c\u5c0b VID 10C4 \u53ca PID EA60 \u88dd\u7f6e\u3002", + "title": "Crownstone USB \u88dd\u7f6e\u8a2d\u5b9a" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB \u88dd\u7f6e\u8def\u5f91" + }, + "description": "\u624b\u52d5\u8f38\u5165 Crownstone USB \u88dd\u7f6e\u8def\u5f91\u3002", + "title": "Crownstone USB \u88dd\u7f6e\u624b\u52d5\u8def\u5f91" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "\u9078\u64c7 Crownstone Sphere \u6240\u5728 USB \u8def\u5f91\u3002", + "title": "Crownstone USB Sphere" + }, + "user": { + "data": { + "email": "\u96fb\u5b50\u90f5\u4ef6", + "password": "\u5bc6\u78bc" + }, + "title": "Crownstone \u5e33\u865f" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "usb_sphere_option": "Crownstone Sphere \u6240\u5728 USB \u8def\u5f91", + "use_usb_option": "\u4f7f\u7528 Crownstone USB \u88dd\u7f6e\u9032\u884c\u672c\u5730\u7aef\u8cc7\u6599\u50b3\u8f38" + } + }, + "usb_config": { + "data": { + "usb_path": "USB \u88dd\u7f6e\u8def\u5f91" + }, + "description": "\u9078\u64c7 Crownstone USB \u88dd\u7f6e\u5e8f\u5217\u57e0\u3002\n\n\u8acb\u641c\u5c0b VID 10C4 \u53ca PID EA60 \u88dd\u7f6e\u3002", + "title": "Crownstone USB \u88dd\u7f6e\u8a2d\u5b9a" + }, + "usb_config_option": { + "data": { + "usb_path": "USB \u88dd\u7f6e\u8def\u5f91" + }, + "description": "\u9078\u64c7 Crownstone USB \u88dd\u7f6e\u5e8f\u5217\u57e0\u3002\n\n\u8acb\u641c\u5c0b VID 10C4 \u53ca PID EA60 \u88dd\u7f6e\u3002", + "title": "Crownstone USB \u88dd\u7f6e\u8a2d\u5b9a" + }, + "usb_manual_config": { + "data": { + "usb_manual_path": "USB \u88dd\u7f6e\u8def\u5f91" + }, + "description": "\u624b\u52d5\u8f38\u5165 Crownstone USB \u88dd\u7f6e\u8def\u5f91\u3002", + "title": "Crownstone USB \u88dd\u7f6e\u624b\u52d5\u8def\u5f91" + }, + "usb_manual_config_option": { + "data": { + "usb_manual_path": "USB \u88dd\u7f6e\u8def\u5f91" + }, + "description": "\u624b\u52d5\u8f38\u5165 Crownstone USB \u88dd\u7f6e\u8def\u5f91\u3002", + "title": "Crownstone USB \u88dd\u7f6e\u624b\u52d5\u8def\u5f91" + }, + "usb_sphere_config": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "\u9078\u64c7 Crownstone Sphere \u6240\u5728 USB \u8def\u5f91\u3002", + "title": "Crownstone USB Sphere" + }, + "usb_sphere_config_option": { + "data": { + "usb_sphere": "Crownstone Sphere" + }, + "description": "\u9078\u64c7 Crownstone Sphere \u6240\u5728 USB \u8def\u5f91\u3002", + "title": "Crownstone USB Sphere" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/daikin/translations/hu.json b/homeassistant/components/daikin/translations/hu.json index f1cb7eab8f6..6049890cb53 100644 --- a/homeassistant/components/daikin/translations/hu.json +++ b/homeassistant/components/daikin/translations/hu.json @@ -13,10 +13,10 @@ "user": { "data": { "api_key": "API kulcs", - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3" }, - "description": "Add meg a Daikin l\u00e9gkond\u00edcion\u00e1l\u00f3 IP-c\u00edm\u00e9t.", + "description": "Adja meg Daikin k\u00e9sz\u00fcl\u00e9k\u00e9nek az IP c\u00edm\u00e9t.\n\nNe feledje, hogy z API kulcs \u00e9s a Jelsz\u00f3 funkci\u00f3t csak a BRP072Cxx \u00e9s a SKYFi eszk\u00f6z\u00f6k haszn\u00e1lj\u00e1k.", "title": "A Daikin l\u00e9gkond\u00edcion\u00e1l\u00f3 konfigur\u00e1l\u00e1sa" } } diff --git a/homeassistant/components/deconz/translations/es.json b/homeassistant/components/deconz/translations/es.json index 3670caf18d0..5608b95288d 100644 --- a/homeassistant/components/deconz/translations/es.json +++ b/homeassistant/components/deconz/translations/es.json @@ -81,7 +81,7 @@ "remote_flip_180_degrees": "Dispositivo volteado 180 grados", "remote_flip_90_degrees": "Dispositivo volteado 90 grados", "remote_gyro_activated": "Dispositivo sacudido", - "remote_moved": "Dispositivo movido con \"{subtipo}\" hacia arriba", + "remote_moved": "Dispositivo movido con \"{subtype}\" hacia arriba", "remote_moved_any_side": "Dispositivo movido con cualquier lado hacia arriba", "remote_rotate_from_side_1": "Dispositivo girado del \"lado 1\" al \" {subtype} \"", "remote_rotate_from_side_2": "Dispositivo girado del \"lado 2\" al \" {subtype} \"", diff --git a/homeassistant/components/deconz/translations/hu.json b/homeassistant/components/deconz/translations/hu.json index bc003a279e8..664f3768a22 100644 --- a/homeassistant/components/deconz/translations/hu.json +++ b/homeassistant/components/deconz/translations/hu.json @@ -2,8 +2,8 @@ "config": { "abort": { "already_configured": "A bridge m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", - "no_bridges": "Nem tal\u00e1ltam deCONZ bridget", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", + "no_bridges": "Nem tal\u00e1lhat\u00f3 deCONZ \u00e1tj\u00e1r\u00f3", "no_hardware_available": "Nincs deCONZ-hoz csatlakoztatott r\u00e1di\u00f3hardver", "not_deconz_bridge": "Nem egy deCONZ \u00e1tj\u00e1r\u00f3", "updated_instance": "A deCONZ-p\u00e9ld\u00e1ny \u00faj \u00e1llom\u00e1sc\u00edmmel friss\u00edtve" @@ -11,19 +11,19 @@ "error": { "no_key": "API kulcs lek\u00e9r\u00e9se nem siker\u00fclt" }, - "flow_title": "deCONZ Zigbee \u00e1tj\u00e1r\u00f3 ({host})", + "flow_title": "{host}", "step": { "hassio_confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Home Assistant-ot, hogy csatlakozzon a (z) {addon} \u00e1ltal biztos\u00edtott deCONZ \u00e1tj\u00e1r\u00f3hoz?", - "title": "deCONZ Zigbee \u00e1tj\u00e1r\u00f3 a Supervisor kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot, hogy csatlakozzon {addon} \u00e1ltal biztos\u00edtott deCONZ \u00e1tj\u00e1r\u00f3hoz?", + "title": "deCONZ Zigbee \u00e1tj\u00e1r\u00f3 Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal" }, "link": { - "description": "Oldja fel a deCONZ \u00e1tj\u00e1r\u00f3t a Home Assistant-ban val\u00f3 regisztr\u00e1l\u00e1shoz.\n\n1. Menjen a deCONZ rendszer be\u00e1ll\u00edt\u00e1sokhoz\n2. Nyomja meg az \"\u00c1tj\u00e1r\u00f3 felold\u00e1sa\" gombot", + "description": "Enged\u00e9lyezze fel a deCONZ \u00e1tj\u00e1r\u00f3ban a Home Assistant-hoz val\u00f3 regisztr\u00e1l\u00e1st.\n\n1. V\u00e1lassza ki a deCONZ rendszer be\u00e1ll\u00edt\u00e1sait\n2. Nyomja meg az \"Authenticate app\" gombot", "title": "Kapcsol\u00f3d\u00e1s a deCONZ-hoz" }, "manual_input": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" } }, @@ -71,7 +71,7 @@ "remote_button_quintuple_press": "\"{subtype}\" gombra \u00f6tsz\u00f6r kattintottak", "remote_button_rotated": "A gomb elforgatva: \"{subtype}\"", "remote_button_rotated_fast": "A gomb gyorsan elfordult: \"{subtype}\"", - "remote_button_rotation_stopped": "A (z) \"{subtype}\" gomb forg\u00e1sa le\u00e1llt", + "remote_button_rotation_stopped": "A(z) \"{subtype}\" gomb forg\u00e1sa le\u00e1llt", "remote_button_short_press": "\"{subtype}\" gomb lenyomva", "remote_button_short_release": "\"{subtype}\" gomb elengedve", "remote_button_triple_press": "\"{subtype}\" gombra h\u00e1romszor kattintottak", diff --git a/homeassistant/components/deconz/translations/id.json b/homeassistant/components/deconz/translations/id.json index c6d54beaec2..f63261e6e87 100644 --- a/homeassistant/components/deconz/translations/id.json +++ b/homeassistant/components/deconz/translations/id.json @@ -11,11 +11,11 @@ "error": { "no_key": "Tidak bisa mendapatkan kunci API" }, - "flow_title": "Gateway Zigbee deCONZ ({host})", + "flow_title": "{host}", "step": { "hassio_confirm": { - "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke gateway deCONZ yang disediakan oleh add-on Supervisor {addon}?", - "title": "Gateway Zigbee deCONZ melalui add-on Supervisor" + "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke gateway deCONZ yang disediakan oleh add-on: {addon}?", + "title": "Gateway Zigbee deCONZ melalui add-on Home Assistant" }, "link": { "description": "Buka gateway deCONZ Anda untuk mendaftarkan ke Home Assistant. \n\n1. Buka pengaturan sistem deCONZ \n2. Tekan tombol \"Authenticate app\"", diff --git a/homeassistant/components/demo/translations/he.json b/homeassistant/components/demo/translations/he.json new file mode 100644 index 00000000000..c3162b87a5e --- /dev/null +++ b/homeassistant/components/demo/translations/he.json @@ -0,0 +1,3 @@ +{ + "title": "\u05d4\u05d3\u05d2\u05de\u05d4" +} \ No newline at end of file diff --git a/homeassistant/components/demo/translations/hu.json b/homeassistant/components/demo/translations/hu.json index 3bfe095189a..e77c21294b8 100644 --- a/homeassistant/components/demo/translations/hu.json +++ b/homeassistant/components/demo/translations/hu.json @@ -17,7 +17,7 @@ "options_2": { "data": { "multi": "T\u00f6bbsz\u00f6r\u00f6s kijel\u00f6l\u00e9s", - "select": "V\u00e1lassz egy lehet\u0151s\u00e9get", + "select": "V\u00e1lasszon egy lehet\u0151s\u00e9get", "string": "Karakterl\u00e1nc \u00e9rt\u00e9k" } } diff --git a/homeassistant/components/demo/translations/ro.json b/homeassistant/components/demo/translations/ro.json new file mode 100644 index 00000000000..96e182c6d54 --- /dev/null +++ b/homeassistant/components/demo/translations/ro.json @@ -0,0 +1,13 @@ +{ + "options": { + "step": { + "init": { + "data": { + "few": "Cateva", + "one": "Unu", + "other": "Altele" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/denonavr/translations/hu.json b/homeassistant/components/denonavr/translations/hu.json index 43ee362d65a..c22d392dc8a 100644 --- a/homeassistant/components/denonavr/translations/hu.json +++ b/homeassistant/components/denonavr/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Nem siker\u00fclt csatlakozni, k\u00e9rj\u00fck, pr\u00f3b\u00e1lja \u00fajra. A h\u00e1l\u00f3zati \u00e9s Ethernet k\u00e1belek kih\u00faz\u00e1sa \u00e9s \u00fajracsatlakoztat\u00e1sa seg\u00edthet", "not_denonavr_manufacturer": "Nem egy Denon AVR h\u00e1l\u00f3zati vev\u0151, felfedezett gy\u00e1rt\u00f3 nem egyezik", "not_denonavr_missing": "Nem Denon AVR h\u00e1l\u00f3zati vev\u0151, a felfedez\u00e9si inform\u00e1ci\u00f3k nem teljesek" diff --git a/homeassistant/components/denonavr/translations/id.json b/homeassistant/components/denonavr/translations/id.json index d78f547ef35..0bafe289842 100644 --- a/homeassistant/components/denonavr/translations/id.json +++ b/homeassistant/components/denonavr/translations/id.json @@ -10,7 +10,7 @@ "error": { "discovery_error": "Gagal menemukan Network Receiver AVR Denon" }, - "flow_title": "Network Receiver Denon AVR: {name}", + "flow_title": "{name}", "step": { "confirm": { "description": "Konfirmasikan penambahan Receiver", diff --git a/homeassistant/components/devolo_home_control/translations/ca.json b/homeassistant/components/devolo_home_control/translations/ca.json index 968624e15c8..73417c5c564 100644 --- a/homeassistant/components/devolo_home_control/translations/ca.json +++ b/homeassistant/components/devolo_home_control/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/devolo_home_control/translations/id.json b/homeassistant/components/devolo_home_control/translations/id.json index 31f0f87dc00..41d2100b6ed 100644 --- a/homeassistant/components/devolo_home_control/translations/id.json +++ b/homeassistant/components/devolo_home_control/translations/id.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Akun sudah dikonfigurasi" + "already_configured": "Akun sudah dikonfigurasi", + "reauth_successful": "Autentikasi ulang berhasil" }, "error": { "invalid_auth": "Autentikasi tidak valid" @@ -13,6 +14,13 @@ "password": "Kata Sandi", "username": "Email/ID devolo" } + }, + "zeroconf_confirm": { + "data": { + "mydevolo_url": "URL mydevolo", + "password": "Kata Sandi", + "username": "Email/devolo ID" + } } } } diff --git a/homeassistant/components/devolo_home_control/translations/ko.json b/homeassistant/components/devolo_home_control/translations/ko.json index 9c9a21182cc..f3832dec7c1 100644 --- a/homeassistant/components/devolo_home_control/translations/ko.json +++ b/homeassistant/components/devolo_home_control/translations/ko.json @@ -13,6 +13,13 @@ "password": "\ube44\ubc00\ubc88\ud638", "username": "\uc774\uba54\uc77c / devolo ID" } + }, + "zeroconf_confirm": { + "data": { + "mydevolo_url": "mydevolo URL \uc8fc\uc18c", + "password": "\ube44\ubc00\ubc88\ud638", + "username": "\uc774\uba54\uc77c / devolo ID" + } } } } diff --git a/homeassistant/components/dexcom/translations/ca.json b/homeassistant/components/dexcom/translations/ca.json index e188718a71d..7b97a209e49 100644 --- a/homeassistant/components/dexcom/translations/ca.json +++ b/homeassistant/components/dexcom/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3", diff --git a/homeassistant/components/dialogflow/translations/hu.json b/homeassistant/components/dialogflow/translations/hu.json index 17f38b0262f..23a6001d77c 100644 --- a/homeassistant/components/dialogflow/translations/hu.json +++ b/homeassistant/components/dialogflow/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a [Dialogflow webhook integr\u00e1ci\u00f3j\u00e1t]({dialogflow_url}). \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/json \n\n Tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1sd a [dokument\u00e1ci\u00f3t]({docs_url})." }, "step": { "user": { - "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani az Dialogflowt?", + "description": "Biztos benne, hogy be szeretn\u00e9 \u00e1ll\u00edtani a Dialogflowt?", "title": "Dialogflow Webhook be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/directv/translations/hu.json b/homeassistant/components/directv/translations/hu.json index 3e0a7d5cb57..9e3aa3efb13 100644 --- a/homeassistant/components/directv/translations/hu.json +++ b/homeassistant/components/directv/translations/hu.json @@ -14,11 +14,11 @@ "one": "\u00dcres", "other": "\u00dcres" }, - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}?" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/directv/translations/id.json b/homeassistant/components/directv/translations/id.json index 74f778d6cee..fcf7318d906 100644 --- a/homeassistant/components/directv/translations/id.json +++ b/homeassistant/components/directv/translations/id.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "DirecTV: {name}", + "flow_title": "{name}", "step": { "ssdp_confirm": { "description": "Ingin menyiapkan {name}?" diff --git a/homeassistant/components/dlna_dmr/translations/ca.json b/homeassistant/components/dlna_dmr/translations/ca.json new file mode 100644 index 00000000000..cf3adc94405 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/ca.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat", + "could_not_connect": "No s'ha pogut connectar amb el dispositiu DLNA", + "discovery_error": "No s'ha pogut descobrir cap dispositiu DLNA coincident", + "incomplete_config": "Falta una variable obligat\u00f2ria a la configuraci\u00f3", + "non_unique_id": "S'han trobat diversos dispositius amb el mateix identificador \u00fanic", + "not_dmr": "El dispositiu no \u00e9s un renderitzador de mitjans digitals" + }, + "error": { + "could_not_connect": "No s'ha pogut connectar amb el dispositiu DLNA", + "not_dmr": "El dispositiu no \u00e9s un renderitzador de mitjans digitals" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Vols comen\u00e7ar la configuraci\u00f3?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "URL al fitxer XML de descripci\u00f3 de dispositiu", + "title": "Renderitzador de mitjans digitals DLNA" + } + } + }, + "options": { + "error": { + "invalid_url": "URL inv\u00e0lid" + }, + "step": { + "init": { + "data": { + "callback_url_override": "URL de crida de l'oient d'esdeveniments", + "listen_port": "Port de l'oient d'esdeveniments (aleatori si no es defineix)", + "poll_availability": "Sondeja per saber la disponibilitat del dispositiu" + }, + "title": "Configuraci\u00f3 del renderitzador de mitjans digitals DLNA" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/de.json b/homeassistant/components/dlna_dmr/translations/de.json new file mode 100644 index 00000000000..50f66761748 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/de.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert", + "could_not_connect": "Verbindung zum DLNA-Ger\u00e4t fehlgeschlagen", + "discovery_error": "Ein passendes DLNA-Ger\u00e4t konnte nicht gefunden werden", + "incomplete_config": "In der Konfiguration fehlt eine erforderliche Variable", + "non_unique_id": "Mehrere Ger\u00e4te mit derselben eindeutigen ID gefunden", + "not_dmr": "Ger\u00e4t ist kein Digital Media Renderer" + }, + "error": { + "could_not_connect": "Verbindung zum DLNA-Ger\u00e4t fehlgeschlagen", + "not_dmr": "Ger\u00e4t ist kein Digital Media Renderer" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "M\u00f6chtest Du mit der Einrichtung beginnen?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "URL zu einer XML-Datei mit Ger\u00e4tebeschreibung", + "title": "DLNA Digital Media Renderer" + } + } + }, + "options": { + "error": { + "invalid_url": "Ung\u00fcltige URL" + }, + "step": { + "init": { + "data": { + "callback_url_override": "R\u00fcckruf-URL des Ereignis-Listeners", + "listen_port": "Port des Ereignis-Listeners (zuf\u00e4llig, wenn nicht festgelegt)", + "poll_availability": "Abfrage der Ger\u00e4teverf\u00fcgbarkeit" + }, + "title": "DLNA Digital Media Renderer Konfiguration" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/et.json b/homeassistant/components/dlna_dmr/translations/et.json new file mode 100644 index 00000000000..e32101ab251 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/et.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud", + "could_not_connect": "DLNA seadmega \u00fchenduse loomine nurjus", + "discovery_error": "Sobiva DLNA -seadme leidmine nurjus", + "incomplete_config": "Seadetes puudub n\u00f5utav muutuja", + "non_unique_id": "Leiti mitu sama unikaalse ID-ga seadet", + "not_dmr": "Seade ei ole digitaalse meedia renderdaja" + }, + "error": { + "could_not_connect": "DLNA seadmega \u00fchenduse loomine nurjus", + "not_dmr": "Seade ei ole digitaalse meedia renderdaja" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Kas alustada seadistamist?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "URL aadress seadme kirjelduse XML-failile", + "title": "DLNA digitaalse meediumi renderdaja" + } + } + }, + "options": { + "error": { + "invalid_url": "Sobimatu URL" + }, + "step": { + "init": { + "data": { + "callback_url_override": "S\u00fcndmuse kuulaja URL", + "listen_port": "S\u00fcndmuste kuulaja port (juhuslik kui pole m\u00e4\u00e4ratud)", + "poll_availability": "K\u00fcsitle seadme saadavuse kohta" + }, + "title": "DLNA digitaalse meediumi renderdaja s\u00e4tted" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/hu.json b/homeassistant/components/dlna_dmr/translations/hu.json new file mode 100644 index 00000000000..faa7e73eb76 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/hu.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r be van konfigur\u00e1lva", + "could_not_connect": "Nem siker\u00fclt csatlakozni a DLNA-eszk\u00f6zh\u00f6z", + "discovery_error": "Nem siker\u00fclt megfelel\u0151 DLNA-eszk\u00f6zt tal\u00e1lni", + "incomplete_config": "A konfigur\u00e1ci\u00f3b\u00f3l hi\u00e1nyzik egy sz\u00fcks\u00e9ges \u00e9rt\u00e9k", + "non_unique_id": "T\u00f6bb eszk\u00f6z tal\u00e1lhat\u00f3 ugyanazzal az egyedi azonos\u00edt\u00f3val", + "not_dmr": "Az eszk\u00f6z nem digit\u00e1lis m\u00e9dia renderel\u0151" + }, + "error": { + "could_not_connect": "Nem siker\u00fclt csatlakozni a DLNA-eszk\u00f6zh\u00f6z", + "not_dmr": "Az eszk\u00f6z nem digit\u00e1lis m\u00e9dia renderel\u0151" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Kezd\u0151dhet a be\u00e1ll\u00edt\u00e1s?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "Az eszk\u00f6z le\u00edr\u00e1s\u00e1nak XML-f\u00e1jl URL-c\u00edme", + "title": "DLNA digit\u00e1lis m\u00e9dia renderel\u0151" + } + } + }, + "options": { + "error": { + "invalid_url": "\u00c9rv\u00e9nytelen URL" + }, + "step": { + "init": { + "data": { + "callback_url_override": "Esem\u00e9nyfigyel\u0151 visszah\u00edv\u00e1si URL (callback)", + "listen_port": "Esem\u00e9nyfigyel\u0151 port (v\u00e9letlenszer\u0171, ha nincs be\u00e1ll\u00edtva)", + "poll_availability": "Eszk\u00f6z el\u00e9r\u00e9s\u00e9nek tesztel\u00e9se lek\u00e9rdez\u00e9ssel" + }, + "title": "DLNA konfigur\u00e1ci\u00f3" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/it.json b/homeassistant/components/dlna_dmr/translations/it.json new file mode 100644 index 00000000000..5defd82a8be --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/it.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", + "could_not_connect": "Impossibile connettersi al dispositivo DLNA", + "discovery_error": "Impossibile individuare un dispositivo DLNA corrispondente", + "incomplete_config": "Nella configurazione manca una variabile richiesta", + "non_unique_id": "Pi\u00f9 dispositivi trovati con lo stesso ID univoco", + "not_dmr": "Il dispositivo non \u00e8 un Digital Media Renderer" + }, + "error": { + "could_not_connect": "Impossibile connettersi al dispositivo DLNA", + "not_dmr": "Il dispositivo non \u00e8 un Digital Media Renderer" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Vuoi iniziare la configurazione?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "URL di un file XML di descrizione del dispositivo", + "title": "DLNA Digital Media Renderer" + } + } + }, + "options": { + "error": { + "invalid_url": "URL non valido" + }, + "step": { + "init": { + "data": { + "callback_url_override": "URL di richiamata dell'ascoltatore di eventi", + "listen_port": "Porta dell'ascoltatore di eventi (casuale se non impostata)", + "poll_availability": "Interrogazione per la disponibilit\u00e0 del dispositivo" + }, + "title": "Configurazione DLNA Digital Media Renderer" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/nl.json b/homeassistant/components/dlna_dmr/translations/nl.json new file mode 100644 index 00000000000..7387494b9b7 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/nl.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "Apparaat is al geconfigureerd", + "could_not_connect": "Mislukt om te verbinden met DNLA apparaat", + "discovery_error": "Kan geen overeenkomend DLNA-apparaat vinden", + "incomplete_config": "Configuratie mist een vereiste variabele", + "non_unique_id": "Meerdere apparaten gevonden met hetzelfde unieke ID", + "not_dmr": "Apparaat is geen Digital Media Renderer" + }, + "error": { + "could_not_connect": "Mislukt om te verbinden met DNLA apparaat", + "not_dmr": "Apparaat is geen Digital Media Renderer" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Wilt u beginnen met instellen?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "URL naar een XML-bestand met apparaatbeschrijvingen", + "title": "DLNA Digital Media Renderer" + } + } + }, + "options": { + "error": { + "invalid_url": "Ongeldige URL" + }, + "step": { + "init": { + "data": { + "callback_url_override": "Event listener callback URL", + "listen_port": "Poort om naar gebeurtenissen te luisteren (willekeurige poort indien niet ingesteld)", + "poll_availability": "Pollen voor apparaat beschikbaarheid" + }, + "title": "DLNA Digital Media Renderer instellingen" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/no.json b/homeassistant/components/dlna_dmr/translations/no.json new file mode 100644 index 00000000000..1ddbfc32afe --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/no.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert", + "could_not_connect": "Kunne ikke koble til DLNA -enhet", + "discovery_error": "Kunne ikke finne en matchende DLNA -enhet", + "incomplete_config": "Konfigurasjonen mangler en n\u00f8dvendig variabel", + "non_unique_id": "Flere enheter ble funnet med samme unike ID", + "not_dmr": "Enheten er ikke en Digital Media Renderer" + }, + "error": { + "could_not_connect": "Kunne ikke koble til DLNA -enhet", + "not_dmr": "Enheten er ikke en Digital Media Renderer" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Vil du starte oppsettet?" + }, + "user": { + "data": { + "url": "URL" + }, + "description": "URL til en enhetsbeskrivelse XML -fil", + "title": "DLNA Digital Media Renderer" + } + } + }, + "options": { + "error": { + "invalid_url": "ugyldig URL" + }, + "step": { + "init": { + "data": { + "callback_url_override": "URL for tilbakeringing av hendelseslytter", + "listen_port": "Hendelseslytterport (tilfeldig hvis den ikke er angitt)", + "poll_availability": "Avstemning for tilgjengelighet av enheter" + }, + "title": "DLNA Digital Media Renderer -konfigurasjon" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/ru.json b/homeassistant/components/dlna_dmr/translations/ru.json new file mode 100644 index 00000000000..bf1be8f6c3d --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/ru.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", + "could_not_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.", + "discovery_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e DLNA.", + "incomplete_config": "\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f.", + "non_unique_id": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c.", + "not_dmr": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u0438\u0430\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c (DMR)." + }, + "error": { + "could_not_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443.", + "not_dmr": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u0438\u0430\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u043e\u043c (DMR)." + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "\u0425\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443?" + }, + "user": { + "data": { + "url": "URL-\u0430\u0434\u0440\u0435\u0441" + }, + "description": "URL-\u0430\u0434\u0440\u0435\u0441 XML-\u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "title": "\u041c\u0435\u0434\u0438\u0430\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440 DLNA" + } + } + }, + "options": { + "error": { + "invalid_url": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441." + }, + "step": { + "init": { + "data": { + "callback_url_override": "Callback URL \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439", + "listen_port": "\u041f\u043e\u0440\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d)", + "poll_availability": "\u041e\u043f\u0440\u043e\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430" + }, + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0435\u0434\u0438\u0430\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u0440\u0430 DLNA" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/zh-Hant.json b/homeassistant/components/dlna_dmr/translations/zh-Hant.json new file mode 100644 index 00000000000..b7eab93d76d --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/zh-Hant.json @@ -0,0 +1,44 @@ +{ + "config": { + "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "could_not_connect": "DLNA \u88dd\u7f6e\u9023\u7dda\u5931\u6557\u3002", + "discovery_error": "DLNA \u88dd\u7f6e\u63a2\u7d22\u5931\u6557", + "incomplete_config": "\u6240\u7f3a\u5c11\u7684\u8a2d\u5b9a\u70ba\u5fc5\u9808\u8b8a\u6578", + "non_unique_id": "\u627e\u5230\u591a\u7d44\u88dd\u7f6e\u4f7f\u7528\u4e86\u76f8\u540c\u552f\u4e00 ID", + "not_dmr": "\u88dd\u7f6e\u4e26\u975e Digital Media Renderer" + }, + "error": { + "could_not_connect": "DLNA \u88dd\u7f6e\u9023\u7dda\u5931\u6557\u3002", + "not_dmr": "\u88dd\u7f6e\u4e26\u975e Digital Media Renderer" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "\u662f\u5426\u8981\u958b\u59cb\u8a2d\u5b9a\uff1f" + }, + "user": { + "data": { + "url": "\u7db2\u5740" + }, + "description": "\u88dd\u7f6e\u8aaa\u660e XML \u6a94\u6848\u4e4b URL", + "title": "DLNA Digital Media Renderer" + } + } + }, + "options": { + "error": { + "invalid_url": "URL \u7121\u6548" + }, + "step": { + "init": { + "data": { + "callback_url_override": "\u4e8b\u4ef6\u76e3\u807d\u56de\u547c URL", + "listen_port": "\u4e8b\u4ef6\u76e3\u807d\u901a\u8a0a\u57e0\uff08\u672a\u8a2d\u7f6e\u5247\u70ba\u96a8\u6a5f\uff09", + "poll_availability": "\u67e5\u8a62\u88dd\u7f6e\u53ef\u7528\u6027" + }, + "title": "DLNA Digital Media Renderer \u8a2d\u5b9a" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/doorbird/translations/hu.json b/homeassistant/components/doorbird/translations/hu.json index cb4c46e699a..48a124b4f17 100644 --- a/homeassistant/components/doorbird/translations/hu.json +++ b/homeassistant/components/doorbird/translations/hu.json @@ -10,11 +10,11 @@ "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, - "flow_title": "DoorBird {name} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "Eszk\u00f6z neve", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" diff --git a/homeassistant/components/doorbird/translations/id.json b/homeassistant/components/doorbird/translations/id.json index f708780ce31..60348ec26a1 100644 --- a/homeassistant/components/doorbird/translations/id.json +++ b/homeassistant/components/doorbird/translations/id.json @@ -10,7 +10,7 @@ "invalid_auth": "Autentikasi tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "DoorBird {name} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/dsmr/translations/ca.json b/homeassistant/components/dsmr/translations/ca.json index 263cb388980..1d61426ebea 100644 --- a/homeassistant/components/dsmr/translations/ca.json +++ b/homeassistant/components/dsmr/translations/ca.json @@ -28,7 +28,7 @@ }, "setup_serial_manual_path": { "data": { - "port": "Ruta del port USB del dispositiu" + "port": "Ruta del dispositiu USB" }, "title": "Ruta" }, diff --git a/homeassistant/components/dsmr/translations/hu.json b/homeassistant/components/dsmr/translations/hu.json index 86a15e99aab..1bca962e2f5 100644 --- a/homeassistant/components/dsmr/translations/hu.json +++ b/homeassistant/components/dsmr/translations/hu.json @@ -18,7 +18,7 @@ "setup_network": { "data": { "dsmr_version": "DSMR verzi\u00f3 kiv\u00e1laszt\u00e1sa", - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "port": "Port" }, "title": "V\u00e1lassza ki a csatlakoz\u00e1si c\u00edmet" diff --git a/homeassistant/components/dunehd/translations/hu.json b/homeassistant/components/dunehd/translations/hu.json index 148a6fde0d0..15b2d297363 100644 --- a/homeassistant/components/dunehd/translations/hu.json +++ b/homeassistant/components/dunehd/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "\u00c1ll\u00edtsa be a Dune HD integr\u00e1ci\u00f3t. Ha probl\u00e9m\u00e1i vannak a konfigur\u00e1ci\u00f3val, l\u00e1togasson el a k\u00f6vetkez\u0151 oldalra: https://www.home-assistant.io/integrations/dunehd \n\n Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a lej\u00e1tsz\u00f3 be van kapcsolva.", "title": "Dune HD" diff --git a/homeassistant/components/elgato/translations/hu.json b/homeassistant/components/elgato/translations/hu.json index 0cd9f2589b8..26740a33f21 100644 --- a/homeassistant/components/elgato/translations/hu.json +++ b/homeassistant/components/elgato/translations/hu.json @@ -7,11 +7,11 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, - "flow_title": "Elgato Key Light: {serial_number}", + "flow_title": "{serial_number}", "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "description": "\u00c1ll\u00edtsa be az Elgato Light-ot, hogy integr\u00e1lhat\u00f3 legyen az HomeAssistantba." diff --git a/homeassistant/components/elgato/translations/id.json b/homeassistant/components/elgato/translations/id.json index b06691b9453..f9fa5690c1d 100644 --- a/homeassistant/components/elgato/translations/id.json +++ b/homeassistant/components/elgato/translations/id.json @@ -7,18 +7,18 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "Elgato Key Light: {serial_number}", + "flow_title": "{serial_number}", "step": { "user": { "data": { "host": "Host", "port": "Port" }, - "description": "Siapkan Elgato Key Light Anda untuk diintegrasikan dengan Home Assistant." + "description": "Siapkan Elgato Light Anda untuk diintegrasikan dengan Home Assistant." }, "zeroconf_confirm": { - "description": "Ingin menambahkan Elgato Key Light dengan nomor seri `{serial_number}` ke Home Assistant?", - "title": "Perangkat Elgato Key Light yang ditemukan" + "description": "Ingin menambahkan Elgato Light dengan nomor seri `{serial_number}` ke Home Assistant?", + "title": "Perangkat Elgato Light yang ditemukan" } } } diff --git a/homeassistant/components/emonitor/translations/hu.json b/homeassistant/components/emonitor/translations/hu.json index 575e2a91d44..1a4fbb292e0 100644 --- a/homeassistant/components/emonitor/translations/hu.json +++ b/homeassistant/components/emonitor/translations/hu.json @@ -10,12 +10,12 @@ "flow_title": "{name}", "step": { "confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}({host})-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name} ({host})?", "title": "A SiteSage Emonitor be\u00e1ll\u00edt\u00e1sa" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/emonitor/translations/id.json b/homeassistant/components/emonitor/translations/id.json index 1365fed7d52..c967ad91d05 100644 --- a/homeassistant/components/emonitor/translations/id.json +++ b/homeassistant/components/emonitor/translations/id.json @@ -7,7 +7,7 @@ "cannot_connect": "Gagal terhubung", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "SiteSage {name}", + "flow_title": "{name}", "step": { "confirm": { "description": "Ingin menyiapkan {name} ({host})?", diff --git a/homeassistant/components/emulated_roku/translations/hu.json b/homeassistant/components/emulated_roku/translations/hu.json index e733e9801df..53b66f6db19 100644 --- a/homeassistant/components/emulated_roku/translations/hu.json +++ b/homeassistant/components/emulated_roku/translations/hu.json @@ -8,8 +8,8 @@ "data": { "advertise_ip": "IP c\u00edm k\u00f6zl\u00e9se", "advertise_port": "Port k\u00f6zl\u00e9se", - "host_ip": "Hoszt IP c\u00edm", - "listen_port": "Port figyel\u00e9se", + "host_ip": "IP c\u00edm", + "listen_port": "Port", "name": "N\u00e9v", "upnp_bind_multicast": "K\u00f6t\u00f6tt multicast (igaz/hamis)" }, diff --git a/homeassistant/components/energy/translations/el.json b/homeassistant/components/energy/translations/el.json new file mode 100644 index 00000000000..cdc7b83c2ee --- /dev/null +++ b/homeassistant/components/energy/translations/el.json @@ -0,0 +1,3 @@ +{ + "title": "\u0395\u03bd\u03ad\u03c1\u03b3\u03b5\u03b9\u03b1" +} \ No newline at end of file diff --git a/homeassistant/components/enphase_envoy/translations/hu.json b/homeassistant/components/enphase_envoy/translations/hu.json index ab92a4ad2bb..38177f8930c 100644 --- a/homeassistant/components/enphase_envoy/translations/hu.json +++ b/homeassistant/components/enphase_envoy/translations/hu.json @@ -13,7 +13,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" } diff --git a/homeassistant/components/enphase_envoy/translations/id.json b/homeassistant/components/enphase_envoy/translations/id.json index ba3f8dd8cc6..31c8251820d 100644 --- a/homeassistant/components/enphase_envoy/translations/id.json +++ b/homeassistant/components/enphase_envoy/translations/id.json @@ -9,7 +9,7 @@ "invalid_auth": "Autentikasi tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Envoy {serial} ({host})", + "flow_title": "{serial} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/epson/translations/hu.json b/homeassistant/components/epson/translations/hu.json index 8e0d7ec9a18..e3aa507b7c1 100644 --- a/homeassistant/components/epson/translations/hu.json +++ b/homeassistant/components/epson/translations/hu.json @@ -7,7 +7,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v" } } diff --git a/homeassistant/components/esphome/translations/ca.json b/homeassistant/components/esphome/translations/ca.json index d0c59194528..4c990994e47 100644 --- a/homeassistant/components/esphome/translations/ca.json +++ b/homeassistant/components/esphome/translations/ca.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "El dispositiu ja est\u00e0 configurat", - "already_in_progress": "El flux de configuraci\u00f3 ja est\u00e0 en curs" + "already_in_progress": "El flux de configuraci\u00f3 ja est\u00e0 en curs", + "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { "connection_error": "No s'ha pogut connectar amb ESP. Verifica que l'arxiu YAML cont\u00e9 la l\u00ednia 'api:'.", "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "invalid_psk": "La clau de xifratge de transport \u00e9s inv\u00e0lida. Assegura't que coincideix amb la de la configuraci\u00f3", "resolve_error": "No s'ha pogut trobar l'adre\u00e7a de l'ESP. Si l'error persisteix, configura una adre\u00e7a IP est\u00e0tica: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "Vols afegir el node `{name}` d'ESPHome a Home Assistant?", "title": "Node d'ESPHome descobert" }, + "encryption_key": { + "data": { + "noise_psk": "Clau de xifrat" + }, + "description": "Introdueix la clau de xifrat de {name} establerta a la configuraci\u00f3." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Clau de xifrat" + }, + "description": "El dispositiu ESPHome {name} ha activat el xifratge de transport o ha canviat la clau de xifrat. Introdueix la clau actualitzada." + }, "user": { "data": { "host": "Amfitri\u00f3", diff --git a/homeassistant/components/esphome/translations/cs.json b/homeassistant/components/esphome/translations/cs.json index 9a451a8537f..fc4a7d5bf8c 100644 --- a/homeassistant/components/esphome/translations/cs.json +++ b/homeassistant/components/esphome/translations/cs.json @@ -2,7 +2,8 @@ "config": { "abort": { "already_configured": "Za\u0159\u00edzen\u00ed je ji\u017e nastaveno", - "already_in_progress": "Konfigurace ji\u017e prob\u00edh\u00e1" + "already_in_progress": "Konfigurace ji\u017e prob\u00edh\u00e1", + "reauth_successful": "Op\u011btovn\u00e9 ov\u011b\u0159en\u00ed bylo \u00fasp\u011b\u0161n\u00e9" }, "error": { "connection_error": "Nelze se p\u0159ipojit k ESP. Zkontrolujte, zda va\u0161e YAML konfigurace obsahuje \u0159\u00e1dek 'api:'.", diff --git a/homeassistant/components/esphome/translations/de.json b/homeassistant/components/esphome/translations/de.json index 8084ef26f0e..6229c09a03e 100644 --- a/homeassistant/components/esphome/translations/de.json +++ b/homeassistant/components/esphome/translations/de.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "Ger\u00e4t ist bereits konfiguriert", - "already_in_progress": "Der Konfigurationsablauf wird bereits ausgef\u00fchrt" + "already_in_progress": "Der Konfigurationsablauf wird bereits ausgef\u00fchrt", + "reauth_successful": "Die erneute Authentifizierung war erfolgreich" }, "error": { "connection_error": "Keine Verbindung zum ESP m\u00f6glich. Achte darauf, dass deine YAML-Datei eine Zeile 'api:' enth\u00e4lt.", "invalid_auth": "Ung\u00fcltige Authentifizierung", + "invalid_psk": "Der Transportverschl\u00fcsselungsschl\u00fcssel ist ung\u00fcltig. Bitte stelle sicher, dass es mit deiner Konfiguration \u00fcbereinstimmt", "resolve_error": "Adresse des ESP kann nicht aufgel\u00f6st werden. Wenn dieser Fehler weiterhin besteht, lege eine statische IP-Adresse fest: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "Willst du den ESPHome-Knoten `{name}` zu Home Assistant hinzuf\u00fcgen?", "title": "Gefundener ESPHome-Knoten" }, + "encryption_key": { + "data": { + "noise_psk": "Verschl\u00fcsselungsschl\u00fcssel" + }, + "description": "Bitte gib den Verschl\u00fcsselungsschl\u00fcssel ein, den du in deiner Konfiguration f\u00fcr {name} festgelegt hast." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Verschl\u00fcsselungsschl\u00fcssel" + }, + "description": "Das ESPHome-Ger\u00e4t {name} hat die Transportverschl\u00fcsselung aktiviert oder den Verschl\u00fcsselungscode ge\u00e4ndert. Bitte gib den aktualisierten Schl\u00fcssel ein." + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/esphome/translations/en.json b/homeassistant/components/esphome/translations/en.json index c57c9d1acb0..5ca5c03f8e9 100644 --- a/homeassistant/components/esphome/translations/en.json +++ b/homeassistant/components/esphome/translations/en.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "Device is already configured", - "already_in_progress": "Configuration flow is already in progress" + "already_in_progress": "Configuration flow is already in progress", + "reauth_successful": "Re-authentication was successful" }, "error": { "connection_error": "Can't connect to ESP. Please make sure your YAML file contains an 'api:' line.", "invalid_auth": "Invalid authentication", + "invalid_psk": "The transport encryption key is invalid. Please ensure it matches what you have in your configuration", "resolve_error": "Can't resolve address of the ESP. If this error persists, please set a static IP address: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "Do you want to add the ESPHome node `{name}` to Home Assistant?", "title": "Discovered ESPHome node" }, + "encryption_key": { + "data": { + "noise_psk": "Encryption key" + }, + "description": "Please enter the encryption key you set in your configuration for {name}." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Encryption key" + }, + "description": "The ESPHome device {name} enabled transport encryption or changed the encryption key. Please enter the updated key." + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/esphome/translations/es.json b/homeassistant/components/esphome/translations/es.json index 9c4b3f52406..f7fd73cd227 100644 --- a/homeassistant/components/esphome/translations/es.json +++ b/homeassistant/components/esphome/translations/es.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "ESP ya est\u00e1 configurado", - "already_in_progress": "La configuraci\u00f3n del ESP ya est\u00e1 en marcha" + "already_in_progress": "La configuraci\u00f3n del ESP ya est\u00e1 en marcha", + "reauth_successful": "La re-autenticaci\u00f3n ha funcionado" }, "error": { "connection_error": "No se puede conectar a ESP. Aseg\u00farate de que tu archivo YAML contenga una l\u00ednea 'api:'.", "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "invalid_psk": "La clave de transporte cifrado no es v\u00e1lida. Por favor, aseg\u00farese de que coincide con la que tiene en su configuraci\u00f3n", "resolve_error": "No se puede resolver la direcci\u00f3n de ESP. Si el error persiste, configura una direcci\u00f3n IP est\u00e1tica: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "ESPHome: {name}", @@ -21,6 +23,18 @@ "description": "\u00bfQuieres a\u00f1adir el nodo `{name}` de ESPHome a Home Assistant?", "title": "Nodo ESPHome descubierto" }, + "encryption_key": { + "data": { + "noise_psk": "Clave de cifrado" + }, + "description": "Por favor, introduzca la clave de cifrado que estableci\u00f3 en su configuraci\u00f3n para {name}." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Clave de cifrado" + }, + "description": "El dispositivo ESPHome {name} ha activado el transporte cifrado o ha cambiado la clave de cifrado. Por favor, introduzca la clave actualizada." + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/esphome/translations/et.json b/homeassistant/components/esphome/translations/et.json index 4f018931141..ea5119b190d 100644 --- a/homeassistant/components/esphome/translations/et.json +++ b/homeassistant/components/esphome/translations/et.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "Seade on juba h\u00e4\u00e4lestatud", - "already_in_progress": "Seadistamine on juba k\u00e4imas" + "already_in_progress": "Seadistamine on juba k\u00e4imas", + "reauth_successful": "Taastuvastamine \u00f5nnestus" }, "error": { "connection_error": "ESP-ga ei saa \u00fchendust luua. Veendu, et YAML-fail sisaldab rida 'api:'.", "invalid_auth": "Tuvastamise viga", + "invalid_psk": "\u00dclekande kr\u00fcpteerimisv\u00f5ti on kehtetu. Veendu, et see vastab seadetes sisalduvale", "resolve_error": "ESP aadressi ei \u00f5nnestu lahendada. Kui see viga p\u00fcsib, m\u00e4\u00e4ra staatiline IP-aadress: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "Kas soovid lisada ESPHome'i s\u00f5lme '{name}' Home Assistant-ile?", "title": "Avastastud ESPHome'i s\u00f5lm" }, + "encryption_key": { + "data": { + "noise_psk": "Kr\u00fcptimisv\u00f5ti" + }, + "description": "Sisesta kr\u00fcptimisv\u00f5ti mille m\u00e4\u00e4rasid oma {name} seadetes." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Kr\u00fcptimisv\u00f5ti" + }, + "description": "ESPHome seade {name} lubas \u00fclekande kr\u00fcptimise v\u00f5i muutis kr\u00fcpteerimisv\u00f5tit. Palun sisesta uuendatud v\u00f5ti." + }, "user": { "data": { "host": "", diff --git a/homeassistant/components/esphome/translations/he.json b/homeassistant/components/esphome/translations/he.json index 5c0f832ba4c..11eaf41ff1a 100644 --- a/homeassistant/components/esphome/translations/he.json +++ b/homeassistant/components/esphome/translations/he.json @@ -2,7 +2,8 @@ "config": { "abort": { "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", - "already_in_progress": "\u05d6\u05e8\u05d9\u05de\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05db\u05d1\u05e8 \u05de\u05ea\u05d1\u05e6\u05e2\u05ea" + "already_in_progress": "\u05d6\u05e8\u05d9\u05de\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05db\u05d1\u05e8 \u05de\u05ea\u05d1\u05e6\u05e2\u05ea", + "reauth_successful": "\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05de\u05d7\u05d3\u05e9 \u05d4\u05e6\u05dc\u05d9\u05d7" }, "error": { "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9" @@ -15,6 +16,11 @@ }, "description": "\u05d0\u05e0\u05d0 \u05d4\u05d6\u05df \u05d0\u05ea \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05e9\u05d4\u05d2\u05d3\u05e8\u05ea \u05d1\u05ea\u05e6\u05d5\u05e8\u05d4 \u05e9\u05dc\u05da \u05e2\u05d1\u05d5\u05e8 {name}." }, + "encryption_key": { + "data": { + "noise_psk": "\u05de\u05e4\u05ea\u05d7 \u05d4\u05e6\u05e4\u05e0\u05d4" + } + }, "user": { "data": { "host": "\u05de\u05d0\u05e8\u05d7", diff --git a/homeassistant/components/esphome/translations/hu.json b/homeassistant/components/esphome/translations/hu.json index 6c4586fbd55..d7ac503d83c 100644 --- a/homeassistant/components/esphome/translations/hu.json +++ b/homeassistant/components/esphome/translations/hu.json @@ -2,31 +2,45 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van." + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", + "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" }, "error": { - "connection_error": "Nem lehet csatlakozni az ESP-hez. K\u00e9rlek gy\u0151z\u0151dj meg r\u00f3la, hogy a YAML f\u00e1jl tartalmaz egy \"api:\" sort.", + "connection_error": "Nem lehet csatlakozni az ESP-hez. K\u00e9rem, gy\u0151z\u0151dj\u00f6n meg r\u00f3la, hogy a YAML f\u00e1jl tartalmaz egy \"api:\" sort.", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", - "resolve_error": "Az ESP c\u00edme nem oldhat\u00f3 fel. Ha a hiba tov\u00e1bbra is fenn\u00e1ll, k\u00e9rlek, \u00e1ll\u00edts be egy statikus IP-c\u00edmet: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" + "invalid_psk": "Az adat\u00e1tviteli titkos\u00edt\u00e1si kulcs \u00e9rv\u00e9nytelen. K\u00e9rj\u00fck, gy\u0151z\u0151dj\u00f6n meg r\u00f3la, hogy megegyezik a konfigur\u00e1ci\u00f3ban l\u00e9v\u0151vel.", + "resolve_error": "Az ESP c\u00edme nem oldhat\u00f3 fel. Ha a hiba tov\u00e1bbra is fenn\u00e1ll, k\u00e9rem, \u00e1ll\u00edtson be egy statikus IP-c\u00edmet: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, - "flow_title": "ESPHome: {name}", + "flow_title": "{name}", "step": { "authenticate": { "data": { "password": "Jelsz\u00f3" }, - "description": "K\u00e9rlek, add meg a konfigur\u00e1ci\u00f3ban {name} n\u00e9vhez be\u00e1ll\u00edtott jelsz\u00f3t." + "description": "K\u00e9rem, adja meg a konfigur\u00e1ci\u00f3ban {name} n\u00e9vhez be\u00e1ll\u00edtott jelsz\u00f3t." }, "discovery_confirm": { - "description": "Szeretn\u00e9d hozz\u00e1adni a(z) `{name}` ESPHome csom\u00f3pontot a Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni `{name}` ESPHome csom\u00f3pontot Home Assistant-hoz?", "title": "Felfedezett ESPHome csom\u00f3pont" }, + "encryption_key": { + "data": { + "noise_psk": "Titkos\u00edt\u00e1si kulcs" + }, + "description": "K\u00e9rj\u00fck, adja meg a {name} konfigur\u00e1ci\u00f3j\u00e1ban be\u00e1ll\u00edtott titkos\u00edt\u00e1si kulcsot." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Titkos\u00edt\u00e1si kulcs" + }, + "description": "{name} ESPHome eszk\u00f6z enged\u00e9lyezte az adat\u00e1tviteli titkos\u00edt\u00e1st vagy megv\u00e1ltoztatta a titkos\u00edt\u00e1si kulcsot. K\u00e9rj\u00fck, adja meg az aktu\u00e1lis kulcsot." + }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, - "description": "K\u00e9rlek, add meg az [ESPHome](https://esphomelib.com/) csom\u00f3pontod kapcsol\u00f3d\u00e1si be\u00e1ll\u00edt\u00e1sait." + "description": "K\u00e9rem, adja meg az [ESPHome](https://esphomelib.com/) csom\u00f3pontj\u00e1nak kapcsol\u00f3d\u00e1si be\u00e1ll\u00edt\u00e1sait." } } } diff --git a/homeassistant/components/esphome/translations/id.json b/homeassistant/components/esphome/translations/id.json index a39a19e12db..530d86e2f56 100644 --- a/homeassistant/components/esphome/translations/id.json +++ b/homeassistant/components/esphome/translations/id.json @@ -2,14 +2,15 @@ "config": { "abort": { "already_configured": "Perangkat sudah dikonfigurasi", - "already_in_progress": "Alur konfigurasi sedang berlangsung" + "already_in_progress": "Alur konfigurasi sedang berlangsung", + "reauth_successful": "Autentikasi ulang berhasil" }, "error": { "connection_error": "Tidak dapat terhubung ke ESP. Pastikan file YAML Anda mengandung baris 'api:'.", "invalid_auth": "Autentikasi tidak valid", "resolve_error": "Tidak dapat menemukan alamat ESP. Jika kesalahan ini terus terjadi, atur alamat IP statis: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, - "flow_title": "ESPHome: {name}", + "flow_title": "{name}", "step": { "authenticate": { "data": { diff --git a/homeassistant/components/esphome/translations/it.json b/homeassistant/components/esphome/translations/it.json index 34d1ec78f6e..390054bc345 100644 --- a/homeassistant/components/esphome/translations/it.json +++ b/homeassistant/components/esphome/translations/it.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", - "already_in_progress": "Il flusso di configurazione \u00e8 gi\u00e0 in corso" + "already_in_progress": "Il flusso di configurazione \u00e8 gi\u00e0 in corso", + "reauth_successful": "La nuova autenticazione \u00e8 stata eseguita correttamente" }, "error": { "connection_error": "Impossibile connettersi ad ESP. Assicurati che il tuo file YAML contenga una riga \"api:\".", "invalid_auth": "Autenticazione non valida", + "invalid_psk": "La chiave di crittografia del trasporto non \u00e8 valida. Assicurati che corrisponda a ci\u00f2 che hai nella tua configurazione", "resolve_error": "Impossibile risolvere l'indirizzo dell'ESP. Se questo errore persiste, impostare un indirizzo IP statico: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "Vuoi aggiungere il nodo ESPHome `{name}` a Home Assistant?", "title": "Trovato nodo ESPHome" }, + "encryption_key": { + "data": { + "noise_psk": "Chiave di crittografia" + }, + "description": "Inserisci la chiave di crittografia che hai impostato nella configurazione per {name}." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Chiave di crittografia" + }, + "description": "Il dispositivo ESPHome {name} ha abilitato la crittografia del trasporto o ha modificato la chiave di crittografia. Inserisci la chiave aggiornata." + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/esphome/translations/nl.json b/homeassistant/components/esphome/translations/nl.json index 019c33004e7..7f6f821104c 100644 --- a/homeassistant/components/esphome/translations/nl.json +++ b/homeassistant/components/esphome/translations/nl.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "Apparaat is al geconfigureerd", - "already_in_progress": "De configuratiestroom is al begonnen" + "already_in_progress": "De configuratiestroom is al begonnen", + "reauth_successful": "Herauthenticatie was succesvol" }, "error": { "connection_error": "Kan geen verbinding maken met ESP. Zorg ervoor dat uw YAML-bestand een regel 'api:' bevat.", "invalid_auth": "Ongeldige authenticatie", + "invalid_psk": "De transportcoderingssleutel is ongeldig. Zorg ervoor dat het overeenkomt met wat u in uw configuratie heeft", "resolve_error": "Kan het adres van de ESP niet vinden. Als deze fout aanhoudt, stel dan een statisch IP-adres in: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "Wil je de ESPHome-node `{name}` toevoegen aan de Home Assistant?", "title": "ESPHome node ontdekt" }, + "encryption_key": { + "data": { + "noise_psk": "Coderingssleutel" + }, + "description": "Voer de coderingssleutel in die u in uw configuratie voor {name}." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Coderingssleutel" + }, + "description": "Het ESPHome-apparaat {name} heeft transportcodering ingeschakeld of de coderingssleutel gewijzigd. Voer de bijgewerkte sleutel in." + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/esphome/translations/no.json b/homeassistant/components/esphome/translations/no.json index 14b92500f41..0d583893570 100644 --- a/homeassistant/components/esphome/translations/no.json +++ b/homeassistant/components/esphome/translations/no.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "Enheten er allerede konfigurert", - "already_in_progress": "Konfigurasjonsflyten p\u00e5g\u00e5r allerede" + "already_in_progress": "Konfigurasjonsflyten p\u00e5g\u00e5r allerede", + "reauth_successful": "Godkjenning p\u00e5 nytt var vellykket" }, "error": { "connection_error": "Kan ikke koble til ESP. Kontroller at YAML filen din inneholder en \"api:\" linje.", "invalid_auth": "Ugyldig godkjenning", + "invalid_psk": "Transportkrypteringsn\u00f8kkelen er ugyldig. S\u00f8rg for at den samsvarer med det du har i konfigurasjonen", "resolve_error": "Kan ikke l\u00f8se adressen til ESP. Hvis denne feilen vedvarer, vennligst [sett en statisk IP-adresse](https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips)" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "\u00d8nsker du \u00e5 legge ESPHome noden `{name}` til Home Assistant?", "title": "Oppdaget ESPHome node" }, + "encryption_key": { + "data": { + "noise_psk": "Krypteringsn\u00f8kkel" + }, + "description": "Skriv inn krypteringsn\u00f8kkelen du angav i konfigurasjonen for {name} ." + }, + "reauth_confirm": { + "data": { + "noise_psk": "Krypteringsn\u00f8kkel" + }, + "description": "ESPHome -enheten {name} aktiverte transportkryptering eller endret krypteringsn\u00f8kkelen. Skriv inn den oppdaterte n\u00f8kkelen." + }, "user": { "data": { "host": "Vert", diff --git a/homeassistant/components/esphome/translations/ru.json b/homeassistant/components/esphome/translations/ru.json index 5987a7db13b..8ba4a573cec 100644 --- a/homeassistant/components/esphome/translations/ru.json +++ b/homeassistant/components/esphome/translations/ru.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", - "already_in_progress": "\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f." + "already_in_progress": "\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.", + "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e." }, "error": { "connection_error": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a ESP. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0412\u0430\u0448 YAML-\u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 'api:'.", "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "invalid_psk": "\u041a\u043b\u044e\u0447 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0432 \u0412\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.", "resolve_error": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 ESP. \u0415\u0441\u043b\u0438 \u044d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP-\u0430\u0434\u0440\u0435\u0441: https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips." }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c ESPHome `{name}`?", "title": "ESPHome" }, + "encryption_key": { + "data": { + "noise_psk": "\u041a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {name}." + }, + "reauth_confirm": { + "data": { + "noise_psk": "\u041a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f" + }, + "description": "\u0414\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 {name} \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0451\u043d \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447." + }, "user": { "data": { "host": "\u0425\u043e\u0441\u0442", diff --git a/homeassistant/components/esphome/translations/zh-Hant.json b/homeassistant/components/esphome/translations/zh-Hant.json index 6ea440c02df..0b415a35c38 100644 --- a/homeassistant/components/esphome/translations/zh-Hant.json +++ b/homeassistant/components/esphome/translations/zh-Hant.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", - "already_in_progress": "\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d" + "already_in_progress": "\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d", + "reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f" }, "error": { "connection_error": "\u7121\u6cd5\u9023\u7dda\u81f3 ESP\uff0c\u8acb\u78ba\u5b9a\u60a8\u7684 YAML \u6a94\u6848\u5305\u542b\u300capi:\u300d\u8a2d\u5b9a\u5217\u3002", "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "invalid_psk": "\u50b3\u8f38\u5bc6\u9470\u7121\u6548\u3002\u8acb\u78ba\u5b9a\u8207\u8a2d\u5b9a\u5167\u6240\u8a2d\u5b9a\u4e4b\u5bc6\u9470\u76f8\u7b26\u5408", "resolve_error": "\u7121\u6cd5\u89e3\u6790 ESP \u4f4d\u5740\uff0c\u5047\u5982\u6b64\u932f\u8aa4\u6301\u7e8c\u767c\u751f\uff0c\u8acb\u53c3\u8003\u8aaa\u660e\u8a2d\u5b9a\u70ba\u975c\u614b\u56fa\u5b9a IP \uff1a https://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "{name}", @@ -21,6 +23,18 @@ "description": "\u662f\u5426\u8981\u5c07 ESPHome \u7bc0\u9ede `{name}` \u65b0\u589e\u81f3 Home Assistant\uff1f", "title": "\u81ea\u52d5\u63a2\u7d22\u5230 ESPHome \u7bc0\u9ede" }, + "encryption_key": { + "data": { + "noise_psk": "\u5bc6\u9470" + }, + "description": "\u8acb\u8f38\u5165 {name} \u8a2d\u5b9a\u4e2d\u6240\u8a2d\u5b9a\u4e4b\u5bc6\u9470\u3002" + }, + "reauth_confirm": { + "data": { + "noise_psk": "\u5bc6\u9470" + }, + "description": "ESPHome \u88dd\u7f6e {name} \u5df2\u958b\u555f\u50b3\u8f38\u52a0\u5bc6\u6216\u8b8a\u66f4\u5bc6\u9470\u3002\u8acb\u8f38\u5165\u66f4\u65b0\u5bc6\u9470\u3002" + }, "user": { "data": { "host": "\u4e3b\u6a5f\u7aef", diff --git a/homeassistant/components/ezviz/translations/ca.json b/homeassistant/components/ezviz/translations/ca.json index c7c71e07122..7c71de300f6 100644 --- a/homeassistant/components/ezviz/translations/ca.json +++ b/homeassistant/components/ezviz/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured_account": "El compte ja ha estat configurat", + "already_configured_account": "El compte ja est\u00e0 configurat", "ezviz_cloud_account_missing": "Falta el compte d'Ezviz cloud. Torna'l a configurar", "unknown": "Error inesperat" }, diff --git a/homeassistant/components/ezviz/translations/hu.json b/homeassistant/components/ezviz/translations/hu.json index 3ece0a79dcf..5907f66ceb4 100644 --- a/homeassistant/components/ezviz/translations/hu.json +++ b/homeassistant/components/ezviz/translations/hu.json @@ -8,7 +8,7 @@ "error": { "cannot_connect": "Nem siker\u00fclt csatlakozni", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", - "invalid_host": "\u00c9rv\u00e9nytelen gazdag\u00e9pn\u00e9v vagy IP-c\u00edm" + "invalid_host": "\u00c9rv\u00e9nytelen C\u00edm" }, "flow_title": "{serial}", "step": { diff --git a/homeassistant/components/fireservicerota/translations/ca.json b/homeassistant/components/fireservicerota/translations/ca.json index 287bb81e51e..261350db3f8 100644 --- a/homeassistant/components/fireservicerota/translations/ca.json +++ b/homeassistant/components/fireservicerota/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "create_entry": { diff --git a/homeassistant/components/fjaraskupan/translations/es.json b/homeassistant/components/fjaraskupan/translations/es.json new file mode 100644 index 00000000000..36ff1884048 --- /dev/null +++ b/homeassistant/components/fjaraskupan/translations/es.json @@ -0,0 +1,8 @@ +{ + "config": { + "abort": { + "no_devices_found": "No se encontraron dispositivos en la red", + "single_instance_allowed": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n." + } + } +} \ No newline at end of file diff --git a/homeassistant/components/fjaraskupan/translations/id.json b/homeassistant/components/fjaraskupan/translations/id.json new file mode 100644 index 00000000000..ed64894fff4 --- /dev/null +++ b/homeassistant/components/fjaraskupan/translations/id.json @@ -0,0 +1,13 @@ +{ + "config": { + "abort": { + "no_devices_found": "Tidak ada perangkat yang ditemukan di jaringan", + "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." + }, + "step": { + "confirm": { + "description": "Ingin menyiapkan Fj\u00e4r\u00e5skupan?" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flick_electric/translations/ca.json b/homeassistant/components/flick_electric/translations/ca.json index 74fd0e79708..b98cfc742db 100644 --- a/homeassistant/components/flick_electric/translations/ca.json +++ b/homeassistant/components/flick_electric/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3", diff --git a/homeassistant/components/flick_electric/translations/he.json b/homeassistant/components/flick_electric/translations/he.json index b1e5464047b..0cbd1ab331b 100644 --- a/homeassistant/components/flick_electric/translations/he.json +++ b/homeassistant/components/flick_electric/translations/he.json @@ -11,8 +11,8 @@ "step": { "user": { "data": { - "client_id": "Client ID (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", - "client_secret": "Client Secret (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", + "client_id": "\u05de\u05d6\u05d4\u05d4 \u05dc\u05e7\u05d5\u05d7 (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", + "client_secret": "\u05e1\u05d5\u05d3 \u05dc\u05e7\u05d5\u05d7 (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", "password": "\u05e1\u05d9\u05e1\u05de\u05d4", "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" } diff --git a/homeassistant/components/flick_electric/translations/id.json b/homeassistant/components/flick_electric/translations/id.json index 8c283cfd56e..3085534a862 100644 --- a/homeassistant/components/flick_electric/translations/id.json +++ b/homeassistant/components/flick_electric/translations/id.json @@ -11,8 +11,8 @@ "step": { "user": { "data": { - "client_id": "ID Klien (Opsional)", - "client_secret": "Kode Rahasia Klien (Opsional)", + "client_id": "ID Klien (opsional)", + "client_secret": "Kode Rahasia Klien (opsional)", "password": "Kata Sandi", "username": "Nama Pengguna" }, diff --git a/homeassistant/components/flipr/translations/es.json b/homeassistant/components/flipr/translations/es.json index 69ff84c2e69..0a066451b84 100644 --- a/homeassistant/components/flipr/translations/es.json +++ b/homeassistant/components/flipr/translations/es.json @@ -1,8 +1,13 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "no_flipr_id_found": "Por ahora no hay ning\u00fan ID de Flipr asociado a tu cuenta. Deber\u00edas verificar que est\u00e1 funcionando con la aplicaci\u00f3n m\u00f3vil de Flipr primero.", - "unknown": "Error desconocido" + "unknown": "Error inesperado" }, "step": { "flipr_id": { @@ -14,8 +19,8 @@ }, "user": { "data": { - "email": "Correo-e", - "password": "Clave" + "email": "Correo electr\u00f3nico", + "password": "Contrase\u00f1a" }, "description": "Con\u00e9ctese usando su cuenta Flipr.", "title": "Conectarse a Flipr" diff --git a/homeassistant/components/flipr/translations/id.json b/homeassistant/components/flipr/translations/id.json new file mode 100644 index 00000000000..63751867097 --- /dev/null +++ b/homeassistant/components/flipr/translations/id.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "email": "Email", + "password": "Kata Sandi" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flo/translations/hu.json b/homeassistant/components/flo/translations/hu.json index 0abcc301f0c..9590d3c12be 100644 --- a/homeassistant/components/flo/translations/hu.json +++ b/homeassistant/components/flo/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" } diff --git a/homeassistant/components/flume/translations/ca.json b/homeassistant/components/flume/translations/ca.json index 04a7accf4a5..5cd81a00a67 100644 --- a/homeassistant/components/flume/translations/ca.json +++ b/homeassistant/components/flume/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/forecast_solar/translations/es.json b/homeassistant/components/forecast_solar/translations/es.json index 8a1b51a5084..d688c577024 100644 --- a/homeassistant/components/forecast_solar/translations/es.json +++ b/homeassistant/components/forecast_solar/translations/es.json @@ -5,7 +5,10 @@ "data": { "azimuth": "Acimut (360 grados, 0 = Norte, 90 = Este, 180 = Sur, 270 = Oeste)", "declination": "Declinaci\u00f3n (0 = Horizontal, 90 = Vertical)", - "modules power": "Potencia total en vatios pico de sus m\u00f3dulos solares" + "latitude": "Latitud", + "longitude": "Longitud", + "modules power": "Potencia total en vatios pico de sus m\u00f3dulos solares", + "name": "Nombre" }, "description": "Rellene los datos de sus paneles solares. Consulte la documentaci\u00f3n si alg\u00fan campo no est\u00e1 claro." } diff --git a/homeassistant/components/forecast_solar/translations/id.json b/homeassistant/components/forecast_solar/translations/id.json index b0a5ddcdc7e..130f66db7f5 100644 --- a/homeassistant/components/forecast_solar/translations/id.json +++ b/homeassistant/components/forecast_solar/translations/id.json @@ -3,7 +3,9 @@ "step": { "user": { "data": { - "latitude": "Lintang" + "latitude": "Lintang", + "longitude": "Bujur", + "name": "Nama" } } } diff --git a/homeassistant/components/forked_daapd/translations/hu.json b/homeassistant/components/forked_daapd/translations/hu.json index bbf8cb560ff..2058bbd1cbe 100644 --- a/homeassistant/components/forked_daapd/translations/hu.json +++ b/homeassistant/components/forked_daapd/translations/hu.json @@ -8,15 +8,15 @@ "forbidden": "Nem tud csatlakozni. K\u00e9rj\u00fck, ellen\u0151rizze a forked-daapd h\u00e1l\u00f3zati enged\u00e9lyeket.", "unknown_error": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt", "websocket_not_enabled": "forked-daapd szerver websocket nincs enged\u00e9lyezve.", - "wrong_host_or_port": "Nem tud csatlakozni. K\u00e9rj\u00fck, ellen\u0151rizze a gazdag\u00e9pet \u00e9s a portot.", + "wrong_host_or_port": "Nem tud csatlakozni. K\u00e9rj\u00fck, ellen\u0151rizze a c\u00edmet \u00e9s a portot.", "wrong_password": "Helytelen jelsz\u00f3.", - "wrong_server_type": "A forked-daapd integr\u00e1ci\u00f3hoz forked-daapd szerver sz\u00fcks\u00e9ges, amelynek verzi\u00f3ja> = 27.0." + "wrong_server_type": "A forked-daapd integr\u00e1ci\u00f3hoz forked-daapd szerver sz\u00fcks\u00e9ges, amelynek verzi\u00f3ja legal\u00e1bb 27.0." }, "flow_title": "{name} ({host})", "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "Megjelen\u00edt\u00e9si n\u00e9v", "password": "API jelsz\u00f3 (hagyja \u00fcresen, ha nincs jelsz\u00f3)", "port": "API port" diff --git a/homeassistant/components/forked_daapd/translations/id.json b/homeassistant/components/forked_daapd/translations/id.json index 76787e2a19b..f57a8fb8566 100644 --- a/homeassistant/components/forked_daapd/translations/id.json +++ b/homeassistant/components/forked_daapd/translations/id.json @@ -12,7 +12,7 @@ "wrong_password": "Kata sandi salah.", "wrong_server_type": "Integrasi forked-daapd membutuhkan server forked-daapd dengan versi >= 27.0." }, - "flow_title": "forked-daapd server: {name} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/foscam/translations/hu.json b/homeassistant/components/foscam/translations/hu.json index 63ea95210ff..b303db792bb 100644 --- a/homeassistant/components/foscam/translations/hu.json +++ b/homeassistant/components/foscam/translations/hu.json @@ -12,7 +12,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "rtsp_port": "RTSP port", diff --git a/homeassistant/components/freebox/translations/hu.json b/homeassistant/components/freebox/translations/hu.json index c929d56f38e..873e1057c15 100644 --- a/homeassistant/components/freebox/translations/hu.json +++ b/homeassistant/components/freebox/translations/hu.json @@ -10,12 +10,12 @@ }, "step": { "link": { - "description": "Kattintson a \u201eK\u00fcld\u00e9s\u201d gombra, majd \u00e9rintse meg a jobbra mutat\u00f3 nyilat az \u00fatv\u00e1laszt\u00f3n a Freebox regisztr\u00e1l\u00e1s\u00e1hoz a HomeAssistant seg\u00edts\u00e9g\u00e9vel. \n\n ! [A gomb helye az \u00fatv\u00e1laszt\u00f3n] (/static/images/config_freebox.png)", + "description": "Kattintson a \u201eK\u00fcld\u00e9s\u201d gombra, majd \u00e9rintse meg a jobbra mutat\u00f3 nyilat az \u00fatv\u00e1laszt\u00f3n a Freebox regisztr\u00e1l\u00e1s\u00e1hoz Home Assistant seg\u00edts\u00e9g\u00e9vel. \n\n![A gomb helye a routeren] (/static/images/config_freebox.png)", "title": "Freebox \u00fatv\u00e1laszt\u00f3 linkel\u00e9se" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "Freebox" diff --git a/homeassistant/components/freedompro/translations/id.json b/homeassistant/components/freedompro/translations/id.json index 82523dc65d1..9676af6d8f9 100644 --- a/homeassistant/components/freedompro/translations/id.json +++ b/homeassistant/components/freedompro/translations/id.json @@ -1,5 +1,12 @@ { "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid" + }, "step": { "user": { "data": { diff --git a/homeassistant/components/fritz/translations/es.json b/homeassistant/components/fritz/translations/es.json index f9f586bfa71..45519eb7eb5 100644 --- a/homeassistant/components/fritz/translations/es.json +++ b/homeassistant/components/fritz/translations/es.json @@ -8,6 +8,7 @@ "error": { "already_configured": "El dispositivo ya est\u00e1 configurado", "already_in_progress": "El flujo de configuraci\u00f3n ya est\u00e1 en proceso", + "cannot_connect": "No se pudo conectar", "connection_error": "No se pudo conectar", "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida" }, @@ -18,7 +19,7 @@ "password": "Contrase\u00f1a", "username": "Usuario" }, - "description": "Descubierto FRITZ!Box: {nombre}\n\nConfigurar FRITZ!Box Tools para controlar tu {nombre}", + "description": "Descubierto FRITZ!Box: {name}\n\nConfigurar FRITZ!Box Tools para controlar tu {name}", "title": "Configurar FRITZ!Box Tools" }, "reauth_confirm": { @@ -43,7 +44,8 @@ "data": { "host": "Anfitri\u00f3n", "password": "Contrase\u00f1a", - "port": "Puerto" + "port": "Puerto", + "username": "Usuario" }, "description": "Configure las herramientas de FRITZ! Box para controlar su FRITZ! Box.\n M\u00ednimo necesario: nombre de usuario, contrase\u00f1a.", "title": "Configurar las herramientas de FRITZ! Box" diff --git a/homeassistant/components/fritz/translations/hu.json b/homeassistant/components/fritz/translations/hu.json index 1433860bfa6..733a4fb1a8e 100644 --- a/homeassistant/components/fritz/translations/hu.json +++ b/homeassistant/components/fritz/translations/hu.json @@ -32,7 +32,7 @@ }, "start_config": { "data": { - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" @@ -42,7 +42,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" diff --git a/homeassistant/components/fritz/translations/ko.json b/homeassistant/components/fritz/translations/ko.json new file mode 100644 index 00000000000..718b105df33 --- /dev/null +++ b/homeassistant/components/fritz/translations/ko.json @@ -0,0 +1,38 @@ +{ + "config": { + "abort": { + "already_configured": "\uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "already_in_progress": "\uae30\uae30 \uad6c\uc131\uc774 \uc774\ubbf8 \uc9c4\ud589 \uc911\uc785\ub2c8\ub2e4", + "reauth_successful": "\uc7ac\uc778\uc99d\uc5d0 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4" + }, + "error": { + "already_configured": "\uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "already_in_progress": "\uae30\uae30 \uad6c\uc131\uc774 \uc774\ubbf8 \uc9c4\ud589 \uc911\uc785\ub2c8\ub2e4", + "connection_error": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4", + "invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "data": { + "password": "\ube44\ubc00\ubc88\ud638", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + } + }, + "reauth_confirm": { + "data": { + "password": "\ube44\ubc00\ubc88\ud638", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + } + }, + "start_config": { + "data": { + "host": "\ud638\uc2a4\ud2b8", + "password": "\ube44\ubc00\ubc88\ud638", + "port": "\ud3ec\ud2b8", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/fritz/translations/ru.json b/homeassistant/components/fritz/translations/ru.json index 7c030ca4d88..54619e22a36 100644 --- a/homeassistant/components/fritz/translations/ru.json +++ b/homeassistant/components/fritz/translations/ru.json @@ -56,7 +56,7 @@ "step": { "init": { "data": { - "consider_home": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \"\u0414\u043e\u043c\u0430\"" + "consider_home": "\u0412\u0440\u0435\u043c\u044f, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u043c\u0430 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)" } } } diff --git a/homeassistant/components/fritzbox/translations/hu.json b/homeassistant/components/fritzbox/translations/hu.json index 50a81601310..c5d5e495131 100644 --- a/homeassistant/components/fritzbox/translations/hu.json +++ b/homeassistant/components/fritzbox/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "no_devices_found": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a h\u00e1l\u00f3zaton", "not_supported": "Csatlakoztatva az AVM FRITZ! Boxhoz, de nem tudja vez\u00e9relni az intelligens otthoni eszk\u00f6z\u00f6ket.", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" @@ -17,7 +17,7 @@ "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}?" }, "reauth_confirm": { "data": { @@ -28,7 +28,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, diff --git a/homeassistant/components/fritzbox/translations/id.json b/homeassistant/components/fritzbox/translations/id.json index 8dbd1f71534..f9c4f09b4ae 100644 --- a/homeassistant/components/fritzbox/translations/id.json +++ b/homeassistant/components/fritzbox/translations/id.json @@ -10,7 +10,7 @@ "error": { "invalid_auth": "Autentikasi tidak valid" }, - "flow_title": "AVM FRITZ!Box: {name}", + "flow_title": "{name}", "step": { "confirm": { "data": { diff --git a/homeassistant/components/fritzbox_callmonitor/translations/hu.json b/homeassistant/components/fritzbox_callmonitor/translations/hu.json index 5006dd77f14..86b4c637ca0 100644 --- a/homeassistant/components/fritzbox_callmonitor/translations/hu.json +++ b/homeassistant/components/fritzbox_callmonitor/translations/hu.json @@ -17,7 +17,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" diff --git a/homeassistant/components/fritzbox_callmonitor/translations/id.json b/homeassistant/components/fritzbox_callmonitor/translations/id.json index 43bb4a16b47..1325edd720c 100644 --- a/homeassistant/components/fritzbox_callmonitor/translations/id.json +++ b/homeassistant/components/fritzbox_callmonitor/translations/id.json @@ -8,7 +8,7 @@ "error": { "invalid_auth": "Autentikasi tidak valid" }, - "flow_title": "Pantau panggilan AVM FRITZ!Box: {name}", + "flow_title": "{name}", "step": { "phonebook": { "data": { diff --git a/homeassistant/components/garages_amsterdam/translations/es.json b/homeassistant/components/garages_amsterdam/translations/es.json index bfea8be63c1..79433b6b854 100644 --- a/homeassistant/components/garages_amsterdam/translations/es.json +++ b/homeassistant/components/garages_amsterdam/translations/es.json @@ -1,6 +1,8 @@ { "config": { "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", + "cannot_connect": "No se pudo conectar", "unknown": "Error inesperado" }, "step": { diff --git a/homeassistant/components/geofency/translations/hu.json b/homeassistant/components/geofency/translations/hu.json index 826b943e2f8..de8f368adb3 100644 --- a/homeassistant/components/geofency/translations/hu.json +++ b/homeassistant/components/geofency/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { "default": "Az esem\u00e9ny Home Assistantnek val\u00f3 k\u00fcld\u00e9s\u00e9hez be kell \u00e1ll\u00edtanod a webhook funkci\u00f3t a Geofencyben. \n\n Az al\u00e1bbi inform\u00e1ci\u00f3kat haszn\u00e1ld: \n\n - URL: `{webhook_url}` \n - Method: POST \n\n Tov\u00e1bbi r\u00e9szletek a [dokument\u00e1ci\u00f3]({docs_url}) linken tal\u00e1lhat\u00f3k." }, "step": { "user": { - "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a Geofency Webhookot?", + "description": "Biztos benne, hogy be szeretn\u00e9 \u00e1ll\u00edtani a Geofency Webhookot?", "title": "A Geofency Webhook be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/glances/translations/hu.json b/homeassistant/components/glances/translations/hu.json index d85baecb5ca..d93fa4bb66e 100644 --- a/homeassistant/components/glances/translations/hu.json +++ b/homeassistant/components/glances/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v", "password": "Jelsz\u00f3", "port": "Port", diff --git a/homeassistant/components/goalzero/translations/es.json b/homeassistant/components/goalzero/translations/es.json index 8c3aeb80965..fa54d6d6afc 100644 --- a/homeassistant/components/goalzero/translations/es.json +++ b/homeassistant/components/goalzero/translations/es.json @@ -2,6 +2,7 @@ "config": { "abort": { "already_configured": "La cuenta ya ha sido configurada", + "invalid_host": "Nombre de host o direcci\u00f3n IP no v\u00e1lidos", "unknown": "Error inesperado" }, "error": { diff --git a/homeassistant/components/goalzero/translations/hu.json b/homeassistant/components/goalzero/translations/hu.json index f8c507a6625..62c0a1626f9 100644 --- a/homeassistant/components/goalzero/translations/hu.json +++ b/homeassistant/components/goalzero/translations/hu.json @@ -12,15 +12,15 @@ }, "step": { "confirm_discovery": { - "description": "DHCP foglal\u00e1s aj\u00e1nlott az \u00fatv\u00e1laszt\u00f3n. Ha nincs be\u00e1ll\u00edtva, akkor az eszk\u00f6z el\u00e9rhetetlenn\u00e9 v\u00e1lhat, am\u00edg a Home Assistant \u00e9szleli az \u00faj IP-c\u00edmet. Olvassa el az \u00fatv\u00e1laszt\u00f3 felhaszn\u00e1l\u00f3i k\u00e9zik\u00f6nyv\u00e9t.", + "description": "DHCP foglal\u00e1s aj\u00e1nlott az routeren. Ha nincs be\u00e1ll\u00edtva, akkor az eszk\u00f6z el\u00e9rhetetlenn\u00e9 v\u00e1lhat, am\u00edg Home Assistant \u00e9szleli az \u00faj IP-c\u00edmet. Olvassa el az router felhaszn\u00e1l\u00f3i k\u00e9zik\u00f6nyv\u00e9t.", "title": "Goal Zero Yeti" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v" }, - "description": "El\u0151sz\u00f6r le kell t\u00f6ltenie a Goal Zero alkalmaz\u00e1st: https://www.goalzero.com/product-features/yeti-app/ \n\nK\u00f6vesse az utas\u00edt\u00e1sokat, hogy csatlakoztassa Yeti k\u00e9sz\u00fcl\u00e9k\u00e9t a Wi-Fi h\u00e1l\u00f3zathoz. DHCP foglal\u00e1s aj\u00e1nlott az \u00fatv\u00e1laszt\u00f3n. Ha nincs be\u00e1ll\u00edtva, akkor az eszk\u00f6z el\u00e9rhetetlenn\u00e9 v\u00e1lhat, am\u00edg a Home Assistant \u00e9szleli az \u00faj IP-c\u00edmet. Olvassa el az \u00fatv\u00e1laszt\u00f3 felhaszn\u00e1l\u00f3i k\u00e9zik\u00f6nyv\u00e9t.", + "description": "El\u0151sz\u00f6r le kell t\u00f6ltenie a Goal Zero alkalmaz\u00e1st: https://www.goalzero.com/product-features/yeti-app/ \n\nK\u00f6vesse az utas\u00edt\u00e1sokat, hogy csatlakoztassa Yeti k\u00e9sz\u00fcl\u00e9k\u00e9t a Wi-Fi h\u00e1l\u00f3zathoz. DHCP foglal\u00e1s aj\u00e1nlott az routeren. Ha nincs be\u00e1ll\u00edtva, akkor az eszk\u00f6z el\u00e9rhetetlenn\u00e9 v\u00e1lhat, am\u00edg a Home Assistant \u00e9szleli az \u00faj IP-c\u00edmet. Olvassa el az router felhaszn\u00e1l\u00f3i k\u00e9zik\u00f6nyv\u00e9t.", "title": "Goal Zero Yeti" } } diff --git a/homeassistant/components/gogogate2/translations/id.json b/homeassistant/components/gogogate2/translations/id.json index 89d25d74a48..04029205389 100644 --- a/homeassistant/components/gogogate2/translations/id.json +++ b/homeassistant/components/gogogate2/translations/id.json @@ -16,7 +16,7 @@ "username": "Nama Pengguna" }, "description": "Berikan informasi yang diperlukan di bawah ini.", - "title": "Siapkan GogoGate2 atau iSmartGate" + "title": "Siapkan GogoGate2 atau ismartgate" } } } diff --git a/homeassistant/components/gpslogger/translations/hu.json b/homeassistant/components/gpslogger/translations/hu.json index fe459ca3164..45832cf493f 100644 --- a/homeassistant/components/gpslogger/translations/hu.json +++ b/homeassistant/components/gpslogger/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { "default": "Az esem\u00e9ny Home Assistantnek val\u00f3 k\u00fcld\u00e9s\u00e9hez be kell \u00e1ll\u00edtanod a webhook funkci\u00f3t a GPSLoggerben. \n\n Az al\u00e1bbi inform\u00e1ci\u00f3kat haszn\u00e1ld: \n\n - URL: `{webhook_url}` \n - Method: POST \n\n Tov\u00e1bbi r\u00e9szletek a [dokument\u00e1ci\u00f3]({docs_url}) linken tal\u00e1lhat\u00f3k." }, "step": { "user": { - "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a GPSLogger Webhookot?", + "description": "Biztos benne, hogy be szeretn\u00e9 \u00e1ll\u00edtani a GPSLogger Webhookot?", "title": "GPSLogger Webhook be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/gree/translations/hu.json b/homeassistant/components/gree/translations/hu.json index 6c61530acbe..a56ebbfc906 100644 --- a/homeassistant/components/gree/translations/hu.json +++ b/homeassistant/components/gree/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } } diff --git a/homeassistant/components/gree/translations/nl.json b/homeassistant/components/gree/translations/nl.json index d11896014fd..0671f0b3674 100644 --- a/homeassistant/components/gree/translations/nl.json +++ b/homeassistant/components/gree/translations/nl.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } } diff --git a/homeassistant/components/growatt_server/translations/es.json b/homeassistant/components/growatt_server/translations/es.json index 23860f225da..8fe4ae8b791 100644 --- a/homeassistant/components/growatt_server/translations/es.json +++ b/homeassistant/components/growatt_server/translations/es.json @@ -17,6 +17,7 @@ "data": { "name": "Nombre", "password": "Nombre", + "url": "URL", "username": "Usuario" }, "title": "Introduce tu informaci\u00f3n de Growatt." diff --git a/homeassistant/components/growatt_server/translations/id.json b/homeassistant/components/growatt_server/translations/id.json index 789d4e1732b..59975607fb7 100644 --- a/homeassistant/components/growatt_server/translations/id.json +++ b/homeassistant/components/growatt_server/translations/id.json @@ -8,6 +8,7 @@ "data": { "name": "Nama", "password": "Kata Sandi", + "url": "URL", "username": "Nama Pengguna" } } diff --git a/homeassistant/components/guardian/translations/hu.json b/homeassistant/components/guardian/translations/hu.json index 15469bead1e..ecd1b7de01b 100644 --- a/homeassistant/components/guardian/translations/hu.json +++ b/homeassistant/components/guardian/translations/hu.json @@ -2,12 +2,12 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, "step": { "discovery_confirm": { - "description": "Be akarja \u00e1ll\u00edtani ezt a Guardian eszk\u00f6zt?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani ezt a Guardian eszk\u00f6zt?" }, "user": { "data": { @@ -17,7 +17,7 @@ "description": "Konfigur\u00e1lja a helyi Elexa Guardian eszk\u00f6zt." }, "zeroconf_confirm": { - "description": "Be akarja \u00e1ll\u00edtani ezt a Guardian eszk\u00f6zt?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani ezt a Guardian eszk\u00f6zt?" } } } diff --git a/homeassistant/components/hangouts/translations/fi.json b/homeassistant/components/hangouts/translations/fi.json index 959a2c06a63..05b394c69f4 100644 --- a/homeassistant/components/hangouts/translations/fi.json +++ b/homeassistant/components/hangouts/translations/fi.json @@ -8,6 +8,7 @@ "data": { "2fa": "2FA-pin" }, + "description": "Tyhj\u00e4", "title": "Kaksivaiheinen tunnistus" }, "user": { @@ -15,6 +16,7 @@ "email": "S\u00e4hk\u00f6postiosoite", "password": "Salasana" }, + "description": "Tyhj\u00e4", "title": "Google Hangouts -kirjautuminen" } } diff --git a/homeassistant/components/hangouts/translations/hu.json b/homeassistant/components/hangouts/translations/hu.json index 2f02ba9f623..eda0144a818 100644 --- a/homeassistant/components/hangouts/translations/hu.json +++ b/homeassistant/components/hangouts/translations/hu.json @@ -12,7 +12,7 @@ "step": { "2fa": { "data": { - "2fa": "2FA Pin" + "2fa": "2FA PIN" }, "description": "\u00dcres", "title": "K\u00e9tfaktoros Hiteles\u00edt\u00e9s" diff --git a/homeassistant/components/harmony/translations/hu.json b/homeassistant/components/harmony/translations/hu.json index 4922bbd1ac6..900cd243247 100644 --- a/homeassistant/components/harmony/translations/hu.json +++ b/homeassistant/components/harmony/translations/hu.json @@ -10,12 +10,12 @@ "flow_title": "{name}", "step": { "link": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}({host})-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name} ({host})?", "title": "A Logitech Harmony Hub be\u00e1ll\u00edt\u00e1sa" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "Hub neve" }, "title": "A Logitech Harmony Hub be\u00e1ll\u00edt\u00e1sa" diff --git a/homeassistant/components/harmony/translations/id.json b/homeassistant/components/harmony/translations/id.json index 0d2991b1feb..86ab0be3274 100644 --- a/homeassistant/components/harmony/translations/id.json +++ b/homeassistant/components/harmony/translations/id.json @@ -7,7 +7,7 @@ "cannot_connect": "Gagal terhubung", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Logitech Harmony Hub {name}", + "flow_title": "{name}", "step": { "link": { "description": "Ingin menyiapkan {name} ({host})?", diff --git a/homeassistant/components/hassio/translations/he.json b/homeassistant/components/hassio/translations/he.json index 17b7fcd0050..8926338221a 100644 --- a/homeassistant/components/hassio/translations/he.json +++ b/homeassistant/components/hassio/translations/he.json @@ -1,10 +1,18 @@ { "system_health": { "info": { + "board": "\u05dc\u05d5\u05d7", + "disk_total": "\u05e1\u05d4\"\u05db \u05d3\u05d9\u05e1\u05e7", + "disk_used": "\u05d3\u05d9\u05e1\u05e7 \u05d1\u05e9\u05d9\u05de\u05d5\u05e9", + "docker_version": "\u05d2\u05d9\u05e8\u05e1\u05ea Docker", + "healthy": "\u05d1\u05e8\u05d9\u05d0\u05d5\u05ea", "host_os": "\u05de\u05e2\u05e8\u05db\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 \u05de\u05d0\u05e8\u05d7\u05ea", + "installed_addons": "\u05d4\u05e8\u05d7\u05d1\u05d5\u05ea \u05de\u05d5\u05ea\u05e7\u05e0\u05d5\u05ea", "supervisor_api": "API \u05e9\u05dc \u05de\u05e4\u05e7\u05d7", "supervisor_version": "\u05d2\u05d9\u05e8\u05e1\u05ea \u05de\u05e4\u05e7\u05d7", - "update_channel": "\u05e2\u05e8\u05d5\u05e5 \u05e2\u05d3\u05db\u05d5\u05df" + "supported": "\u05e0\u05ea\u05de\u05da", + "update_channel": "\u05e2\u05e8\u05d5\u05e5 \u05e2\u05d3\u05db\u05d5\u05df", + "version_api": "\u05d2\u05e8\u05e1\u05ea API" } } } \ No newline at end of file diff --git a/homeassistant/components/heos/translations/hu.json b/homeassistant/components/heos/translations/hu.json index c487b49ee47..8996c2a4530 100644 --- a/homeassistant/components/heos/translations/hu.json +++ b/homeassistant/components/heos/translations/hu.json @@ -9,9 +9,9 @@ "step": { "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "K\u00e9rj\u00fck, adja meg egy Heos-eszk\u00f6z gazdag\u00e9pnev\u00e9t vagy IP-c\u00edm\u00e9t (lehet\u0151leg egy vezet\u00e9kkel a h\u00e1l\u00f3zathoz csatlakoztatott eszk\u00f6zt).", + "description": "K\u00e9rj\u00fck, adja meg egy Heos-eszk\u00f6z hosztnev\u00e9t vagy c\u00edm\u00e9t (lehet\u0151leg egy vezet\u00e9kkel a h\u00e1l\u00f3zathoz csatlakoztatott eszk\u00f6zt).", "title": "Csatlakoz\u00e1s a Heos-hoz" } } diff --git a/homeassistant/components/hive/translations/ca.json b/homeassistant/components/hive/translations/ca.json index eacccda82e7..edebafba579 100644 --- a/homeassistant/components/hive/translations/ca.json +++ b/homeassistant/components/hive/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament", "unknown_entry": "No s'ha pogut trobar l'entrada existent." }, diff --git a/homeassistant/components/hive/translations/hu.json b/homeassistant/components/hive/translations/hu.json index ce07abcb338..469b99debe1 100644 --- a/homeassistant/components/hive/translations/hu.json +++ b/homeassistant/components/hive/translations/hu.json @@ -17,7 +17,7 @@ "data": { "2fa": "K\u00e9tfaktoros k\u00f3d" }, - "description": "Add meg a Hive hiteles\u00edt\u00e9si k\u00f3dj\u00e1t. \n \n\u00cdrd be a 0000 k\u00f3dot m\u00e1sik k\u00f3d k\u00e9r\u00e9s\u00e9hez.", + "description": "Adja meg a Hive hiteles\u00edt\u00e9si k\u00f3dj\u00e1t. \n \n\u00cdrd be a 0000 k\u00f3dot m\u00e1sik k\u00f3d k\u00e9r\u00e9s\u00e9hez.", "title": "Hive k\u00e9tfaktoros hiteles\u00edt\u00e9s." }, "reauth": { @@ -25,7 +25,7 @@ "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "Add meg \u00fajra a Hive bejelentkez\u00e9si adatait.", + "description": "Adja meg \u00fajra a Hive bejelentkez\u00e9si adatait.", "title": "Hive Bejelentkez\u00e9s" }, "user": { @@ -34,7 +34,7 @@ "scan_interval": "Szkennel\u00e9si intervallum (m\u00e1sodperc)", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "Add meg a Hive bejelentkez\u00e9si adatait \u00e9s konfigur\u00e1ci\u00f3j\u00e1t.", + "description": "Adja meg a Hive bejelentkez\u00e9si adatait \u00e9s konfigur\u00e1ci\u00f3j\u00e1t.", "title": "Hive Bejelentkez\u00e9s" } } diff --git a/homeassistant/components/hlk_sw16/translations/hu.json b/homeassistant/components/hlk_sw16/translations/hu.json index 0abcc301f0c..9590d3c12be 100644 --- a/homeassistant/components/hlk_sw16/translations/hu.json +++ b/homeassistant/components/hlk_sw16/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" } diff --git a/homeassistant/components/home_connect/translations/hu.json b/homeassistant/components/home_connect/translations/hu.json index aa43f65b520..ca5f3e1e9ae 100644 --- a/homeassistant/components/home_connect/translations/hu.json +++ b/homeassistant/components/home_connect/translations/hu.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz." }, "create_entry": { diff --git a/homeassistant/components/home_plus_control/translations/ca.json b/homeassistant/components/home_plus_control/translations/ca.json index 90e23fcd7ab..6e6dc1e0577 100644 --- a/homeassistant/components/home_plus_control/translations/ca.json +++ b/homeassistant/components/home_plus_control/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "already_in_progress": "El flux de configuraci\u00f3 ja est\u00e0 en curs", "authorize_url_timeout": "Temps d'espera esgotat durant la generaci\u00f3 de l'URL d'autoritzaci\u00f3.", "missing_configuration": "El component no est\u00e0 configurat. Mira'n la documentaci\u00f3.", diff --git a/homeassistant/components/home_plus_control/translations/hu.json b/homeassistant/components/home_plus_control/translations/hu.json index 7bc04beb057..2dc22c7a729 100644 --- a/homeassistant/components/home_plus_control/translations/hu.json +++ b/homeassistant/components/home_plus_control/translations/hu.json @@ -2,9 +2,9 @@ "config": { "abort": { "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, diff --git a/homeassistant/components/homekit/translations/ca.json b/homeassistant/components/homekit/translations/ca.json index a71287d3c0b..63f34999a4d 100644 --- a/homeassistant/components/homekit/translations/ca.json +++ b/homeassistant/components/homekit/translations/ca.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { + "camera_audio": "C\u00e0meres que admeten \u00e0udio", "camera_copy": "C\u00e0meres que admeten fluxos H.264 natius" }, "description": "Comprova les c\u00e0meres que suporten fluxos nadius H.264. Si alguna c\u00e0mera not proporciona una sortida H.264, el sistema transcodificar\u00e0 el v\u00eddeo a H.264 per a HomeKit. La transcodificaci\u00f3 necessita una CPU potent i probablement no funcioni en ordinadors petits (SBC).", - "title": "Selecci\u00f3 del c\u00f2dec de v\u00eddeo de c\u00e0mera" + "title": "Configuraci\u00f3 de c\u00e0mera" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit/translations/de.json b/homeassistant/components/homekit/translations/de.json index 06027c4c09e..a0c407c454e 100644 --- a/homeassistant/components/homekit/translations/de.json +++ b/homeassistant/components/homekit/translations/de.json @@ -29,6 +29,7 @@ }, "cameras": { "data": { + "camera_audio": "Kameras, die Audio unterst\u00fctzen", "camera_copy": "Kameras, die native H.264-Streams unterst\u00fctzen" }, "description": "Pr\u00fcfe alle Kameras, die native H.264-Streams unterst\u00fctzen. Wenn die Kamera keinen H.264-Stream ausgibt, transkodiert das System das Video in H.264 f\u00fcr HomeKit. Die Transkodierung erfordert eine leistungsstarke CPU und wird wahrscheinlich nicht auf Einplatinencomputern funktionieren.", diff --git a/homeassistant/components/homekit/translations/el.json b/homeassistant/components/homekit/translations/el.json new file mode 100644 index 00000000000..58d7a62bc59 --- /dev/null +++ b/homeassistant/components/homekit/translations/el.json @@ -0,0 +1,11 @@ +{ + "options": { + "step": { + "advanced": { + "data": { + "devices": "\u03a3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ad\u03c2 (\u0395\u03bd\u03b1\u03cd\u03c3\u03bc\u03b1\u03c4\u03b1)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/homekit/translations/es.json b/homeassistant/components/homekit/translations/es.json index e713391eb9e..6008d399d64 100644 --- a/homeassistant/components/homekit/translations/es.json +++ b/homeassistant/components/homekit/translations/es.json @@ -5,7 +5,7 @@ }, "step": { "pairing": { - "description": "Tan pronto como la pasarela {name} est\u00e9 lista, la vinculaci\u00f3n estar\u00e1 disponible en \"Notificaciones\" como \"configuraci\u00f3n de pasarela Homekit\"", + "description": "Para completar el emparejamiento, sigue las instrucciones en \"Notificaciones\" en \"Emparejamiento HomeKit\".", "title": "Vincular pasarela Homekit" }, "user": { @@ -21,13 +21,15 @@ "step": { "advanced": { "data": { - "auto_start": "Arranque autom\u00e1tico (desactivado si se utiliza Z-Wave u otro sistema de arranque retardado)" + "auto_start": "Arranque autom\u00e1tico (desactivado si se utiliza Z-Wave u otro sistema de arranque retardado)", + "devices": "Dispositivos (disparadores)" }, "description": "Esta configuraci\u00f3n solo necesita ser ajustada si el puente HomeKit no es funcional.", "title": "Configuraci\u00f3n avanzada" }, "cameras": { "data": { + "camera_audio": "C\u00e1maras que admiten audio", "camera_copy": "C\u00e1maras compatibles con transmisiones H.264 nativas" }, "description": "Verifique todas las c\u00e1maras que admiten transmisiones H.264 nativas. Si la c\u00e1mara no emite una transmisi\u00f3n H.264, el sistema transcodificar\u00e1 el video a H.264 para HomeKit. La transcodificaci\u00f3n requiere una CPU de alto rendimiento y es poco probable que funcione en ordenadores de placa \u00fanica.", diff --git a/homeassistant/components/homekit/translations/et.json b/homeassistant/components/homekit/translations/et.json index 4e454178048..cd02425a2b6 100644 --- a/homeassistant/components/homekit/translations/et.json +++ b/homeassistant/components/homekit/translations/et.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { + "camera_audio": "Heliedastusega kaamerad", "camera_copy": "Kaamerad, mis toetavad riistvaralist H.264 voogu" }, "description": "Vali k\u00f5iki kaameraid, mis toetavad kohalikku H.264 voogu. Kui kaamera ei edasta H.264 voogu, kodeerib s\u00fcsteem video HomeKiti jaoks versioonile H.264. \u00dcmberkodeerimine n\u00f5uab j\u00f5udsat protsessorit ja t\u00f5en\u00e4oliselt ei t\u00f6\u00f6ta see \u00fcheplaadilistes arvutites.", - "title": "Vali kaamera videokoodek." + "title": "Kaamera s\u00e4tted" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit/translations/he.json b/homeassistant/components/homekit/translations/he.json index ee476b92b8c..320bf203044 100644 --- a/homeassistant/components/homekit/translations/he.json +++ b/homeassistant/components/homekit/translations/he.json @@ -15,6 +15,9 @@ "devices": "\u05d4\u05ea\u05e7\u05e0\u05d9\u05dd (\u05d8\u05e8\u05d9\u05d2\u05e8\u05d9\u05dd)" } }, + "cameras": { + "title": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05de\u05e6\u05dc\u05de\u05d4" + }, "include_exclude": { "data": { "mode": "\u05de\u05e6\u05d1" diff --git a/homeassistant/components/homekit/translations/hu.json b/homeassistant/components/homekit/translations/hu.json index f60db036247..046cf57e9b9 100644 --- a/homeassistant/components/homekit/translations/hu.json +++ b/homeassistant/components/homekit/translations/hu.json @@ -24,15 +24,16 @@ "auto_start": "Automatikus ind\u00edt\u00e1s (tiltsa le, ha manu\u00e1lisan h\u00edvja a homekit.start szolg\u00e1ltat\u00e1st)", "devices": "Eszk\u00f6z\u00f6k (triggerek)" }, - "description": "Ezeket a be\u00e1ll\u00edt\u00e1sokat csak akkor kell m\u00f3dos\u00edtani, ha a HomeKit nem m\u0171k\u00f6dik.", + "description": "Programozhat\u00f3 kapcsol\u00f3k j\u00f6nnek l\u00e9tre minden kiv\u00e1lasztott eszk\u00f6zh\u00f6z. Amikor egy eszk\u00f6z esem\u00e9nyt ind\u00edt el, a HomeKit be\u00e1ll\u00edthat\u00f3 \u00fagy, hogy egy automatizmus vagy egy jelenet induljon el.", "title": "Halad\u00f3 be\u00e1ll\u00edt\u00e1sok" }, "cameras": { "data": { - "camera_copy": "A nat\u00edv H.264 streameket t\u00e1mogat\u00f3 kamer\u00e1k" + "camera_audio": "Hangot t\u00e1mogat\u00f3 kamer\u00e1k", + "camera_copy": "Nat\u00edv H.264 streameket t\u00e1mogat\u00f3 kamer\u00e1k" }, "description": "Ellen\u0151rizze az \u00f6sszes kamer\u00e1t, amely t\u00e1mogatja a nat\u00edv H.264 adatfolyamokat. Ha a f\u00e9nyk\u00e9pez\u0151g\u00e9p nem ad ki H.264 adatfolyamot, a rendszer \u00e1tk\u00f3dolja a vide\u00f3t H.264 form\u00e1tumba a HomeKit sz\u00e1m\u00e1ra. Az \u00e1tk\u00f3dol\u00e1shoz nagy teljes\u00edtm\u00e9ny\u0171 CPU sz\u00fcks\u00e9ges, \u00e9s val\u00f3sz\u00edn\u0171leg nem fog m\u0171k\u00f6dni egylapos sz\u00e1m\u00edt\u00f3g\u00e9peken.", - "title": "V\u00e1laszd ki a kamera vide\u00f3 kodekj\u00e9t." + "title": "V\u00e1lassza ki a kamera vide\u00f3 kodekj\u00e9t." }, "include_exclude": { "data": { @@ -40,7 +41,7 @@ "mode": "M\u00f3d" }, "description": "V\u00e1lassza ki a felvenni k\u00edv\u00e1nt entit\u00e1sokat. Kieg\u00e9sz\u00edt\u0151 m\u00f3dban csak egyetlen entit\u00e1s szerepel. H\u00eddbefogad\u00e1si m\u00f3dban a tartom\u00e1ny \u00f6sszes entit\u00e1sa szerepelni fog, hacsak nincsenek kijel\u00f6lve konkr\u00e9t entit\u00e1sok. H\u00eddkiz\u00e1r\u00e1si m\u00f3dban a domain \u00f6sszes entit\u00e1sa szerepelni fog, kiv\u00e9ve a kiz\u00e1rt entit\u00e1sokat. A legjobb teljes\u00edtm\u00e9ny \u00e9rdek\u00e9ben minden TV m\u00e9dialej\u00e1tsz\u00f3hoz, tev\u00e9kenys\u00e9galap\u00fa t\u00e1vir\u00e1ny\u00edt\u00f3hoz, z\u00e1rhoz \u00e9s f\u00e9nyk\u00e9pez\u0151g\u00e9phez k\u00fcl\u00f6n HomeKit tartoz\u00e9kot hoznak l\u00e9tre.", - "title": "V\u00e1laszd ki a felvenni k\u00edv\u00e1nt entit\u00e1sokat" + "title": "V\u00e1lassza ki a felvenni k\u00edv\u00e1nt entit\u00e1sokat" }, "init": { "data": { @@ -48,7 +49,7 @@ "mode": "M\u00f3d" }, "description": "A HomeKit konfigur\u00e1lhat\u00f3 \u00fagy, hogy egy h\u00edd vagy egyetlen tartoz\u00e9k l\u00e1that\u00f3 legyen. Kieg\u00e9sz\u00edt\u0151 m\u00f3dban csak egyetlen entit\u00e1s haszn\u00e1lhat\u00f3. A tartoz\u00e9k m\u00f3dra van sz\u00fcks\u00e9g ahhoz, hogy a TV -eszk\u00f6zoszt\u00e1ly\u00fa m\u00e9dialej\u00e1tsz\u00f3k megfelel\u0151en m\u0171k\u00f6djenek. A \u201eTartalmazand\u00f3 tartom\u00e1nyok\u201d entit\u00e1sai szerepelni fognak a HomeKitben. A k\u00f6vetkez\u0151 k\u00e9perny\u0151n kiv\u00e1laszthatja, hogy mely entit\u00e1sokat k\u00edv\u00e1nja felvenni vagy kiz\u00e1rni a list\u00e1b\u00f3l.", - "title": "V\u00e1laszd ki a felvenni k\u00edv\u00e1nt domaineket." + "title": "V\u00e1lassza ki a felvenni k\u00edv\u00e1nt domaineket." }, "yaml": { "description": "Ez a bejegyz\u00e9s YAML-en kereszt\u00fcl vez\u00e9relhet\u0151", diff --git a/homeassistant/components/homekit/translations/id.json b/homeassistant/components/homekit/translations/id.json index ecb35196228..64ce23a5224 100644 --- a/homeassistant/components/homekit/translations/id.json +++ b/homeassistant/components/homekit/translations/id.json @@ -12,7 +12,7 @@ "data": { "include_domains": "Domain yang disertakan" }, - "description": "Pilih domain yang akan disertakan. Semua entitas yang didukung di domain akan disertakan. Instans HomeKit terpisah dalam mode aksesori akan dibuat untuk setiap pemutar media TV dan kamera.", + "description": "Pilih domain yang akan disertakan. Semua entitas yang didukung di domain akan disertakan. Instans HomeKit terpisah dalam mode aksesori akan dibuat untuk setiap pemutar media TV, remote berbasis aktivitas, kunci, dan kamera.", "title": "Pilih domain yang akan disertakan" } } @@ -23,7 +23,7 @@ "data": { "auto_start": "Mulai otomatis (nonaktifkan jika Anda memanggil layanan homekit.start secara manual)" }, - "description": "Pengaturan ini hanya perlu disesuaikan jika HomeKit tidak berfungsi.", + "description": "Sakelar yang dapat diprogram dibuat untuk setiap perangkat yang dipilih. Saat pemicu perangkat aktif, HomeKit dapat dikonfigurasi untuk menjalankan otomatisasi atau scene.", "title": "Konfigurasi Tingkat Lanjut" }, "cameras": { @@ -31,14 +31,14 @@ "camera_copy": "Kamera yang mendukung aliran H.264 asli" }, "description": "Periksa semua kamera yang mendukung streaming H.264 asli. Jika kamera tidak mengeluarkan aliran H.264, sistem akan mentranskode video ke H.264 untuk HomeKit. Proses transcoding membutuhkan CPU kinerja tinggi dan tidak mungkin bekerja pada komputer papan tunggal.", - "title": "Pilih codec video kamera." + "title": "Konfigurasi Kamera" }, "include_exclude": { "data": { "entities": "Entitas", "mode": "Mode" }, - "description": "Pilih entitas yang akan disertakan. Dalam mode aksesori, hanya satu entitas yang disertakan. Dalam mode \"bridge include\", semua entitas di domain akan disertakan, kecuali entitas tertentu dipilih. Dalam mode \"bridge exclude\", semua entitas di domain akan disertakan, kecuali untuk entitas tertentu yang dipilih. Untuk kinerja terbaik, aksesori HomeKit terpisah diperlukan untuk masing-masing pemutar media, TV, dan kamera.", + "description": "Pilih entitas yang akan disertakan. Dalam mode aksesori, hanya satu entitas yang disertakan. Dalam mode \"bridge include\", semua entitas di domain akan disertakan, kecuali entitas tertentu dipilih. Dalam mode \"bridge exclude\", semua entitas di domain akan disertakan, kecuali untuk entitas tertentu yang dipilih. Untuk kinerja terbaik, aksesori HomeKit terpisah diperlukan untuk masing-masing pemutar media TV, remote berbasis aktivitas, kunci, dan kamera.", "title": "Pilih entitas untuk disertakan" }, "init": { diff --git a/homeassistant/components/homekit/translations/it.json b/homeassistant/components/homekit/translations/it.json index 74bc0032580..8e7ead91ac1 100644 --- a/homeassistant/components/homekit/translations/it.json +++ b/homeassistant/components/homekit/translations/it.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { + "camera_audio": "Telecamere che supportano l'audio", "camera_copy": "Telecamere che supportano flussi H.264 nativi" }, "description": "Controllare tutte le telecamere che supportano i flussi H.264 nativi. Se la videocamera non emette uno stream H.264, il sistema provveder\u00e0 a transcodificare il video in H.264 per HomeKit. La transcodifica richiede una CPU performante ed \u00e8 improbabile che funzioni su computer a scheda singola.", - "title": "Seleziona il codec video della videocamera." + "title": "Configurazione della telecamera" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit/translations/nl.json b/homeassistant/components/homekit/translations/nl.json index e08364e038f..2ab21f66db5 100644 --- a/homeassistant/components/homekit/translations/nl.json +++ b/homeassistant/components/homekit/translations/nl.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { + "camera_audio": "Camera's die audio ondersteunen", "camera_copy": "Camera's die native H.264-streams ondersteunen" }, "description": "Controleer alle camera's die native H.264-streams ondersteunen. Als de camera geen H.264-stream uitvoert, transcodeert het systeem de video naar H.264 voor HomeKit. Transcodering vereist een performante CPU en het is onwaarschijnlijk dat dit werkt op computers met \u00e9\u00e9n bord.", - "title": "Selecteer de videocodec van de camera." + "title": "Cameraconfiguratie" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit/translations/no.json b/homeassistant/components/homekit/translations/no.json index 08df5bd72fa..86e5c8d95cb 100644 --- a/homeassistant/components/homekit/translations/no.json +++ b/homeassistant/components/homekit/translations/no.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { + "camera_audio": "Kameraer som st\u00f8tter lyd", "camera_copy": "Kameraer som st\u00f8tter opprinnelige H.264-str\u00f8mmer" }, "description": "Sjekk alle kameraer som st\u00f8tter opprinnelige H.264-str\u00f8mmer. Hvis kameraet ikke sender ut en H.264-str\u00f8m, vil systemet omkode videoen til H.264 for HomeKit. Transkoding krever en potent prosessor og er usannsynlig \u00e5 fungere p\u00e5 enkeltkortdatamaskiner som Raspberry Pi o.l.", - "title": "Velg videokodek for kamera." + "title": "Kamerakonfigurasjon" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit/translations/ru.json b/homeassistant/components/homekit/translations/ru.json index 670c5e8002f..f871636df00 100644 --- a/homeassistant/components/homekit/translations/ru.json +++ b/homeassistant/components/homekit/translations/ru.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { - "camera_copy": "\u041a\u0430\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a\u0438 H.264" + "camera_audio": "\u041a\u0430\u043c\u0435\u0440\u044b \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0430\u0443\u0434\u0438\u043e", + "camera_copy": "\u041a\u0430\u043c\u0435\u0440\u044b \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 H.264" }, "description": "\u0415\u0441\u043b\u0438 \u043a\u0430\u043c\u0435\u0440\u0430 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043a H.264, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0434\u0435\u043e \u0432 H.264 \u0434\u043b\u044f HomeKit. \u0422\u0440\u0430\u043d\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445.", - "title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u0434\u0435\u043a \u043a\u0430\u043c\u0435\u0440\u044b." + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u043c\u0435\u0440\u044b" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit/translations/zh-Hant.json b/homeassistant/components/homekit/translations/zh-Hant.json index a4a5ac06b96..ba1cd8adf88 100644 --- a/homeassistant/components/homekit/translations/zh-Hant.json +++ b/homeassistant/components/homekit/translations/zh-Hant.json @@ -29,10 +29,11 @@ }, "cameras": { "data": { + "camera_audio": "\u652f\u63f4\u97f3\u6548\u8f38\u51fa\u651d\u5f71\u6a5f", "camera_copy": "\u652f\u63f4\u539f\u751f H.264 \u4e32\u6d41\u651d\u5f71\u6a5f" }, "description": "\u6aa2\u67e5\u6240\u6709\u652f\u63f4\u539f\u751f H.264 \u4e32\u6d41\u4e4b\u651d\u5f71\u6a5f\u3002\u5047\u5982\u651d\u5f71\u6a5f\u4e0d\u652f\u63f4 H.264 \u4e32\u6d41\u3001\u7cfb\u7d71\u5c07\u6703\u91dd\u5c0d Homekit \u9032\u884c H.264 \u8f49\u78bc\u3002\u8f49\u78bc\u5c07\u9700\u8981\u4f7f\u7528 CPU \u9032\u884c\u904b\u7b97\u3001\u55ae\u6676\u7247\u96fb\u8166\u53ef\u80fd\u6703\u906d\u9047\u6548\u80fd\u554f\u984c\u3002", - "title": "\u9078\u64c7\u651d\u5f71\u6a5f\u7de8\u78bc\u3002" + "title": "\u651d\u5f71\u6a5f\u8a2d\u5b9a" }, "include_exclude": { "data": { diff --git a/homeassistant/components/homekit_controller/translations/hu.json b/homeassistant/components/homekit_controller/translations/hu.json index 1ad63bfb508..aef97c7b3ba 100644 --- a/homeassistant/components/homekit_controller/translations/hu.json +++ b/homeassistant/components/homekit_controller/translations/hu.json @@ -3,22 +3,22 @@ "abort": { "accessory_not_found_error": "Nem adhat\u00f3 hozz\u00e1 p\u00e1ros\u00edt\u00e1s, mert az eszk\u00f6z m\u00e1r nem tal\u00e1lhat\u00f3.", "already_configured": "A tartoz\u00e9k m\u00e1r konfigur\u00e1lva van ezzel a vez\u00e9rl\u0151vel.", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "already_paired": "Ez a tartoz\u00e9k m\u00e1r p\u00e1ros\u00edtva van egy m\u00e1sik eszk\u00f6zzel. \u00c1ll\u00edtsa alaphelyzetbe a tartoz\u00e9kot, majd pr\u00f3b\u00e1lkozzon \u00fajra.", "ignored_model": "A HomeKit t\u00e1mogat\u00e1sa e modelln\u00e9l blokkolva van, mivel a szolg\u00e1ltat\u00e1shoz teljes nat\u00edv integr\u00e1ci\u00f3 \u00e9rhet\u0151 el.", - "invalid_config_entry": "Ez az eszk\u00f6z k\u00e9szen \u00e1ll a p\u00e1ros\u00edt\u00e1sra, de m\u00e1r van egy \u00fctk\u00f6z\u0151 konfigur\u00e1ci\u00f3s bejegyz\u00e9s a Home Assistant-ben, amelyet el\u0151sz\u00f6r el kell t\u00e1vol\u00edtani.", + "invalid_config_entry": "Ez az eszk\u00f6z k\u00e9szen \u00e1ll a p\u00e1ros\u00edt\u00e1sra, de m\u00e1r van egy \u00fctk\u00f6z\u0151 konfigur\u00e1ci\u00f3s bejegyz\u00e9s Home Assistant-ben, amelyet el\u0151sz\u00f6r el kell t\u00e1vol\u00edtani.", "invalid_properties": "Az eszk\u00f6z \u00e1ltal bejelentett \u00e9rv\u00e9nytelen tulajdons\u00e1gok.", "no_devices": "Nem tal\u00e1lhat\u00f3 nem p\u00e1ros\u00edtott eszk\u00f6z" }, "error": { "authentication_error": "Helytelen HomeKit k\u00f3d. K\u00e9rj\u00fck, ellen\u0151rizze, \u00e9s pr\u00f3b\u00e1lja \u00fajra.", "insecure_setup_code": "A k\u00e9rt telep\u00edt\u00e9si k\u00f3d trivi\u00e1lis jellege miatt nem biztons\u00e1gos. Ez a tartoz\u00e9k nem felel meg az alapvet\u0151 biztons\u00e1gi k\u00f6vetelm\u00e9nyeknek.", - "max_peers_error": "Az eszk\u00f6z megtagadta a p\u00e1ros\u00edt\u00e1s hozz\u00e1ad\u00e1s\u00e1t, mivel nincs ingyenes p\u00e1ros\u00edt\u00e1si t\u00e1rhely.", + "max_peers_error": "Az eszk\u00f6z megtagadta a p\u00e1ros\u00edt\u00e1s hozz\u00e1ad\u00e1s\u00e1t, mivel nincs szabad p\u00e1ros\u00edt\u00e1si t\u00e1rhelye.", "pairing_failed": "Nem kezelt hiba t\u00f6rt\u00e9nt az eszk\u00f6zzel val\u00f3 p\u00e1ros\u00edt\u00e1s sor\u00e1n. Lehet, hogy ez \u00e1tmeneti hiba, vagy az eszk\u00f6z jelenleg m\u00e9g nem t\u00e1mogatott.", "unable_to_pair": "Nem siker\u00fclt p\u00e1ros\u00edtani, pr\u00f3b\u00e1ld \u00fajra.", "unknown_error": "Az eszk\u00f6z ismeretlen hib\u00e1t jelentett. A p\u00e1ros\u00edt\u00e1s sikertelen." }, - "flow_title": "HomeKit tartoz\u00e9k: {name}", + "flow_title": "{name}", "step": { "busy_error": { "description": "Sz\u00fcntesse meg a p\u00e1ros\u00edt\u00e1st az \u00f6sszes vez\u00e9rl\u0151n, vagy pr\u00f3b\u00e1lja \u00fajraind\u00edtani az eszk\u00f6zt, majd folytassa a p\u00e1ros\u00edt\u00e1st.", @@ -33,8 +33,8 @@ "allow_insecure_setup_codes": "P\u00e1ros\u00edt\u00e1s enged\u00e9lyez\u00e9se a nem biztons\u00e1gos be\u00e1ll\u00edt\u00e1si k\u00f3dokkal.", "pairing_code": "P\u00e1ros\u00edt\u00e1si k\u00f3d" }, - "description": "\u00cdrja be a HomeKit p\u00e1ros\u00edt\u00e1si k\u00f3dj\u00e1t (XXX-XX-XXX form\u00e1tumban) a kieg\u00e9sz\u00edt\u0151 haszn\u00e1lat\u00e1hoz", - "title": "HomeKit tartoz\u00e9k p\u00e1ros\u00edt\u00e1sa" + "description": "A HomeKit Controller {name} n\u00e9vvel kommunik\u00e1l a helyi h\u00e1l\u00f3zaton kereszt\u00fcl, biztons\u00e1gos titkos\u00edtott kapcsolaton kereszt\u00fcl, k\u00fcl\u00f6n HomeKit vez\u00e9rl\u0151 vagy iCloud n\u00e9lk\u00fcl. A tartoz\u00e9k haszn\u00e1lat\u00e1hoz adja meg HomeKit p\u00e1ros\u00edt\u00e1si k\u00f3dj\u00e1t (XXX-XX-XXX form\u00e1tumban). Ez a k\u00f3d \u00e1ltal\u00e1ban mag\u00e1ban az eszk\u00f6z\u00f6n vagy a csomagol\u00e1sban tal\u00e1lhat\u00f3.", + "title": "P\u00e1ros\u00edt\u00e1s egy eszk\u00f6zzel a HomeKit Accessory Protocol protokollon seg\u00edts\u00e9g\u00e9vel" }, "protocol_error": { "description": "El\u0151fordulhat, hogy a k\u00e9sz\u00fcl\u00e9k nincs p\u00e1ros\u00edt\u00e1si m\u00f3dban, \u00e9s sz\u00fcks\u00e9g lehet fizikai vagy virtu\u00e1lis gombnyom\u00e1sra. Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy az eszk\u00f6z p\u00e1ros\u00edt\u00e1si m\u00f3dban van, vagy pr\u00f3b\u00e1lja \u00fajraind\u00edtani az eszk\u00f6zt, majd folytassa a p\u00e1ros\u00edt\u00e1st.", @@ -44,7 +44,7 @@ "data": { "device": "Eszk\u00f6z" }, - "description": "V\u00e1lassza ki azt az eszk\u00f6zt, amelyet p\u00e1ros\u00edtani szeretne", + "description": "A HomeKit Controller biztons\u00e1gos titkos\u00edtott kapcsolaton kereszt\u00fcl kommunik\u00e1l a helyi h\u00e1l\u00f3zaton kereszt\u00fcl, k\u00fcl\u00f6n HomeKit vez\u00e9rl\u0151 vagy iCloud n\u00e9lk\u00fcl. V\u00e1lassza ki a p\u00e1ros\u00edtani k\u00edv\u00e1nt eszk\u00f6zt:", "title": "Eszk\u00f6z kiv\u00e1laszt\u00e1sa" } } diff --git a/homeassistant/components/homekit_controller/translations/id.json b/homeassistant/components/homekit_controller/translations/id.json index 49a37d3b3fb..839169fc6a9 100644 --- a/homeassistant/components/homekit_controller/translations/id.json +++ b/homeassistant/components/homekit_controller/translations/id.json @@ -17,7 +17,7 @@ "unable_to_pair": "Gagal memasangkan, coba lagi.", "unknown_error": "Perangkat melaporkan kesalahan yang tidak diketahui. Pemasangan gagal." }, - "flow_title": "{name} lewat HomeKit Accessory Protocol", + "flow_title": "{name}", "step": { "busy_error": { "description": "Batalkan pemasangan di semua pengontrol, atau coba mulai ulang perangkat, lalu lanjutkan untuk melanjutkan pemasangan.", diff --git a/homeassistant/components/homematicip_cloud/translations/fi.json b/homeassistant/components/homematicip_cloud/translations/fi.json index 9fcaacf4ba1..6a46955cddb 100644 --- a/homeassistant/components/homematicip_cloud/translations/fi.json +++ b/homeassistant/components/homematicip_cloud/translations/fi.json @@ -1,11 +1,20 @@ { "config": { "abort": { + "already_configured": "Laite on jo m\u00e4\u00e4ritetty", + "connection_aborted": "Yhdist\u00e4minen ep\u00e4onnistui", "unknown": "Tapahtui tuntematon virhe." }, "error": { "invalid_sgtin_or_pin": "Virheellinen PIN-koodi, yrit\u00e4 uudelleen.", "press_the_button": "Paina sinist\u00e4 painiketta." + }, + "step": { + "init": { + "data": { + "pin": "PIN-koodi" + } + } } } } \ No newline at end of file diff --git a/homeassistant/components/homematicip_cloud/translations/hu.json b/homeassistant/components/homematicip_cloud/translations/hu.json index 90fee286a3a..2915d442a37 100644 --- a/homeassistant/components/homematicip_cloud/translations/hu.json +++ b/homeassistant/components/homematicip_cloud/translations/hu.json @@ -18,7 +18,7 @@ "name": "N\u00e9v (opcion\u00e1lis, minden eszk\u00f6z n\u00e9vel\u0151tagjak\u00e9nt haszn\u00e1latos)", "pin": "PIN-k\u00f3d" }, - "title": "V\u00e1lassz HomematicIP hozz\u00e1f\u00e9r\u00e9si pontot" + "title": "V\u00e1lasszon HomematicIP hozz\u00e1f\u00e9r\u00e9si pontot" }, "link": { "description": "A HomematicIP regisztr\u00e1l\u00e1s\u00e1hoz a Home Assistant alkalmaz\u00e1sban nyomja meg a hozz\u00e1f\u00e9r\u00e9si pont k\u00e9k gombj\u00e1t \u00e9s a bek\u00fcld\u00e9s gombot. \n\n ! [A gomb helye a h\u00eddon] (/ static / images / config_flows / config_homematicip_cloud.png)", diff --git a/homeassistant/components/honeywell/translations/es.json b/homeassistant/components/honeywell/translations/es.json index 70549039a04..9f6c562e888 100644 --- a/homeassistant/components/honeywell/translations/es.json +++ b/homeassistant/components/honeywell/translations/es.json @@ -1,9 +1,13 @@ { "config": { + "error": { + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida" + }, "step": { "user": { "data": { - "password": "Contrase\u00f1a" + "password": "Contrase\u00f1a", + "username": "Usuario" }, "description": "Por favor, introduzca las credenciales utilizadas para iniciar sesi\u00f3n en mytotalconnectcomfort.com.", "title": "Honeywell Total Connect Comfort (US)" diff --git a/homeassistant/components/honeywell/translations/id.json b/homeassistant/components/honeywell/translations/id.json new file mode 100644 index 00000000000..ee1540cc787 --- /dev/null +++ b/homeassistant/components/honeywell/translations/id.json @@ -0,0 +1,15 @@ +{ + "config": { + "error": { + "invalid_auth": "Autentikasi tidak valid" + }, + "step": { + "user": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/translations/hu.json b/homeassistant/components/huawei_lte/translations/hu.json index 22bd37c37ba..91f70a17e46 100644 --- a/homeassistant/components/huawei_lte/translations/hu.json +++ b/homeassistant/components/huawei_lte/translations/hu.json @@ -2,11 +2,11 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "not_huawei_lte": "Nem Huawei LTE eszk\u00f6z" }, "error": { - "connection_timeout": "Kapcsolat id\u0151t\u00fall\u00e9p\u00e9se", + "connection_timeout": "Kapcsolat id\u0151t\u00fall\u00e9p\u00e9s", "incorrect_password": "Hib\u00e1s jelsz\u00f3", "incorrect_username": "Helytelen felhaszn\u00e1l\u00f3n\u00e9v", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", diff --git a/homeassistant/components/huawei_lte/translations/id.json b/homeassistant/components/huawei_lte/translations/id.json index 2077b31ccd7..de784fd3e94 100644 --- a/homeassistant/components/huawei_lte/translations/id.json +++ b/homeassistant/components/huawei_lte/translations/id.json @@ -15,7 +15,7 @@ "response_error": "Kesalahan tidak dikenal dari perangkat", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Huawei LTE: {name}", + "flow_title": "{name}", "step": { "user": { "data": { @@ -23,7 +23,7 @@ "url": "URL", "username": "Nama Pengguna" }, - "description": "Masukkan detail akses perangkat. Menentukan nama pengguna dan kata sandi bersifat opsional, tetapi memungkinkan dukungan untuk fitur integrasi lainnya. Selain itu, penggunaan koneksi resmi dapat menyebabkan masalah mengakses antarmuka web perangkat dari luar Home Assistant saat integrasi aktif, dan sebaliknya.", + "description": "Masukkan detail akses perangkat.", "title": "Konfigurasikan Huawei LTE" } } diff --git a/homeassistant/components/hue/translations/hu.json b/homeassistant/components/hue/translations/hu.json index 30084ee9940..2f04c53163f 100644 --- a/homeassistant/components/hue/translations/hu.json +++ b/homeassistant/components/hue/translations/hu.json @@ -3,10 +3,10 @@ "abort": { "all_configured": "M\u00e1r minden Philips Hue bridge konfigur\u00e1lt", "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", - "discover_timeout": "Nem tal\u00e1ltam a Hue bridget", - "no_bridges": "Nem tal\u00e1ltam Philips Hue bridget", + "discover_timeout": "Nem tal\u00e1lhat\u00f3 a Hue bridge", + "no_bridges": "Nem tal\u00e1lhat\u00f3 Philips Hue bridget", "not_hue_bridge": "Nem egy Hue Bridge", "unknown": "Ismeretlen hiba t\u00f6rt\u00e9nt" }, @@ -17,9 +17,9 @@ "step": { "init": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "title": "V\u00e1lassz Hue bridge-t" + "title": "V\u00e1lasszon Hue bridge-t" }, "link": { "description": "Nyomja meg a gombot a bridge-en a Philips Hue Home Assistant-ben val\u00f3 regisztr\u00e1l\u00e1s\u00e1hoz.\n\n![Location of button on bridge](/static/images/config_philips_hue.jpg)", @@ -27,7 +27,7 @@ }, "manual": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "title": "A Hue bridge manu\u00e1lis konfigur\u00e1l\u00e1sa" } diff --git a/homeassistant/components/hunterdouglas_powerview/translations/hu.json b/homeassistant/components/hunterdouglas_powerview/translations/hu.json index 1fedd8bc126..e6afd8a1dc4 100644 --- a/homeassistant/components/hunterdouglas_powerview/translations/hu.json +++ b/homeassistant/components/hunterdouglas_powerview/translations/hu.json @@ -10,7 +10,7 @@ "flow_title": "{name} ({host})", "step": { "link": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}({host})-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name} ({host})?", "title": "Csatlakozzon a PowerView Hubhoz" }, "user": { diff --git a/homeassistant/components/hvv_departures/translations/hu.json b/homeassistant/components/hvv_departures/translations/hu.json index dfbdd92f27a..41113527ecb 100644 --- a/homeassistant/components/hvv_departures/translations/hu.json +++ b/homeassistant/components/hvv_departures/translations/hu.json @@ -23,7 +23,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, diff --git a/homeassistant/components/hyperion/translations/hu.json b/homeassistant/components/hyperion/translations/hu.json index 852c108c0e9..3fa440c41d5 100644 --- a/homeassistant/components/hyperion/translations/hu.json +++ b/homeassistant/components/hyperion/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "A szolg\u00e1ltat\u00e1s m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "auth_new_token_not_granted_error": "Az \u00fajonnan l\u00e9trehozott tokent nem hagyt\u00e1k j\u00f3v\u00e1 a Hyperion felhaszn\u00e1l\u00f3i fel\u00fclet\u00e9n", "auth_new_token_not_work_error": "Nem siker\u00fclt hiteles\u00edteni az \u00fajonnan l\u00e9trehozott token haszn\u00e1lat\u00e1val", "auth_required_error": "Nem siker\u00fclt meghat\u00e1rozni, hogy sz\u00fcks\u00e9ges-e enged\u00e9ly", @@ -23,11 +23,11 @@ "description": "Konfigur\u00e1lja a jogosults\u00e1got a Hyperion Ambilight kiszolg\u00e1l\u00f3hoz" }, "confirm": { - "description": "Hozz\u00e1 szeretn\u00e9 adni ezt a Hyperion Ambilight-ot az Otthoni asszisztenshez? \n\n ** Host: ** {host}\n ** Port: ** {port}\n ** azonos\u00edt\u00f3 **: {id}", + "description": "Hozz\u00e1 szeretn\u00e9 adni ezt a Hyperion Ambilight-ot az Otthoni asszisztenshez? \n\n ** C\u00edm: ** {host}\n ** Port: ** {port}\n ** Azonos\u00edt\u00f3 **: {id}", "title": "Er\u0151s\u00edtse meg a Hyperion Ambilight szolg\u00e1ltat\u00e1s hozz\u00e1ad\u00e1s\u00e1t" }, "create_token": { - "description": "Az al\u00e1bbiakban v\u00e1lassza a ** K\u00fcld\u00e9s ** lehet\u0151s\u00e9get \u00faj hiteles\u00edt\u00e9si token k\u00e9r\u00e9s\u00e9hez. A k\u00e9relem j\u00f3v\u00e1hagy\u00e1s\u00e1hoz \u00e1tir\u00e1ny\u00edtunk a Hyperion felhaszn\u00e1l\u00f3i fel\u00fcletre. K\u00e9rj\u00fck, ellen\u0151rizze, hogy a megjelen\u00edtett azonos\u00edt\u00f3 \" {auth_id} \"", + "description": "Az al\u00e1bbiakban v\u00e1lassza a **K\u00fcld\u00e9s** lehet\u0151s\u00e9get \u00faj hiteles\u00edt\u00e9si token k\u00e9r\u00e9s\u00e9hez. A k\u00e9relem j\u00f3v\u00e1hagy\u00e1s\u00e1hoz \u00e1tir\u00e1ny\u00edtunk a Hyperion felhaszn\u00e1l\u00f3i fel\u00fcletre. K\u00e9rj\u00fck, ellen\u0151rizze, hogy a megjelen\u00edtett azonos\u00edt\u00f3 \"{auth_id}\"", "title": "\u00daj hiteles\u00edt\u00e9si token automatikus l\u00e9trehoz\u00e1sa" }, "create_token_external": { @@ -35,7 +35,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" } } diff --git a/homeassistant/components/ialarm/translations/hu.json b/homeassistant/components/ialarm/translations/hu.json index e69c6e7e7ea..a98836bb7b7 100644 --- a/homeassistant/components/ialarm/translations/hu.json +++ b/homeassistant/components/ialarm/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "port": "Port" } } diff --git a/homeassistant/components/iaqualink/translations/hu.json b/homeassistant/components/iaqualink/translations/hu.json index 1ca85c41190..2b0b9ac3e67 100644 --- a/homeassistant/components/iaqualink/translations/hu.json +++ b/homeassistant/components/iaqualink/translations/hu.json @@ -12,7 +12,7 @@ "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "K\u00e9rj\u00fck, adja meg iAqualink-fi\u00f3kja felhaszn\u00e1l\u00f3nev\u00e9t \u00e9s jelszav\u00e1t.", + "description": "K\u00e9rj\u00fck, adja meg iAqualink-fi\u00f3kj\u00e1nak felhaszn\u00e1l\u00f3nev\u00e9t \u00e9s jelszav\u00e1t.", "title": "Csatlakoz\u00e1s az iAqualinkhez" } } diff --git a/homeassistant/components/icloud/translations/ca.json b/homeassistant/components/icloud/translations/ca.json index 6e92897161a..0ffdf5bc0c1 100644 --- a/homeassistant/components/icloud/translations/ca.json +++ b/homeassistant/components/icloud/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "no_device": "Cap dels teus dispositius t\u00e9 activada la opci\u00f3 \"Troba el meu iPhone\"", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, diff --git a/homeassistant/components/icloud/translations/hu.json b/homeassistant/components/icloud/translations/hu.json index 722b3711e67..e858eedb757 100644 --- a/homeassistant/components/icloud/translations/hu.json +++ b/homeassistant/components/icloud/translations/hu.json @@ -8,7 +8,7 @@ "error": { "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", "send_verification_code": "Nem siker\u00fclt elk\u00fcldeni az ellen\u0151rz\u0151 k\u00f3dot", - "validate_verification_code": "Nem siker\u00fclt ellen\u0151rizni az ellen\u0151rz\u0151 k\u00f3dot, ki kell v\u00e1lasztania egy megb\u00edzhat\u00f3s\u00e1gi eszk\u00f6zt, \u00e9s \u00fajra kell ind\u00edtania az ellen\u0151rz\u00e9st" + "validate_verification_code": "Nem siker\u00fclt hiteles\u00edteni az ellen\u0151rz\u0151 k\u00f3dot, k\u00e9rem, pr\u00f3b\u00e1lja meg \u00fajra" }, "step": { "reauth": { diff --git a/homeassistant/components/ifttt/translations/hu.json b/homeassistant/components/ifttt/translations/hu.json index 9898beb3e92..2f64056e985 100644 --- a/homeassistant/components/ifttt/translations/hu.json +++ b/homeassistant/components/ifttt/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { - "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, akkor az [IFTTT Webhook applet]({applet_url}) \"Make a web request\" m\u0171velet\u00e9t kell haszn\u00e1lnia. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/json \n\n L\u00e1sd [a dokument\u00e1ci\u00f3]({docs_url}), hogyan konfigur\u00e1lhatja az automatiz\u00e1l\u00e1sokat a bej\u00f6v\u0151 adatok kezel\u00e9s\u00e9re." + "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, akkor az [IFTTT Webhook applet]({applet_url}) \"Make a web request\" m\u0171velet\u00e9t kell haszn\u00e1lnia. \n\nT\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/json \n\nL\u00e1sd [a dokument\u00e1ci\u00f3]({docs_url}), hogyan konfigur\u00e1lhatja az automatizmusokat a bej\u00f6v\u0151 adatok kezel\u00e9s\u00e9re." }, "step": { "user": { - "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani az IFTTT-t?", + "description": "Biztos benne, hogy be szeretn\u00e9 \u00e1ll\u00edtani az IFTTT-t?", "title": "IFTTT Webhook Applet be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/insteon/translations/ca.json b/homeassistant/components/insteon/translations/ca.json index 63601dd8071..59c711c3dae 100644 --- a/homeassistant/components/insteon/translations/ca.json +++ b/homeassistant/components/insteon/translations/ca.json @@ -29,7 +29,7 @@ }, "plm": { "data": { - "device": "Ruta del port USB del dispositiu" + "device": "Ruta del dispositiu USB" }, "description": "Configura el m\u00f2dem Insteon PowerLink (PLM).", "title": "Insteon PLM" diff --git a/homeassistant/components/insteon/translations/hu.json b/homeassistant/components/insteon/translations/hu.json index 8444aa97655..f34307a67a4 100644 --- a/homeassistant/components/insteon/translations/hu.json +++ b/homeassistant/components/insteon/translations/hu.json @@ -6,7 +6,7 @@ }, "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", - "select_single": "V\u00e1lassz egy lehet\u0151s\u00e9get" + "select_single": "V\u00e1lasszon egy lehet\u0151s\u00e9get" }, "step": { "hubv1": { @@ -25,7 +25,7 @@ "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, "description": "Konfigur\u00e1lja az Insteon Hub 2. verzi\u00f3j\u00e1t.", - "title": "Insteon Hub 2. verzi\u00f3" + "title": "Insteon Hub Version 2" }, "plm": { "data": { @@ -38,7 +38,7 @@ "data": { "modem_type": "Modem t\u00edpusa." }, - "description": "V\u00e1laszd ki az Insteon modem t\u00edpus\u00e1t.", + "description": "V\u00e1lassza ki az Insteon modem t\u00edpus\u00e1t.", "title": "Insteon" } } @@ -47,14 +47,14 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", "input_error": "\u00c9rv\u00e9nytelen bejegyz\u00e9sek, ellen\u0151rizze \u00e9rt\u00e9keket.", - "select_single": "V\u00e1lassz egy lehet\u0151s\u00e9get" + "select_single": "V\u00e1lasszon egy lehet\u0151s\u00e9get" }, "step": { "add_override": { "data": { - "address": "Eszk\u00f6z c\u00edme (azaz 1a2b3c)", - "cat": "Eszk\u00f6zkateg\u00f3ria (azaz 0x10)", - "subcat": "Eszk\u00f6z alkateg\u00f3ria (azaz 0x0a)" + "address": "Eszk\u00f6z c\u00edme (pl. 1a2b3c)", + "cat": "Eszk\u00f6zkateg\u00f3ria (pl. 0x10)", + "subcat": "Eszk\u00f6z alkateg\u00f3ria (pl. 0x0a)" }, "description": "Eszk\u00f6z-fel\u00fclb\u00edr\u00e1l\u00e1s hozz\u00e1ad\u00e1sa.", "title": "Insteon" diff --git a/homeassistant/components/ios/translations/hu.json b/homeassistant/components/ios/translations/hu.json index dda7af8c541..06a80cc8c5e 100644 --- a/homeassistant/components/ios/translations/hu.json +++ b/homeassistant/components/ios/translations/hu.json @@ -5,7 +5,7 @@ }, "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } } diff --git a/homeassistant/components/ios/translations/nl.json b/homeassistant/components/ios/translations/nl.json index 78757f9f715..1e660ec2f5d 100644 --- a/homeassistant/components/ios/translations/nl.json +++ b/homeassistant/components/ios/translations/nl.json @@ -5,7 +5,7 @@ }, "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } } diff --git a/homeassistant/components/iotawatt/translations/el.json b/homeassistant/components/iotawatt/translations/el.json index 0030674e3ca..44996764873 100644 --- a/homeassistant/components/iotawatt/translations/el.json +++ b/homeassistant/components/iotawatt/translations/el.json @@ -9,7 +9,8 @@ "data": { "password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2", "username": "\u038c\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7" - } + }, + "description": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae IoTawatt \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2. \u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03ba\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae." } } } diff --git a/homeassistant/components/iotawatt/translations/es.json b/homeassistant/components/iotawatt/translations/es.json index 07540d160bb..00c04d7771f 100644 --- a/homeassistant/components/iotawatt/translations/es.json +++ b/homeassistant/components/iotawatt/translations/es.json @@ -10,7 +10,8 @@ "data": { "password": "Contrase\u00f1a", "username": "Nombre de usuario" - } + }, + "description": "El dispositivo IoTawatt requiere autenticaci\u00f3n. Introduce el nombre de usuario y la contrase\u00f1a y haz clic en el bot\u00f3n Enviar." }, "user": { "data": { diff --git a/homeassistant/components/iotawatt/translations/hu.json b/homeassistant/components/iotawatt/translations/hu.json index 1c545b3d3ce..52d46f97a84 100644 --- a/homeassistant/components/iotawatt/translations/hu.json +++ b/homeassistant/components/iotawatt/translations/hu.json @@ -15,7 +15,7 @@ }, "user": { "data": { - "host": "Gazdag\u00e9p" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/iotawatt/translations/id.json b/homeassistant/components/iotawatt/translations/id.json new file mode 100644 index 00000000000..a48af7cd34d --- /dev/null +++ b/homeassistant/components/iotawatt/translations/id.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "auth": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/iotawatt/translations/nl.json b/homeassistant/components/iotawatt/translations/nl.json index 3d1e6d3ef17..617073e91c0 100644 --- a/homeassistant/components/iotawatt/translations/nl.json +++ b/homeassistant/components/iotawatt/translations/nl.json @@ -1,7 +1,16 @@ { "config": { + "error": { + "cannot_connect": "Kon niet verbinden", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, "step": { "auth": { + "data": { + "password": "Wachtwoord", + "username": "Gebruikersnaam" + }, "description": "Het IoTawatt-apparaat vereist authenticatie. Voer de gebruikersnaam en het wachtwoord in en klik op de knop Verzenden." }, "user": { diff --git a/homeassistant/components/ipp/translations/hu.json b/homeassistant/components/ipp/translations/hu.json index a024cfb2e56..18381fde2cf 100644 --- a/homeassistant/components/ipp/translations/hu.json +++ b/homeassistant/components/ipp/translations/hu.json @@ -13,21 +13,21 @@ "cannot_connect": "Sikertelen csatlakoz\u00e1s", "connection_upgrade": "Nem siker\u00fclt csatlakozni a nyomtat\u00f3hoz. K\u00e9rj\u00fck, pr\u00f3b\u00e1lja meg \u00fajra az SSL/TLS opci\u00f3 bejel\u00f6l\u00e9s\u00e9vel." }, - "flow_title": "Nyomtat\u00f3: {name}", + "flow_title": "{name}", "step": { "user": { "data": { "base_path": "Relat\u00edv \u00fatvonal a nyomtat\u00f3hoz", - "host": "Hoszt", + "host": "C\u00edm", "port": "Port", "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata", "verify_ssl": "SSL-tan\u00fas\u00edtv\u00e1ny ellen\u0151rz\u00e9se" }, - "description": "\u00c1ll\u00edtsa be a nyomtat\u00f3t az Internet Printing Protocol (IPP) protokollon kereszt\u00fcl, hogy integr\u00e1lhat\u00f3 legyen a Home Assistant seg\u00edts\u00e9g\u00e9vel.", + "description": "\u00c1ll\u00edtsa be a nyomtat\u00f3t az Internet Printing Protocol (IPP) protokollon kereszt\u00fcl, hogy integr\u00e1lhat\u00f3 legyen Home Assistant seg\u00edts\u00e9g\u00e9vel.", "title": "Kapcsolja \u00f6ssze a nyomtat\u00f3t" }, "zeroconf_confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}?", "title": "Felfedezett nyomtat\u00f3" } } diff --git a/homeassistant/components/ipp/translations/id.json b/homeassistant/components/ipp/translations/id.json index c2b95751d4b..f65b853d671 100644 --- a/homeassistant/components/ipp/translations/id.json +++ b/homeassistant/components/ipp/translations/id.json @@ -13,7 +13,7 @@ "cannot_connect": "Gagal terhubung", "connection_upgrade": "Gagal terhubung ke printer. Coba lagi dengan mencentang opsi SSL/TLS." }, - "flow_title": "Printer: {name}", + "flow_title": "{name}", "step": { "user": { "data": { diff --git a/homeassistant/components/isy994/translations/es.json b/homeassistant/components/isy994/translations/es.json index 46dc3260f83..324b94e9938 100644 --- a/homeassistant/components/isy994/translations/es.json +++ b/homeassistant/components/isy994/translations/es.json @@ -9,7 +9,7 @@ "invalid_host": "La entrada del host no estaba en formato URL completo, por ejemplo, http://192.168.10.100:80", "unknown": "Error inesperado" }, - "flow_title": "Dispositivos Universales ISY994 {nombre} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/isy994/translations/hu.json b/homeassistant/components/isy994/translations/hu.json index dab85300e6d..d9cce2fefcb 100644 --- a/homeassistant/components/isy994/translations/hu.json +++ b/homeassistant/components/isy994/translations/hu.json @@ -6,7 +6,7 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", - "invalid_host": "A gazdag\u00e9p bejegyz\u00e9se nem volt teljes URL-form\u00e1tumban, p\u00e9ld\u00e1ul: http://192.168.10.100:80", + "invalid_host": "A c\u00edm bejegyz\u00e9se nem volt teljes URL-form\u00e1tumban, p\u00e9ld\u00e1ul: http://192.168.10.100:80", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, "flow_title": "{name} ({host})", @@ -18,7 +18,7 @@ "tls": "Az ISY vez\u00e9rl\u0151 TLS verzi\u00f3ja.", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "A gazdag\u00e9p bejegyz\u00e9s\u00e9nek teljes URL form\u00e1tumban kell lennie, pl. Http://192.168.10.100:80", + "description": "A c\u00edm bejegyz\u00e9s\u00e9nek teljes URL form\u00e1tumban kell lennie, pl. Http://192.168.10.100:80", "title": "Csatlakozzon az ISY994-hez" } } @@ -40,7 +40,7 @@ "system_health": { "info": { "device_connected": "ISY csatlakozik", - "host_reachable": "El\u00e9rhet\u0151 gazdag\u00e9p", + "host_reachable": "C\u00edm el\u00e9rhet\u0151", "last_heartbeat": "Utols\u00f3 sz\u00edvver\u00e9s ideje", "websocket_status": "Esem\u00e9nySocket \u00e1llapota" } diff --git a/homeassistant/components/isy994/translations/id.json b/homeassistant/components/isy994/translations/id.json index fec6d1090b0..099e3607d1e 100644 --- a/homeassistant/components/isy994/translations/id.json +++ b/homeassistant/components/isy994/translations/id.json @@ -9,7 +9,7 @@ "invalid_host": "Entri host tidak dalam format URL lengkap, misalnya, http://192.168.10.100:80", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Universal Devices ISY994 {name} ({host})", + "flow_title": "{name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/juicenet/translations/ca.json b/homeassistant/components/juicenet/translations/ca.json index f5df6921062..01a3a0bcae4 100644 --- a/homeassistant/components/juicenet/translations/ca.json +++ b/homeassistant/components/juicenet/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3", diff --git a/homeassistant/components/keenetic_ndms2/translations/ca.json b/homeassistant/components/keenetic_ndms2/translations/ca.json index 0acb0ef0266..748a55885e4 100644 --- a/homeassistant/components/keenetic_ndms2/translations/ca.json +++ b/homeassistant/components/keenetic_ndms2/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "no_udn": "La informaci\u00f3 de descobriment SSDP no t\u00e9 UDN", "not_keenetic_ndms2": "El dispositiu descobert no \u00e9s un router Keenetic" }, diff --git a/homeassistant/components/keenetic_ndms2/translations/hu.json b/homeassistant/components/keenetic_ndms2/translations/hu.json index c2327130a11..2575d832863 100644 --- a/homeassistant/components/keenetic_ndms2/translations/hu.json +++ b/homeassistant/components/keenetic_ndms2/translations/hu.json @@ -12,7 +12,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" diff --git a/homeassistant/components/keenetic_ndms2/translations/id.json b/homeassistant/components/keenetic_ndms2/translations/id.json index bb30e715579..900745bc29e 100644 --- a/homeassistant/components/keenetic_ndms2/translations/id.json +++ b/homeassistant/components/keenetic_ndms2/translations/id.json @@ -6,6 +6,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, + "flow_title": "{name} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/keenetic_ndms2/translations/ru.json b/homeassistant/components/keenetic_ndms2/translations/ru.json index 3c7eed4be01..810c2bfff05 100644 --- a/homeassistant/components/keenetic_ndms2/translations/ru.json +++ b/homeassistant/components/keenetic_ndms2/translations/ru.json @@ -25,7 +25,7 @@ "step": { "user": { "data": { - "consider_home": "\u0412\u0440\u0435\u043c\u044f \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0441\u0435\u043a.), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \"\u041d\u0435 \u0434\u043e\u043c\u0430\"", + "consider_home": "\u0412\u0440\u0435\u043c\u044f, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u043c\u0430 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)", "include_arp": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 ARP (\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430)", "include_associated": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u0435\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u0430 WiFi (\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 hotspot)", "interfaces": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f", diff --git a/homeassistant/components/kmtronic/translations/hu.json b/homeassistant/components/kmtronic/translations/hu.json index 4fe9a3875e6..3ea79e3bd89 100644 --- a/homeassistant/components/kmtronic/translations/hu.json +++ b/homeassistant/components/kmtronic/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" } diff --git a/homeassistant/components/kodi/translations/hu.json b/homeassistant/components/kodi/translations/hu.json index 9ae1e0741d5..017d33010ac 100644 --- a/homeassistant/components/kodi/translations/hu.json +++ b/homeassistant/components/kodi/translations/hu.json @@ -19,15 +19,15 @@ "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "Add meg a Kodi felhaszn\u00e1l\u00f3nevet \u00e9s jelsz\u00f3t. Ezek megtal\u00e1lhat\u00f3k a Rendszer/Be\u00e1ll\u00edt\u00e1sok/H\u00e1l\u00f3zat/Szolg\u00e1ltat\u00e1sok r\u00e9szben." + "description": "Adja meg a Kodi felhaszn\u00e1l\u00f3nevet \u00e9s jelsz\u00f3t. Ezek megtal\u00e1lhat\u00f3k a Rendszer/Be\u00e1ll\u00edt\u00e1sok/H\u00e1l\u00f3zat/Szolg\u00e1ltat\u00e1sok r\u00e9szben." }, "discovery_confirm": { - "description": "Szeretn\u00e9d hozz\u00e1adni a Kodi (`{name}`)-t a Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni a Kodi (`{name}`)-t Home Assistant-hoz?", "title": "Felfedezett Kodi" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port", "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata" }, diff --git a/homeassistant/components/kodi/translations/id.json b/homeassistant/components/kodi/translations/id.json index 1a81ab72fab..16ce1e2c43b 100644 --- a/homeassistant/components/kodi/translations/id.json +++ b/homeassistant/components/kodi/translations/id.json @@ -12,7 +12,7 @@ "invalid_auth": "Autentikasi tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Kodi: {name}", + "flow_title": "{name}", "step": { "credentials": { "data": { diff --git a/homeassistant/components/konnected/translations/hu.json b/homeassistant/components/konnected/translations/hu.json index 1ad58223b88..f5431480ebb 100644 --- a/homeassistant/components/konnected/translations/hu.json +++ b/homeassistant/components/konnected/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "not_konn_panel": "Nem felismert Konnected.io eszk\u00f6z", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, @@ -11,7 +11,7 @@ }, "step": { "confirm": { - "description": "Modell: {model}\nAzonos\u00edt\u00f3: {id}\nGazdag\u00e9p: {host}\nPort: {port} \n\n Az IO \u00e9s a panel viselked\u00e9s\u00e9t a Konnected Alarm Panel be\u00e1ll\u00edt\u00e1saiban konfigur\u00e1lhatja.", + "description": "Modell: {model}\nAzonos\u00edt\u00f3: {id}\nC\u00edm: {host}\nPort: {port} \n\nAz IO \u00e9s a panel viselked\u00e9s\u00e9t a Konnected Alarm Panel be\u00e1ll\u00edt\u00e1saiban konfigur\u00e1lhatja.", "title": "Konnected eszk\u00f6z k\u00e9sz" }, "import_confirm": { @@ -23,7 +23,7 @@ "host": "IP c\u00edm", "port": "Port" }, - "description": "K\u00e9rj\u00fck, adja meg a Konnected Panel gazdag\u00e9p\u00e9nek adatait." + "description": "K\u00e9rj\u00fck, adja meg a Konnected Panel csatlakoz\u00e1si adatait." } } }, diff --git a/homeassistant/components/konnected/translations/id.json b/homeassistant/components/konnected/translations/id.json index 633e6bba2df..b80b86c25c9 100644 --- a/homeassistant/components/konnected/translations/id.json +++ b/homeassistant/components/konnected/translations/id.json @@ -78,7 +78,7 @@ "alarm2_out2": "OUT2/ALARM2", "out1": "OUT1" }, - "description": "Pilih konfigurasi I/O lainnya di bawah ini. Anda dapat mengonfigurasi detail opsi pada langkah berikutnya.", + "description": "Pilih konfigurasi I/O lainnya di bawah ini. Anda dapat mengonfigurasi detail opsi pada langkah berikutnya.", "title": "Konfigurasikan I/O yang Diperluas" }, "options_misc": { diff --git a/homeassistant/components/kostal_plenticore/translations/hu.json b/homeassistant/components/kostal_plenticore/translations/hu.json index b235578e9c3..3ffe413a82b 100644 --- a/homeassistant/components/kostal_plenticore/translations/hu.json +++ b/homeassistant/components/kostal_plenticore/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "password": "Jelsz\u00f3" } } diff --git a/homeassistant/components/kraken/translations/es.json b/homeassistant/components/kraken/translations/es.json index 1befa14a52b..86df8397c15 100644 --- a/homeassistant/components/kraken/translations/es.json +++ b/homeassistant/components/kraken/translations/es.json @@ -1,11 +1,15 @@ { "config": { + "abort": { + "already_configured": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n." + }, "step": { "user": { "data": { "one": "", "other": "Otros" - } + }, + "description": "\u00bfQuieres iniciar la configuraci\u00f3n?" } } }, diff --git a/homeassistant/components/kraken/translations/hu.json b/homeassistant/components/kraken/translations/hu.json index 793a3433eb8..6ea1c832188 100644 --- a/homeassistant/components/kraken/translations/hu.json +++ b/homeassistant/components/kraken/translations/hu.json @@ -13,7 +13,7 @@ "one": "\u00dcres", "other": "\u00dcres" }, - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } }, diff --git a/homeassistant/components/kraken/translations/id.json b/homeassistant/components/kraken/translations/id.json new file mode 100644 index 00000000000..a436ac4aee5 --- /dev/null +++ b/homeassistant/components/kraken/translations/id.json @@ -0,0 +1,12 @@ +{ + "config": { + "abort": { + "already_configured": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." + }, + "step": { + "user": { + "description": "Ingin memulai penyiapan?" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/kraken/translations/nl.json b/homeassistant/components/kraken/translations/nl.json index 25fe63bebd5..09b93b205e3 100644 --- a/homeassistant/components/kraken/translations/nl.json +++ b/homeassistant/components/kraken/translations/nl.json @@ -9,7 +9,7 @@ }, "step": { "user": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } }, diff --git a/homeassistant/components/kulersky/translations/hu.json b/homeassistant/components/kulersky/translations/hu.json index 6c61530acbe..a56ebbfc906 100644 --- a/homeassistant/components/kulersky/translations/hu.json +++ b/homeassistant/components/kulersky/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } } diff --git a/homeassistant/components/kulersky/translations/nl.json b/homeassistant/components/kulersky/translations/nl.json index d11896014fd..0671f0b3674 100644 --- a/homeassistant/components/kulersky/translations/nl.json +++ b/homeassistant/components/kulersky/translations/nl.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } } diff --git a/homeassistant/components/life360/translations/ca.json b/homeassistant/components/life360/translations/ca.json index cf57e4e1d2f..875692a661a 100644 --- a/homeassistant/components/life360/translations/ca.json +++ b/homeassistant/components/life360/translations/ca.json @@ -8,7 +8,7 @@ "default": "Per configurar les opcions avan\u00e7ades mira la [documentaci\u00f3 de Life360]({docs_url})." }, "error": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", "invalid_username": "Nom d'usuari incorrecte", "unknown": "Error inesperat" diff --git a/homeassistant/components/lifx/translations/hu.json b/homeassistant/components/lifx/translations/hu.json index f706dcefa96..3d728f21d07 100644 --- a/homeassistant/components/lifx/translations/hu.json +++ b/homeassistant/components/lifx/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a LIFX-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: LIFX?" } } } diff --git a/homeassistant/components/litterrobot/translations/ca.json b/homeassistant/components/litterrobot/translations/ca.json index b7ca6053fbc..5165473860a 100644 --- a/homeassistant/components/litterrobot/translations/ca.json +++ b/homeassistant/components/litterrobot/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3", diff --git a/homeassistant/components/litterrobot/translations/hu.json b/homeassistant/components/litterrobot/translations/hu.json index fd8db27da5e..cc0c820facf 100644 --- a/homeassistant/components/litterrobot/translations/hu.json +++ b/homeassistant/components/litterrobot/translations/hu.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van" + "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van" }, "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", diff --git a/homeassistant/components/local_ip/translations/hu.json b/homeassistant/components/local_ip/translations/hu.json index e930d58784a..cfb92ddb7b6 100644 --- a/homeassistant/components/local_ip/translations/hu.json +++ b/homeassistant/components/local_ip/translations/hu.json @@ -5,7 +5,7 @@ }, "step": { "user": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?", + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?", "title": "Helyi IP c\u00edm" } } diff --git a/homeassistant/components/local_ip/translations/nl.json b/homeassistant/components/local_ip/translations/nl.json index 3ea8140a96e..4b2672d2a3b 100644 --- a/homeassistant/components/local_ip/translations/nl.json +++ b/homeassistant/components/local_ip/translations/nl.json @@ -5,7 +5,7 @@ }, "step": { "user": { - "description": "Wil je beginnen met instellen?", + "description": "Wilt u beginnen met instellen?", "title": "Lokaal IP-adres" } } diff --git a/homeassistant/components/locative/translations/hu.json b/homeassistant/components/locative/translations/hu.json index 8dc03e9c37a..893e22f1471 100644 --- a/homeassistant/components/locative/translations/hu.json +++ b/homeassistant/components/locative/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { "default": "Ha helyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a webhook funkci\u00f3t a Locative alkalmaz\u00e1sban. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST \n\n Tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1sd a [dokument\u00e1ci\u00f3t]({docs_url})." }, "step": { "user": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?", + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?", "title": "Locative Webhook be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/locative/translations/nl.json b/homeassistant/components/locative/translations/nl.json index d66a1262b5d..ed39d00430b 100644 --- a/homeassistant/components/locative/translations/nl.json +++ b/homeassistant/components/locative/translations/nl.json @@ -9,7 +9,7 @@ }, "step": { "user": { - "description": "Wil je beginnen met instellen?", + "description": "Wilt u beginnen met instellen?", "title": "Stel de Locative Webhook in" } } diff --git a/homeassistant/components/logi_circle/translations/ca.json b/homeassistant/components/logi_circle/translations/ca.json index 9f46b3f621a..da66dbf55dd 100644 --- a/homeassistant/components/logi_circle/translations/ca.json +++ b/homeassistant/components/logi_circle/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "external_error": "S'ha produ\u00eft una excepci\u00f3 d'un altre flux de dades.", "external_setup": "Logi Circle s'ha configurat correctament des d'un altre flux de dades.", "missing_configuration": "El component no est\u00e0 configurat. Mira'n la documentaci\u00f3." diff --git a/homeassistant/components/logi_circle/translations/hu.json b/homeassistant/components/logi_circle/translations/hu.json index 73522a59519..f79ab3944dc 100644 --- a/homeassistant/components/logi_circle/translations/hu.json +++ b/homeassistant/components/logi_circle/translations/hu.json @@ -4,16 +4,16 @@ "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", "external_error": "Kiv\u00e9tel t\u00f6rt\u00e9nt egy m\u00e1sik folyamatb\u00f3l.", "external_setup": "LogiCircle sikeresen konfigur\u00e1lva egy m\u00e1sik folyamatb\u00f3l.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t." + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t." }, "error": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "follow_link": "K\u00e9rlek, k\u00f6vesd a hivatkoz\u00e1st \u00e9s hiteles\u00edtsd magad miel\u0151tt megnyomod a K\u00fcld\u00e9s gombot", + "follow_link": "K\u00e9rem, k\u00f6vesse a hivatkoz\u00e1st \u00e9s hiteles\u00edtse mag\u00e1t miel\u0151tt megnyomn\u00e1 a K\u00fcld\u00e9s gombot", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s" }, "step": { "auth": { - "description": "K\u00e9rj\u00fck, k\u00f6vesse az al\u00e1bbi linket, \u00e9s ** Fogadja el ** a LogiCircle -fi\u00f3kj\u00e1hoz val\u00f3 hozz\u00e1f\u00e9r\u00e9st, majd t\u00e9rjen vissza, \u00e9s nyomja meg az al\u00e1bbi ** K\u00fcld\u00e9s ** gombot. \n\n [Link] ({authorization_url})", + "description": "K\u00e9rj\u00fck, k\u00f6vesse az al\u00e1bbi linket, \u00e9s ** Fogadja el ** a LogiCircle -fi\u00f3kj\u00e1hoz val\u00f3 hozz\u00e1f\u00e9r\u00e9st, majd t\u00e9rjen vissza, \u00e9s nyomja meg az al\u00e1bbi ** K\u00fcld\u00e9s ** gombot. \n\n [Link]({authorization_url})", "title": "Hiteles\u00edt\u00e9s a LogiCircle seg\u00edts\u00e9g\u00e9vel" }, "user": { diff --git a/homeassistant/components/lutron_caseta/translations/es.json b/homeassistant/components/lutron_caseta/translations/es.json index 9dbedba1457..098a90377d8 100644 --- a/homeassistant/components/lutron_caseta/translations/es.json +++ b/homeassistant/components/lutron_caseta/translations/es.json @@ -69,8 +69,8 @@ "stop_all": "Detener todo" }, "trigger_type": { - "press": "\"{subtipo}\" presionado", - "release": "\"{subtipo}\" liberado" + "press": "\"{subtype}\" presionado", + "release": "\"{subtype}\" liberado" } } } \ No newline at end of file diff --git a/homeassistant/components/lutron_caseta/translations/hu.json b/homeassistant/components/lutron_caseta/translations/hu.json index 0e8960530e3..f3fca2ff705 100644 --- a/homeassistant/components/lutron_caseta/translations/hu.json +++ b/homeassistant/components/lutron_caseta/translations/hu.json @@ -15,12 +15,12 @@ "title": "Nem siker\u00fclt import\u00e1lni a Cas\u00e9ta h\u00edd konfigur\u00e1ci\u00f3j\u00e1t." }, "link": { - "description": "A(z) {name} {host} p\u00e1ros\u00edt\u00e1s\u00e1hoz az \u0171rlap elk\u00fcld\u00e9se ut\u00e1n nyomja meg a h\u00edd h\u00e1tulj\u00e1n tal\u00e1lhat\u00f3 fekete gombot.", + "description": "A(z) {name} ({host}) p\u00e1ros\u00edt\u00e1s\u00e1hoz az \u0171rlap elk\u00fcld\u00e9se ut\u00e1n nyomja meg a h\u00edd h\u00e1tulj\u00e1n tal\u00e1lhat\u00f3 fekete gombot.", "title": "P\u00e1ros\u00edtsd a h\u00edddal" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "Add meg az eszk\u00f6z IP-c\u00edm\u00e9t.", "title": "Automatikus csatlakoz\u00e1s a h\u00eddhoz" diff --git a/homeassistant/components/lutron_caseta/translations/id.json b/homeassistant/components/lutron_caseta/translations/id.json index b14e9ad1c23..409cea59060 100644 --- a/homeassistant/components/lutron_caseta/translations/id.json +++ b/homeassistant/components/lutron_caseta/translations/id.json @@ -8,7 +8,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "Lutron Cas\u00e9ta {name} ({host})", + "flow_title": "{name} ({host})", "step": { "import_failed": { "description": "Tidak dapat menyiapkan bridge (host: {host} ) yang diimpor dari configuration.yaml.", diff --git a/homeassistant/components/lyric/translations/hu.json b/homeassistant/components/lyric/translations/hu.json index c6174673a90..7586310c8a7 100644 --- a/homeassistant/components/lyric/translations/hu.json +++ b/homeassistant/components/lyric/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "reauth_successful": "Az \u00fajhiteles\u00edt\u00e9s sikeres volt" }, "create_entry": { diff --git a/homeassistant/components/lyric/translations/id.json b/homeassistant/components/lyric/translations/id.json index 876fe2f8c39..f1057fc7cb2 100644 --- a/homeassistant/components/lyric/translations/id.json +++ b/homeassistant/components/lyric/translations/id.json @@ -2,7 +2,8 @@ "config": { "abort": { "authorize_url_timeout": "Tenggang waktu pembuatan URL otorisasi habis.", - "missing_configuration": "Komponen tidak dikonfigurasi. Ikuti petunjuk dalam dokumentasi." + "missing_configuration": "Komponen tidak dikonfigurasi. Ikuti petunjuk dalam dokumentasi.", + "reauth_successful": "Autentikasi ulang berhasil" }, "create_entry": { "default": "Berhasil diautentikasi" @@ -10,6 +11,9 @@ "step": { "pick_implementation": { "title": "Pilih Metode Autentikasi" + }, + "reauth_confirm": { + "title": "Autentikasi Ulang Integrasi" } } } diff --git a/homeassistant/components/mailgun/translations/hu.json b/homeassistant/components/mailgun/translations/hu.json index 14c2293734c..b40c4316bba 100644 --- a/homeassistant/components/mailgun/translations/hu.json +++ b/homeassistant/components/mailgun/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { - "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant programnak, be kell \u00e1ll\u00edtania a [Webhooks with Mailgun]({mailgun_url}) alkalmaz\u00e1st. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/json \n\n L\u00e1sd [a dokument\u00e1ci\u00f3]({docs_url}), hogyan konfigur\u00e1lhatja az automatiz\u00e1l\u00e1sokat a bej\u00f6v\u0151 adatok kezel\u00e9s\u00e9re." + "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant programnak, be kell \u00e1ll\u00edtania a [Webhooks with Mailgun]({mailgun_url}) alkalmaz\u00e1st. \n\nT\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/json \n\nL\u00e1sd [a dokument\u00e1ci\u00f3]({docs_url}), hogyan konfigur\u00e1lhatja az automatizmusokat a bej\u00f6v\u0151 adatok kezel\u00e9s\u00e9re." }, "step": { "user": { - "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani a Mailgunt?", + "description": "Biztos benne, hogy be szeretn\u00e9 \u00e1ll\u00edtani a Mailgunt?", "title": "Mailgun Webhook be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/mazda/translations/ca.json b/homeassistant/components/mazda/translations/ca.json index ef00713216a..17ef370b007 100644 --- a/homeassistant/components/mazda/translations/ca.json +++ b/homeassistant/components/mazda/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/mazda/translations/hu.json b/homeassistant/components/mazda/translations/hu.json index e6b80240184..c3f00040ea3 100644 --- a/homeassistant/components/mazda/translations/hu.json +++ b/homeassistant/components/mazda/translations/hu.json @@ -5,7 +5,7 @@ "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" }, "error": { - "account_locked": "Fi\u00f3k z\u00e1rolva. K\u00e9rlek, pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u0151bb.", + "account_locked": "Fi\u00f3k z\u00e1rolva. K\u00e9rem, pr\u00f3b\u00e1lja \u00fajra k\u00e9s\u0151bb.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" diff --git a/homeassistant/components/meteo_france/translations/hu.json b/homeassistant/components/meteo_france/translations/hu.json index 112f70b6ea6..8034f6d0586 100644 --- a/homeassistant/components/meteo_france/translations/hu.json +++ b/homeassistant/components/meteo_france/translations/hu.json @@ -12,7 +12,7 @@ "data": { "city": "V\u00e1ros" }, - "description": "V\u00e1laszd ki a v\u00e1rost a list\u00e1b\u00f3l", + "description": "V\u00e1lassza ki a v\u00e1rost a list\u00e1b\u00f3l", "title": "M\u00e9t\u00e9o-France" }, "user": { diff --git a/homeassistant/components/meteoclimatic/translations/es.json b/homeassistant/components/meteoclimatic/translations/es.json index 2cb627d4ae0..ab84e6604e3 100644 --- a/homeassistant/components/meteoclimatic/translations/es.json +++ b/homeassistant/components/meteoclimatic/translations/es.json @@ -1,8 +1,12 @@ { "config": { "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", "unknown": "Error inesperado" }, + "error": { + "not_found": "No se encontraron dispositivos en la red" + }, "step": { "user": { "data": { diff --git a/homeassistant/components/meteoclimatic/translations/id.json b/homeassistant/components/meteoclimatic/translations/id.json new file mode 100644 index 00000000000..81dddee653f --- /dev/null +++ b/homeassistant/components/meteoclimatic/translations/id.json @@ -0,0 +1,11 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "error": { + "not_found": "Tidak ada perangkat yang ditemukan di jaringan" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/mikrotik/translations/hu.json b/homeassistant/components/mikrotik/translations/hu.json index 248884f9687..3e5281fc06a 100644 --- a/homeassistant/components/mikrotik/translations/hu.json +++ b/homeassistant/components/mikrotik/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v", "password": "Jelsz\u00f3", "port": "Port", diff --git a/homeassistant/components/mikrotik/translations/ru.json b/homeassistant/components/mikrotik/translations/ru.json index 06e9d647545..015d2061c76 100644 --- a/homeassistant/components/mikrotik/translations/ru.json +++ b/homeassistant/components/mikrotik/translations/ru.json @@ -27,7 +27,7 @@ "device_tracker": { "data": { "arp_ping": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c ARP-\u043f\u0438\u043d\u0433", - "detection_time": "\u0412\u0440\u0435\u043c\u044f \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0441\u0435\u043a.), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \"\u041d\u0435 \u0434\u043e\u043c\u0430\".", + "detection_time": "\u0412\u0440\u0435\u043c\u044f, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u043c\u0430 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)", "force_dhcp": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DHCP" } } diff --git a/homeassistant/components/mill/translations/ca.json b/homeassistant/components/mill/translations/ca.json index 13ce41cec91..309e5ccc41c 100644 --- a/homeassistant/components/mill/translations/ca.json +++ b/homeassistant/components/mill/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3" diff --git a/homeassistant/components/minecraft_server/translations/hu.json b/homeassistant/components/minecraft_server/translations/hu.json index ef3c228d2d5..02c2a06d8ab 100644 --- a/homeassistant/components/minecraft_server/translations/hu.json +++ b/homeassistant/components/minecraft_server/translations/hu.json @@ -4,14 +4,14 @@ "already_configured": "A szolg\u00e1ltat\u00e1s m\u00e1r konfigur\u00e1lva van" }, "error": { - "cannot_connect": "Nem siker\u00fclt csatlakozni a szerverhez. K\u00e9rj\u00fck, ellen\u0151rizze a gazdag\u00e9pet \u00e9s a portot, majd pr\u00f3b\u00e1lkozzon \u00fajra. Gondoskodjon arr\u00f3l, hogy a szerveren legal\u00e1bb a Minecraft 1.7-es verzi\u00f3j\u00e1t futtassa.", + "cannot_connect": "Nem siker\u00fclt csatlakozni a szerverhez. K\u00e9rj\u00fck, ellen\u0151rizze a c\u00edmet \u00e9s a portot, majd pr\u00f3b\u00e1lkozzon \u00fajra. Gondoskodjon arr\u00f3l, hogy a szerveren legal\u00e1bb a Minecraft 1.7-es verzi\u00f3j\u00e1t futtassa.", "invalid_ip": "Az IP -c\u00edm \u00e9rv\u00e9nytelen (a MAC -c\u00edmet nem siker\u00fclt meghat\u00e1rozni). K\u00e9rj\u00fck, jav\u00edtsa ki, \u00e9s pr\u00f3b\u00e1lja \u00fajra.", "invalid_port": "A portnak 1024 \u00e9s 65535 k\u00f6z\u00f6tt kell lennie. K\u00e9rj\u00fck, jav\u00edtsa ki, \u00e9s pr\u00f3b\u00e1lja \u00fajra." }, "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v" }, "description": "\u00c1ll\u00edtsa be a Minecraft Server p\u00e9ld\u00e1nyt, hogy lehet\u0151v\u00e9 tegye a megfigyel\u00e9st.", diff --git a/homeassistant/components/mobile_app/translations/hu.json b/homeassistant/components/mobile_app/translations/hu.json index 90690e2545b..1dda8ce7223 100644 --- a/homeassistant/components/mobile_app/translations/hu.json +++ b/homeassistant/components/mobile_app/translations/hu.json @@ -1,11 +1,11 @@ { "config": { "abort": { - "install_app": "Nyisd meg a mobil alkalmaz\u00e1st a Home Assistant-tal val\u00f3 integr\u00e1ci\u00f3hoz. A kompatibilis alkalmaz\u00e1sok list\u00e1j\u00e1nak megtekint\u00e9s\u00e9hez ellen\u0151rizd [a le\u00edr\u00e1st]({apps_url})." + "install_app": "Nyissa meg a mobil alkalmaz\u00e1st Home Assistant-tal val\u00f3 integr\u00e1ci\u00f3hoz. A kompatibilis alkalmaz\u00e1sok list\u00e1j\u00e1nak megtekint\u00e9s\u00e9hez ellen\u0151rizze [a le\u00edr\u00e1st]({apps_url})." }, "step": { "confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a mobil alkalmaz\u00e1s komponenst?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a mobil alkalmaz\u00e1s komponenst?" } } }, diff --git a/homeassistant/components/modem_callerid/translations/ca.json b/homeassistant/components/modem_callerid/translations/ca.json new file mode 100644 index 00000000000..d94d4cf392d --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/ca.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat", + "already_in_progress": "El flux de configuraci\u00f3 ja est\u00e0 en curs", + "no_devices_found": "No s'ha trobat cap dispositiu restant" + }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3" + }, + "step": { + "usb_confirm": { + "description": "Integraci\u00f3 per a trucades fixes amb el m\u00f2dem de veu CX93001. Pot obtenir l'identificador del que truca i pot rebutjar trucades entrants.", + "title": "M\u00f2dem telef\u00f2nic" + }, + "user": { + "data": { + "name": "Nom", + "port": "Port" + }, + "description": "Integraci\u00f3 per a trucades fixes amb el m\u00f2dem de veu CX93001. Pot obtenir l'identificador del que truca i pot rebutjar trucades entrants.", + "title": "M\u00f2dem telef\u00f2nic" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/cs.json b/homeassistant/components/modem_callerid/translations/cs.json new file mode 100644 index 00000000000..05861d2c427 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/cs.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "Za\u0159\u00edzen\u00ed je ji\u017e nastaveno", + "already_in_progress": "Konfigurace ji\u017e prob\u00edh\u00e1" + }, + "error": { + "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit" + }, + "step": { + "user": { + "data": { + "name": "Jm\u00e9no", + "port": "Port" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/de.json b/homeassistant/components/modem_callerid/translations/de.json new file mode 100644 index 00000000000..0bc505be5c8 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/de.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert", + "already_in_progress": "Der Konfigurationsablauf wird bereits ausgef\u00fchrt", + "no_devices_found": "Keine weiteren Ger\u00e4te gefunden" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen" + }, + "step": { + "usb_confirm": { + "description": "Dies ist eine Integration f\u00fcr Festnetzanrufe mit einem CX93001 Sprachmodem. Damit k\u00f6nnen Anrufer-ID-Informationen mit einer Option zum Abweisen eines eingehenden Anrufs abgerufen werden.", + "title": "Telefonmodem" + }, + "user": { + "data": { + "name": "Name", + "port": "Port" + }, + "description": "Dies ist eine Integration f\u00fcr Festnetzanrufe mit einem CX93001 Sprachmodem. Damit k\u00f6nnen Anrufer-ID-Informationen mit einer Option zum Abweisen eines eingehenden Anrufs abgerufen werden.", + "title": "Telefonmodem" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/en.json b/homeassistant/components/modem_callerid/translations/en.json index 207f9ab7a17..5450a930ff3 100644 --- a/homeassistant/components/modem_callerid/translations/en.json +++ b/homeassistant/components/modem_callerid/translations/en.json @@ -9,17 +9,17 @@ "cannot_connect": "Failed to connect" }, "step": { + "usb_confirm": { + "description": "This is an integration for landline calls using a CX93001 voice modem. This can retrieve caller ID information with an option to reject an incoming call.", + "title": "Phone Modem" + }, "user": { "data": { "name": "Name", "port": "Port" }, - "title": "Phone Modem", - "description": "This is an integration for landline calls using a CX93001 voice modem. This can retrieve caller id information with an option to reject an incoming call." - }, - "usb_confirm": { - "title": "Phone Modem", - "description": "This is an integration for landline calls using a CX93001 voice modem. This can retrieve caller ID information with an option to reject an incoming call." + "description": "This is an integration for landline calls using a CX93001 voice modem. This can retrieve caller ID information with an option to reject an incoming call.", + "title": "Phone Modem" } } } diff --git a/homeassistant/components/modem_callerid/translations/es.json b/homeassistant/components/modem_callerid/translations/es.json new file mode 100644 index 00000000000..eaf0a9afea1 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/es.json @@ -0,0 +1,16 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", + "already_in_progress": "El flujo de configuraci\u00f3n ya est\u00e1 en proceso" + }, + "step": { + "user": { + "data": { + "name": "Nombre", + "port": "Puerto" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/et.json b/homeassistant/components/modem_callerid/translations/et.json new file mode 100644 index 00000000000..463d24e8f9f --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/et.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud", + "already_in_progress": "Seadistamine juba k\u00e4ib", + "no_devices_found": "Lisatavaid seadmeid ei leitud" + }, + "error": { + "cannot_connect": "\u00dchendamine nurjus" + }, + "step": { + "usb_confirm": { + "description": "See on sidumine fiksv\u00f5rgu telefonile kasutades CX93001 modemit. See v\u00f5ib hankida helistaja ID teabe koos sissetulevast k\u00f5nestloobumise v\u00f5imalusega.", + "title": "Telefoniliini modem" + }, + "user": { + "data": { + "name": "Nimi", + "port": "Port" + }, + "description": "See on sidumine fiksv\u00f5rgu telefonile kasutades CX93001 modemit. See v\u00f5ib hankida helistaja ID teabe koos sissetulevast k\u00f5nestloobumise v\u00f5imalusega.", + "title": "Telefoniliini modem" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/he.json b/homeassistant/components/modem_callerid/translations/he.json new file mode 100644 index 00000000000..e156f21f826 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/he.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", + "already_in_progress": "\u05d6\u05e8\u05d9\u05de\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05db\u05d1\u05e8 \u05de\u05ea\u05d1\u05e6\u05e2\u05ea" + }, + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" + }, + "step": { + "user": { + "data": { + "name": "\u05e9\u05dd", + "port": "\u05e4\u05ea\u05d7\u05d4" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/hu.json b/homeassistant/components/modem_callerid/translations/hu.json new file mode 100644 index 00000000000..cb8433e0028 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/hu.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", + "no_devices_found": "Nem tal\u00e1lhat\u00f3 egy\u00e9b eszk\u00f6z" + }, + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s" + }, + "step": { + "usb_confirm": { + "description": "Ez egy integr\u00e1ci\u00f3 a CX93001 hangmodemmel t\u00f6rt\u00e9n\u0151 vezet\u00e9kes h\u00edv\u00e1sokhoz. Ez k\u00e9pes lek\u00e9rdezni a h\u00edv\u00f3azonos\u00edt\u00f3 inform\u00e1ci\u00f3t a bej\u00f6v\u0151 h\u00edv\u00e1s visszautas\u00edt\u00e1s\u00e1nak lehet\u0151s\u00e9g\u00e9vel.", + "title": "Telefon modem" + }, + "user": { + "data": { + "name": "N\u00e9v", + "port": "Port" + }, + "description": "Ez egy integr\u00e1ci\u00f3 a CX93001 hangmodemmel t\u00f6rt\u00e9n\u0151 vezet\u00e9kes h\u00edv\u00e1sokhoz. Ez k\u00e9pes lek\u00e9rdezni a h\u00edv\u00f3azonos\u00edt\u00f3 inform\u00e1ci\u00f3t a bej\u00f6v\u0151 h\u00edv\u00e1s visszautas\u00edt\u00e1s\u00e1nak lehet\u0151s\u00e9g\u00e9vel.", + "title": "Telefon modem" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/id.json b/homeassistant/components/modem_callerid/translations/id.json new file mode 100644 index 00000000000..9e8fc6738b9 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/id.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi", + "already_in_progress": "Alur konfigurasi sedang berlangsung" + }, + "error": { + "cannot_connect": "Gagal terhubung" + }, + "step": { + "user": { + "data": { + "name": "Nama", + "port": "Port" + }, + "title": "Modem Telepon" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/it.json b/homeassistant/components/modem_callerid/translations/it.json new file mode 100644 index 00000000000..65d1c74f956 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/it.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", + "already_in_progress": "Il flusso di configurazione \u00e8 gi\u00e0 in corso", + "no_devices_found": "Nessun dispositivo rimanente trovato" + }, + "error": { + "cannot_connect": "Impossibile connettersi" + }, + "step": { + "usb_confirm": { + "description": "Questa \u00e8 un'integrazione per le chiamate su linea fissa che utilizza un modem vocale CX93001. Questo pu\u00f2 recuperare le informazioni sull'ID del chiamante con un'opzione per rifiutare una chiamata in arrivo.", + "title": "Modem del telefono" + }, + "user": { + "data": { + "name": "Nome", + "port": "Porta" + }, + "description": "Questa \u00e8 un'integrazione per le chiamate su linea fissa che utilizza un modem vocale CX93001. Questo pu\u00f2 recuperare le informazioni sull'ID del chiamante con un'opzione per rifiutare una chiamata in arrivo.", + "title": "Modem del telefono" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/nl.json b/homeassistant/components/modem_callerid/translations/nl.json new file mode 100644 index 00000000000..4077a03105b --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/nl.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Apparaat is al geconfigureerd", + "already_in_progress": "De configuratiestroom is al aan de gang", + "no_devices_found": "Geen resterende apparaten gevonden" + }, + "error": { + "cannot_connect": "Kan geen verbinding maken" + }, + "step": { + "usb_confirm": { + "description": "Dit is een integratie voor vaste telefoongesprekken met een CX93001 spraakmodem. Hiermee kan beller-ID informatie worden opgehaald met een optie om een inkomende oproep te weigeren.", + "title": "Telefoonmodem" + }, + "user": { + "data": { + "name": "Naam", + "port": "Poort" + }, + "description": "Dit is een integratie voor vaste telefoongesprekken met een CX93001 spraakmodem. Hiermee kan beller-ID informatie worden opgehaald met een optie om een inkomende oproep te weigeren.", + "title": "Telefoonmodem" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/no.json b/homeassistant/components/modem_callerid/translations/no.json new file mode 100644 index 00000000000..2e1103b5092 --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/no.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert", + "already_in_progress": "Konfigurasjonsflyten p\u00e5g\u00e5r allerede", + "no_devices_found": "Ingen gjenv\u00e6rende enheter funnet" + }, + "error": { + "cannot_connect": "Tilkobling mislyktes" + }, + "step": { + "usb_confirm": { + "description": "Dette er en integrasjon for fasttelefonsamtaler ved hjelp av et talemodem CX93001. Dette kan hente oppringer -ID -informasjon med et alternativ for \u00e5 avvise et innkommende anrop.", + "title": "Telefonmodem" + }, + "user": { + "data": { + "name": "Navn", + "port": "Port" + }, + "description": "Dette er en integrasjon for fasttelefonsamtaler ved hjelp av et talemodem CX93001. Dette kan hente oppringer -ID -informasjon med et alternativ for \u00e5 avvise et innkommende anrop.", + "title": "Telefonmodem" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/ru.json b/homeassistant/components/modem_callerid/translations/ru.json new file mode 100644 index 00000000000..f5fa5061a4a --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/ru.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", + "already_in_progress": "\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.", + "no_devices_found": "\u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e." + }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f." + }, + "step": { + "usb_confirm": { + "description": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043c\u0430 CX93001 \u0434\u043b\u044f \u0437\u0432\u043e\u043d\u043a\u043e\u0432 \u043f\u043e \u0441\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430.", + "title": "\u0422\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0435\u043c" + }, + "user": { + "data": { + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", + "port": "\u041f\u043e\u0440\u0442" + }, + "description": "\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043c\u0430 CX93001 \u0434\u043b\u044f \u0437\u0432\u043e\u043d\u043a\u043e\u0432 \u043f\u043e \u0441\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0430\u0431\u043e\u043d\u0435\u043d\u0442\u0430 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430.", + "title": "\u0422\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0435\u043c" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modem_callerid/translations/zh-Hant.json b/homeassistant/components/modem_callerid/translations/zh-Hant.json new file mode 100644 index 00000000000..542a12e8c5d --- /dev/null +++ b/homeassistant/components/modem_callerid/translations/zh-Hant.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "already_in_progress": "\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d", + "no_devices_found": "\u627e\u4e0d\u5230\u5269\u9918\u88dd\u7f6e" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557" + }, + "step": { + "usb_confirm": { + "description": "\u6b64\u6574\u5408\u4f7f\u7528 CX93001 \u8a9e\u97f3\u6578\u64da\u6a5f\u9032\u884c\u5e02\u8a71\u901a\u8a71\u3002\u53ef\u7528\u4ee5\u6aa2\u67e5\u4f86\u96fb ID \u8cc7\u8a0a\u3001\u4e26\u9032\u884c\u62d2\u63a5\u4f86\u96fb\u7684\u529f\u80fd\u3002", + "title": "\u624b\u6a5f\u6578\u64da\u6a5f" + }, + "user": { + "data": { + "name": "\u540d\u7a31", + "port": "\u901a\u8a0a\u57e0" + }, + "description": "\u6b64\u6574\u5408\u4f7f\u7528 CX93001 \u8a9e\u97f3\u6578\u64da\u6a5f\u9032\u884c\u5e02\u8a71\u901a\u8a71\u3002\u53ef\u7528\u4ee5\u6aa2\u67e5\u4f86\u96fb ID \u8cc7\u8a0a\u3001\u4e26\u9032\u884c\u62d2\u63a5\u4f86\u96fb\u7684\u529f\u80fd\u3002", + "title": "\u624b\u6a5f\u6578\u64da\u6a5f" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modern_forms/translations/es.json b/homeassistant/components/modern_forms/translations/es.json index 25a432214fc..f651dca40a5 100644 --- a/homeassistant/components/modern_forms/translations/es.json +++ b/homeassistant/components/modern_forms/translations/es.json @@ -1,7 +1,17 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", + "cannot_connect": "No se pudo conectar" + }, + "error": { + "cannot_connect": "No se pudo conectar" + }, "flow_title": "{name}", "step": { + "confirm": { + "description": "\u00bfQuieres iniciar la configuraci\u00f3n?" + }, "user": { "data": { "host": "Anfitri\u00f3n" diff --git a/homeassistant/components/modern_forms/translations/hu.json b/homeassistant/components/modern_forms/translations/hu.json index fee0216224c..5bea7c3054e 100644 --- a/homeassistant/components/modern_forms/translations/hu.json +++ b/homeassistant/components/modern_forms/translations/hu.json @@ -10,16 +10,16 @@ "flow_title": "{name}", "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "\u00c1ll\u00edtsa be a Modern Forms-t, hogy integr\u00e1l\u00f3djon a Home Assistant programba." + "description": "\u00c1ll\u00edtsa be Modern Forms-t, hogy integr\u00e1l\u00f3djon Home Assistant-ba." }, "zeroconf_confirm": { - "description": "Hozz\u00e1 szeretn\u00e9 adni a(z) {name} `nev\u0171 Modern Forms rajong\u00f3t a Home Assistanthoz?", + "description": "Hozz\u00e1 szeretn\u00e9 adni `{name}`nev\u0171 Modern Forms rajong\u00f3t Home Assistanthoz?", "title": "Felfedezte a Modern Forms rajong\u00f3i eszk\u00f6zt" } } diff --git a/homeassistant/components/modern_forms/translations/id.json b/homeassistant/components/modern_forms/translations/id.json new file mode 100644 index 00000000000..8b2f9fcfa1d --- /dev/null +++ b/homeassistant/components/modern_forms/translations/id.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi", + "cannot_connect": "Gagal terhubung" + }, + "error": { + "cannot_connect": "Gagal terhubung" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "Ingin memulai penyiapan?" + }, + "user": { + "data": { + "host": "Host" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/modern_forms/translations/nl.json b/homeassistant/components/modern_forms/translations/nl.json index 5a3d63e15a7..ccbdf7d5b44 100644 --- a/homeassistant/components/modern_forms/translations/nl.json +++ b/homeassistant/components/modern_forms/translations/nl.json @@ -10,7 +10,7 @@ "flow_title": "{name}", "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" }, "user": { "data": { diff --git a/homeassistant/components/motion_blinds/translations/hu.json b/homeassistant/components/motion_blinds/translations/hu.json index a2560e5fa79..32ff2dcc58e 100644 --- a/homeassistant/components/motion_blinds/translations/hu.json +++ b/homeassistant/components/motion_blinds/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "connection_error": "Sikertelen csatlakoz\u00e1s" }, "error": { diff --git a/homeassistant/components/motioneye/translations/hu.json b/homeassistant/components/motioneye/translations/hu.json index 5b23c74dc76..c381d3954d4 100644 --- a/homeassistant/components/motioneye/translations/hu.json +++ b/homeassistant/components/motioneye/translations/hu.json @@ -12,7 +12,7 @@ }, "step": { "hassio_confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Home Assistant, hogy csatlakozzon a(z) {addon} \u00e1ltal biztos\u00edtott motionEye szolg\u00e1ltat\u00e1shoz?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot, hogy csatlakozzon {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal biztos\u00edtott motionEye szolg\u00e1ltat\u00e1shoz?", "title": "motionEye a Home Assistant kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel" }, "user": { @@ -30,7 +30,7 @@ "step": { "init": { "data": { - "webhook_set": "\u00c1ll\u00edtsa be a motionEye webhookokat az esem\u00e9nyek jelent\u00e9s\u00e9nek a Home Assistant sz\u00e1m\u00e1ra", + "webhook_set": "\u00c1ll\u00edtsa be a motionEye webhookokat az esem\u00e9nyek jelent\u00e9s\u00e9nek Home Assistant sz\u00e1m\u00e1ra", "webhook_set_overwrite": "Fel\u00fcl\u00edrja a fel nem ismert webhookokat" } } diff --git a/homeassistant/components/motioneye/translations/ko.json b/homeassistant/components/motioneye/translations/ko.json new file mode 100644 index 00000000000..ff2a843677d --- /dev/null +++ b/homeassistant/components/motioneye/translations/ko.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "already_configured": "\uc11c\ube44\uc2a4\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "reauth_successful": "\uc7ac\uc778\uc99d\uc5d0 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4" + }, + "error": { + "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4", + "invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "invalid_url": "\uc798\ubabb\ub41c URL", + "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + }, + "step": { + "user": { + "data": { + "admin_password": "Admin \ube44\ubc00\ubc88\ud638", + "admin_username": "Admin \uc0ac\uc6a9\uc790 \uc774\ub984", + "surveillance_password": "Surveillance \ube44\ubc00\ubc88\ud638", + "surveillance_username": "Surveillance \uc0ac\uc6a9\uc790 \uc774\ub984", + "url": "URL \uc8fc\uc18c" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/mqtt/translations/es.json b/homeassistant/components/mqtt/translations/es.json index 2cabe392308..50cac3172ab 100644 --- a/homeassistant/components/mqtt/translations/es.json +++ b/homeassistant/components/mqtt/translations/es.json @@ -1,6 +1,7 @@ { "config": { "abort": { + "already_configured": "El servicio ya est\u00e1 configurado", "single_instance_allowed": "S\u00f3lo se permite una \u00fanica configuraci\u00f3n de MQTT." }, "error": { diff --git a/homeassistant/components/mqtt/translations/fi.json b/homeassistant/components/mqtt/translations/fi.json index 27a956beb33..bc974dfd7d9 100644 --- a/homeassistant/components/mqtt/translations/fi.json +++ b/homeassistant/components/mqtt/translations/fi.json @@ -1,5 +1,8 @@ { "config": { + "error": { + "cannot_connect": "Yhdist\u00e4minen ep\u00e4onnistui" + }, "step": { "broker": { "data": { diff --git a/homeassistant/components/mqtt/translations/he.json b/homeassistant/components/mqtt/translations/he.json index df987bd35a2..36521ce6839 100644 --- a/homeassistant/components/mqtt/translations/he.json +++ b/homeassistant/components/mqtt/translations/he.json @@ -19,18 +19,45 @@ "description": "\u05e0\u05d0 \u05dc\u05d4\u05d6\u05d9\u05df \u05d0\u05ea \u05e4\u05e8\u05d8\u05d9 \u05d4\u05d7\u05d9\u05d1\u05d5\u05e8 \u05e9\u05dc \u05d4\u05d1\u05e8\u05d5\u05e7\u05e8 MQTT \u05e9\u05dc\u05da." }, "hassio_confirm": { + "data": { + "discovery": "\u05d0\u05d9\u05e4\u05e9\u05d5\u05e8 \u05d2\u05d9\u05dc\u05d5\u05d9" + }, "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea \u05d4-Home Assistant \u05db\u05da \u05e9\u05ea\u05ea\u05d7\u05d1\u05e8 \u05dc\u05de\u05ea\u05d5\u05d5\u05da MQTT \u05d4\u05de\u05e1\u05d5\u05e4\u05e7 \u05e2\u05dc \u05d9\u05d3\u05d9 \u05d4\u05d4\u05e8\u05d7\u05d1\u05d4 {addon}?", "title": "MQTT \u05d1\u05e8\u05d5\u05e7\u05e8 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05e8\u05d7\u05d1\u05ea Home Assistant" } } }, + "device_automation": { + "trigger_subtype": { + "button_1": "\u05db\u05e4\u05ea\u05d5\u05e8 \u05e8\u05d0\u05e9\u05d5\u05df", + "button_2": "\u05db\u05e4\u05ea\u05d5\u05e8 \u05e9\u05e0\u05d9", + "button_3": "\u05db\u05e4\u05ea\u05d5\u05e8 \u05e9\u05dc\u05d9\u05e9\u05d9", + "button_4": "\u05db\u05e4\u05ea\u05d5\u05e8 \u05e8\u05d1\u05d9\u05e2\u05d9", + "button_5": "\u05db\u05e4\u05ea\u05d5\u05e8 \u05d7\u05de\u05d9\u05e9\u05d9", + "button_6": "\u05db\u05e4\u05ea\u05d5\u05e8 \u05e9\u05d9\u05e9\u05d9", + "turn_off": "\u05db\u05d1\u05d4", + "turn_on": "\u05d4\u05e4\u05e2\u05dc" + }, + "trigger_type": { + "button_double_press": "\"{subtype}\" \u05d4\u05e7\u05e9\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4", + "button_long_press": "\"{subtype}\" \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05de\u05d5\u05e9\u05db\u05ea", + "button_long_release": "\"{subtype}\" \u05e9\u05d5\u05d7\u05e8\u05e8 \u05dc\u05d0\u05d7\u05e8 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05de\u05d5\u05e9\u05db\u05ea", + "button_quadruple_press": "\"{subtype}\" \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05e8\u05d5\u05d1\u05e2\u05ea", + "button_quintuple_press": "\"{subtype}\" \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05d7\u05d5\u05de\u05e9\u05ea", + "button_short_press": "\"{subtype}\" \u05e0\u05dc\u05d7\u05e5", + "button_short_release": "\"{subtype}\" \u05e9\u05d5\u05d7\u05e8\u05e8", + "button_triple_press": "\"{subtype}\" \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05e9\u05d5\u05dc\u05e9\u05ea" + } + }, "options": { "error": { + "bad_birth": "\u05e0\u05d5\u05e9\u05d0 \u05dc\u05d9\u05d3\u05d4 \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9.", "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" }, "step": { "broker": { "data": { + "broker": "\u05d1\u05e8\u05d5\u05e7\u05e8", "password": "\u05e1\u05d9\u05e1\u05de\u05d4", "port": "\u05e4\u05ea\u05d7\u05d4", "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" @@ -39,6 +66,13 @@ "title": "\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05de\u05ea\u05d5\u05d5\u05da" }, "options": { + "data": { + "birth_enable": "\u05d0\u05e4\u05e9\u05e8 \u05d4\u05d5\u05d3\u05e2\u05ea \u05dc\u05d9\u05d3\u05d4", + "birth_payload": "\u05de\u05d8\u05e2\u05df \u05d4\u05d5\u05d3\u05e2\u05ea \u05dc\u05d9\u05d3\u05d4", + "birth_retain": "\u05d4\u05d5\u05d3\u05e2\u05ea \u05dc\u05d9\u05d3\u05d4 \u05e0\u05e9\u05de\u05e8\u05ea", + "birth_topic": "\u05e0\u05d5\u05e9\u05d0 \u05d4\u05d5\u05d3\u05e2\u05ea \u05dc\u05d9\u05d3\u05d4", + "discovery": "\u05d0\u05d9\u05e4\u05e9\u05d5\u05e8 \u05d2\u05d9\u05dc\u05d5\u05d9" + }, "description": "\u05d2\u05d9\u05dc\u05d5\u05d9 - \u05d0\u05dd \u05d2\u05d9\u05dc\u05d5\u05d9 \u05de\u05d5\u05e4\u05e2\u05dc (\u05de\u05d5\u05de\u05dc\u05e5), Home Assistant \u05d9\u05d2\u05dc\u05d4 \u05d1\u05d0\u05d5\u05e4\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05de\u05db\u05e9\u05d9\u05e8\u05d9\u05dd \u05d5\u05d9\u05e9\u05d5\u05d9\u05d5\u05ea \u05d4\u05de\u05e4\u05e8\u05e1\u05de\u05d9\u05dd \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea\u05dd \u05d1\u05de\u05ea\u05d5\u05d5\u05da MQTT. \u05d0\u05dd \u05d4\u05d2\u05d9\u05dc\u05d5\u05d9 \u05d0\u05d9\u05e0\u05d5 \u05de\u05d5\u05e4\u05e2\u05dc, \u05db\u05dc \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05d7\u05d9\u05d9\u05d1\u05ea \u05dc\u05d4\u05d9\u05e2\u05e9\u05d5\u05ea \u05d1\u05d0\u05d5\u05e4\u05df \u05d9\u05d3\u05e0\u05d9.\n\u05d4\u05d5\u05d3\u05e2\u05ea \u05dc\u05d9\u05d3\u05d4 - \u05d4\u05d5\u05d3\u05e2\u05ea \u05d4\u05dc\u05d9\u05d3\u05d4 \u05ea\u05d9\u05e9\u05dc\u05d7 \u05d1\u05db\u05dc \u05e4\u05e2\u05dd \u05e9-Home Assistant \u05de\u05ea\u05d7\u05d1\u05e8 (\u05de\u05d7\u05d3\u05e9) \u05dc\u05de\u05ea\u05d5\u05d5\u05da MQTT.\n\u05d4\u05d5\u05d3\u05e2\u05ea \u05e8\u05e6\u05d5\u05df - \u05d4\u05d5\u05d3\u05e2\u05ea \u05d4\u05e8\u05e6\u05d5\u05df \u05ea\u05d9\u05e9\u05dc\u05d7 \u05d1\u05db\u05dc \u05e4\u05e2\u05dd \u05e9-Home Assistant \u05d9\u05d0\u05d1\u05d3 \u05d0\u05ea \u05d4\u05e7\u05e9\u05e8 \u05e9\u05dc\u05d5 \u05dc\u05de\u05ea\u05d5\u05d5\u05da, \u05d2\u05dd \u05d1\u05de\u05e7\u05e8\u05d4 \u05e9\u05dc \u05e0\u05d9\u05ea\u05d5\u05e7 \u05e0\u05e7\u05d9 (\u05dc\u05de\u05e9\u05dc \u05db\u05d9\u05d1\u05d5\u05d9 \u05e9\u05dc Home Assistant) \u05d5\u05d2\u05dd \u05d1\u05de\u05e7\u05e8\u05d4 \u05e9\u05dc \u05e0\u05d9\u05ea\u05d5\u05e7 \u05dc\u05d0 \u05e0\u05e7\u05d9 (\u05dc\u05de\u05e9\u05dc Home Assistant \u05de\u05ea\u05e8\u05e1\u05e7 \u05d0\u05d5 \u05de\u05d0\u05d1\u05d3 \u05d0\u05ea \u05d7\u05d9\u05d1\u05d5\u05e8 \u05d4\u05e8\u05e9\u05ea \u05e9\u05dc\u05d5).", "title": "\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea MQTT" } diff --git a/homeassistant/components/mqtt/translations/hu.json b/homeassistant/components/mqtt/translations/hu.json index ad371afabc8..471982756eb 100644 --- a/homeassistant/components/mqtt/translations/hu.json +++ b/homeassistant/components/mqtt/translations/hu.json @@ -16,14 +16,14 @@ "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "K\u00e9rlek, add meg az MQTT br\u00f3ker kapcsol\u00f3d\u00e1si adatait." + "description": "K\u00e9rem, adja meg az MQTT br\u00f3ker kapcsol\u00f3d\u00e1si adatait." }, "hassio_confirm": { "data": { "discovery": "Felfedez\u00e9s enged\u00e9lyez\u00e9se" }, - "description": "Be szeretn\u00e9d konfigru\u00e1lni, hogy a Home Assistant a(z) {addon} Supervisor add-on \u00e1ltal biztos\u00edtott MQTT br\u00f3kerhez csatlakozzon?", - "title": "MQTT Br\u00f3ker a Supervisor b\u0151v\u00edtm\u00e9nnyel" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot MQTT br\u00f3kerhez val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", + "title": "MQTT Br\u00f3ker - Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal" } } }, @@ -63,7 +63,7 @@ "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, - "description": "K\u00e9rlek, add meg az MQTT br\u00f3ker kapcsol\u00f3d\u00e1si adatait.", + "description": "K\u00e9rem, adja meg az MQTT br\u00f3ker kapcsol\u00f3d\u00e1si adatait.", "title": "Br\u00f3ker opci\u00f3k" }, "options": { @@ -80,7 +80,7 @@ "will_retain": "\u00dczenet megtart\u00e1sa", "will_topic": "\u00dczenet t\u00e9m\u00e1ja" }, - "description": "Felfedez\u00e9s - Ha a felfedez\u00e9s enged\u00e9lyezve van (aj\u00e1nlott), a Home Assistant automatikusan felfedezi azokat az eszk\u00f6z\u00f6ket \u00e9s entit\u00e1sokat, amelyek k\u00f6zz\u00e9teszik konfigur\u00e1ci\u00f3jukat az MQTT br\u00f3keren. Ha a felfedez\u00e9s le van tiltva, minden konfigur\u00e1ci\u00f3t manu\u00e1lisan kell elv\u00e9gezni.\nSz\u00fclet\u00e9si \u00fczenet - A sz\u00fclet\u00e9si \u00fczenetet minden alkalommal elk\u00fcldi, amikor a Home Assistant (\u00fajra) csatlakozik az MQTT br\u00f3kerhez.\nAkarat \u00fczenet - Az akarat\u00fczenet minden alkalommal el lesz k\u00fcldve, amikor a Home Assistant elvesz\u00edti a kapcsolatot a k\u00f6zvet\u00edt\u0151vel, mind takar\u00edt\u00e1s eset\u00e9n (pl. A Home Assistant le\u00e1ll\u00edt\u00e1sa), mind tiszt\u00e1talans\u00e1g eset\u00e9n (pl. Home Assistant \u00f6sszeomlik vagy megszakad a h\u00e1l\u00f3zati kapcsolata) bontani.", + "description": "Discovery - Ha a felfedez\u00e9s enged\u00e9lyezve van (aj\u00e1nlott), akkor Home Assistant automatikusan felfedezi azokat az eszk\u00f6z\u00f6ket \u00e9s entit\u00e1sokat, amelyek k\u00f6zz\u00e9teszik konfigur\u00e1ci\u00f3jukat az MQTT br\u00f3keren. Ha a felfedez\u00e9s le van tiltva, minden konfigur\u00e1ci\u00f3t manu\u00e1lisan kell elv\u00e9gezni.\nBirth \u00fczenet - A sz\u00fclet\u00e9si \u00fczenet minden alkalommal el lesz k\u00fcldve, amikor Home Assistant (\u00fajra) csatlakozik az MQTT br\u00f3kerhez.\nWill \u00fczenet - Az akarat\u00fczenet minden alkalommal el lesz k\u00fcldve, amikor Home Assistant elvesz\u00edti a kapcsolatot a k\u00f6zvet\u00edt\u0151vel, mind takar\u00edt\u00e1s eset\u00e9n (pl. Home Assistant le\u00e1ll\u00edt\u00e1sa), mind rendelenes helyzetben (pl. Home Assistant \u00f6sszeomlik vagy megszakad a h\u00e1l\u00f3zati kapcsolata).", "title": "MQTT opci\u00f3k" } } diff --git a/homeassistant/components/mqtt/translations/id.json b/homeassistant/components/mqtt/translations/id.json index 2a3171456c8..14e047c1694 100644 --- a/homeassistant/components/mqtt/translations/id.json +++ b/homeassistant/components/mqtt/translations/id.json @@ -1,6 +1,7 @@ { "config": { "abort": { + "already_configured": "Layanan sudah dikonfigurasi", "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." }, "error": { @@ -21,8 +22,8 @@ "data": { "discovery": "Aktifkan penemuan" }, - "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke broker MQTT yang disediakan oleh add-on Supervisor {addon}?", - "title": "MQTT Broker via add-on Supervisor" + "description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke broker MQTT yang disediakan oleh add-on {addon}?", + "title": "MQTT Broker via add-on Home Assistant" } } }, diff --git a/homeassistant/components/mutesync/translations/hu.json b/homeassistant/components/mutesync/translations/hu.json index 68cb5c18d27..0fd40705765 100644 --- a/homeassistant/components/mutesync/translations/hu.json +++ b/homeassistant/components/mutesync/translations/hu.json @@ -8,7 +8,7 @@ "step": { "user": { "data": { - "host": "Gazdag\u00e9p" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/mutesync/translations/id.json b/homeassistant/components/mutesync/translations/id.json new file mode 100644 index 00000000000..66c930e348b --- /dev/null +++ b/homeassistant/components/mutesync/translations/id.json @@ -0,0 +1,15 @@ +{ + "config": { + "error": { + "cannot_connect": "Gagal terhubung", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "host": "Host" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/myq/translations/id.json b/homeassistant/components/myq/translations/id.json index 2cc790d15e0..4972803f37d 100644 --- a/homeassistant/components/myq/translations/id.json +++ b/homeassistant/components/myq/translations/id.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Layanan sudah dikonfigurasi" + "already_configured": "Layanan sudah dikonfigurasi", + "reauth_successful": "Autentikasi ulang berhasil" }, "error": { "cannot_connect": "Gagal terhubung", @@ -9,6 +10,11 @@ "unknown": "Kesalahan yang tidak diharapkan" }, "step": { + "reauth_confirm": { + "data": { + "password": "Kata Sandi" + } + }, "user": { "data": { "password": "Kata Sandi", diff --git a/homeassistant/components/nam/translations/hu.json b/homeassistant/components/nam/translations/hu.json index 8776ae92e20..0698b4d3e26 100644 --- a/homeassistant/components/nam/translations/hu.json +++ b/homeassistant/components/nam/translations/hu.json @@ -11,11 +11,11 @@ "flow_title": "{name}", "step": { "confirm_discovery": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Nettigo Air Monitor-ot a {host} c\u00edmen?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Nettigo Air Monitor-ot a {host} c\u00edmen?" }, "user": { "data": { - "host": "Gazdag\u00e9p" + "host": "C\u00edm" }, "description": "\u00c1ll\u00edtsa be a Nettigo Air Monitor integr\u00e1ci\u00f3j\u00e1t." } diff --git a/homeassistant/components/nanoleaf/translations/el.json b/homeassistant/components/nanoleaf/translations/el.json index be6719d8c2a..5112f61ef9f 100644 --- a/homeassistant/components/nanoleaf/translations/el.json +++ b/homeassistant/components/nanoleaf/translations/el.json @@ -11,6 +11,7 @@ "not_allowing_new_tokens": "\u03a4\u03bf Nanoleaf \u03b4\u03b5\u03bd \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03ad\u03b1 tokens, \u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c0\u03b1\u03c1\u03b1\u03c0\u03ac\u03bd\u03c9 \u03bf\u03b4\u03b7\u03b3\u03af\u03b5\u03c2.", "unknown": "\u0391\u03bd\u03b5\u03c0\u03ac\u03bd\u03c4\u03b5\u03c7\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1" }, + "flow_title": "{name}", "step": { "link": { "description": "\u03a0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03c0\u03b1\u03c1\u03b1\u03c4\u03b5\u03c4\u03b1\u03bc\u03ad\u03bd\u03b1 \u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\u03c2 \u03c3\u03c4\u03bf Nanoleaf \u03b3\u03b9\u03b1 5 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03bd\u03b1 \u03b1\u03c1\u03c7\u03af\u03c3\u03bf\u03c5\u03bd \u03bd\u03b1 \u03b1\u03bd\u03b1\u03b2\u03bf\u03c3\u03b2\u03ae\u03bd\u03bf\u03c5\u03bd \u03bf\u03b9 \u03bb\u03c5\u03c7\u03bd\u03af\u03b5\u03c2 LED \u03c4\u03bf\u03c5 \u03ba\u03bf\u03c5\u03bc\u03c0\u03b9\u03bf\u03cd \u03ba\u03b1\u03b9, \u03c3\u03c4\u03b7 \u03c3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1, \u03ba\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af **SUBMIT** \u03bc\u03ad\u03c3\u03b1 \u03c3\u03b5 30 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1.", diff --git a/homeassistant/components/nanoleaf/translations/es.json b/homeassistant/components/nanoleaf/translations/es.json index 16b28203215..2efbfb875f4 100644 --- a/homeassistant/components/nanoleaf/translations/es.json +++ b/homeassistant/components/nanoleaf/translations/es.json @@ -1,13 +1,21 @@ { "config": { "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", + "cannot_connect": "No se pudo conectar", + "invalid_token": "Token de acceso no v\u00e1lido", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente", "unknown": "Error inesperado" }, "error": { + "cannot_connect": "No se pudo conectar", "unknown": "Error inesperado" }, "flow_title": "{name}", "step": { + "link": { + "title": "Link Nanoleaf" + }, "user": { "data": { "host": "Anfitri\u00f3n" diff --git a/homeassistant/components/nanoleaf/translations/hu.json b/homeassistant/components/nanoleaf/translations/hu.json index 7c5854055a4..176d47cc38f 100644 --- a/homeassistant/components/nanoleaf/translations/hu.json +++ b/homeassistant/components/nanoleaf/translations/hu.json @@ -15,12 +15,12 @@ "flow_title": "{name}", "step": { "link": { - "description": "Nyomja meg \u00e9s tartsa lenyomva a Nanoleaf bekapcsol\u00f3gombj\u00e1t 5 m\u00e1sodpercig, am\u00edg a gomb LED-je villogni nem kezd, majd kattintson a **SUBMIT** gombra 30 m\u00e1sodpercen bel\u00fcl.", + "description": "Nyomja meg \u00e9s tartsa lenyomva a Nanoleaf bekapcsol\u00f3gombj\u00e1t 5 m\u00e1sodpercig, am\u00edg a gomb LED-je villogni nem kezd, majd kattintson a **K\u00fcld\u00e9s** gombra 30 m\u00e1sodpercen bel\u00fcl.", "title": "Nanoleaf link" }, "user": { "data": { - "host": "Gazdag\u00e9p" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/nanoleaf/translations/id.json b/homeassistant/components/nanoleaf/translations/id.json new file mode 100644 index 00000000000..b0e3328df0b --- /dev/null +++ b/homeassistant/components/nanoleaf/translations/id.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi", + "cannot_connect": "Gagal terhubung", + "invalid_token": "Token akses tidak valid", + "reauth_successful": "Autentikasi ulang berhasil", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "host": "Host" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/neato/translations/es.json b/homeassistant/components/neato/translations/es.json index f9b6fe54e22..64c58279614 100644 --- a/homeassistant/components/neato/translations/es.json +++ b/homeassistant/components/neato/translations/es.json @@ -8,7 +8,7 @@ "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" }, "create_entry": { - "default": "Ver [documentaci\u00f3n Neato]({docs_url})." + "default": "Autenticado correctamente" }, "step": { "pick_implementation": { diff --git a/homeassistant/components/neato/translations/hu.json b/homeassistant/components/neato/translations/hu.json index 90fb417e6a6..20bc76ca6c0 100644 --- a/homeassistant/components/neato/translations/hu.json +++ b/homeassistant/components/neato/translations/hu.json @@ -3,7 +3,7 @@ "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" }, @@ -15,7 +15,7 @@ "title": "V\u00e1lassz hiteles\u00edt\u00e9si m\u00f3dszert" }, "reauth_confirm": { - "title": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "title": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } }, diff --git a/homeassistant/components/neato/translations/nl.json b/homeassistant/components/neato/translations/nl.json index 3d7bbab2e75..2e9ab212fa9 100644 --- a/homeassistant/components/neato/translations/nl.json +++ b/homeassistant/components/neato/translations/nl.json @@ -15,7 +15,7 @@ "title": "Kies een authenticatie methode" }, "reauth_confirm": { - "title": "Wil je beginnen met instellen?" + "title": "Wilt u beginnen met instellen?" } } }, diff --git a/homeassistant/components/nest/translations/fi.json b/homeassistant/components/nest/translations/fi.json index 5365f73b721..e4235ee096e 100644 --- a/homeassistant/components/nest/translations/fi.json +++ b/homeassistant/components/nest/translations/fi.json @@ -1,5 +1,8 @@ { "config": { + "error": { + "unknown": "Odottamaton virhe" + }, "step": { "init": { "data": { diff --git a/homeassistant/components/nest/translations/he.json b/homeassistant/components/nest/translations/he.json index a3b5411b536..6efee1d74bd 100644 --- a/homeassistant/components/nest/translations/he.json +++ b/homeassistant/components/nest/translations/he.json @@ -5,7 +5,8 @@ "missing_configuration": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05e8\u05db\u05d9\u05d1 \u05dc\u05d0 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e0\u05d0 \u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8 \u05d4\u05ea\u05d9\u05e2\u05d5\u05d3.", "no_url_available": "\u05d0\u05d9\u05df \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05ea\u05e8 \u05d6\u05de\u05d9\u05e0\u05d4. \u05e7\u05d1\u05dc\u05ea \u05de\u05d9\u05d3\u05e2 \u05e2\u05dc \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d6\u05d5, [\u05e2\u05d9\u05d9\u05df \u05d1\u05e1\u05e2\u05d9\u05e3 \u05d4\u05e2\u05d6\u05e8\u05d4] ({docs_url})", "reauth_successful": "\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05de\u05d7\u05d3\u05e9 \u05d4\u05e6\u05dc\u05d9\u05d7", - "single_instance_allowed": "\u05ea\u05e6\u05d5\u05e8\u05ea\u05d5 \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e8\u05e7 \u05ea\u05e6\u05d5\u05e8\u05d4 \u05d0\u05d7\u05ea \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea." + "single_instance_allowed": "\u05ea\u05e6\u05d5\u05e8\u05ea\u05d5 \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e8\u05e7 \u05ea\u05e6\u05d5\u05e8\u05d4 \u05d0\u05d7\u05ea \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea.", + "unknown_authorize_url_generation": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2\u05d4 \u05d1\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05d4\u05e8\u05e9\u05d0\u05d4." }, "create_entry": { "default": "\u05d0\u05d5\u05de\u05ea \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4" @@ -28,7 +29,7 @@ "data": { "code": "\u05e7\u05d5\u05d3 PIN" }, - "description": "\u05db\u05d3\u05d9 \u05dc\u05e7\u05e9\u05e8 \u05d0\u05ea \u05d7\u05e9\u05d1\u05d5\u05df Nest \u05e9\u05dc\u05da, [\u05d0\u05de\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da] ({url}). \n\n \u05dc\u05d0\u05d7\u05e8 \u05d4\u05d0\u05d9\u05e9\u05d5\u05e8, \u05d4\u05e2\u05ea\u05e7 \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4PIN \u05e9\u05e1\u05d5\u05e4\u05e7 \u05d5\u05d4\u05d3\u05d1\u05e7 \u05d0\u05d5\u05ea\u05d5 \u05dc\u05de\u05d8\u05d4.", + "description": "\u05db\u05d3\u05d9 \u05dc\u05e7\u05e9\u05e8 \u05d0\u05ea \u05d7\u05e9\u05d1\u05d5\u05df Nest \u05e9\u05dc\u05da, [\u05d4\u05e8\u05e9\u05d0\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da]({url}). \n\n \u05dc\u05d0\u05d7\u05e8 \u05d4\u05d0\u05d9\u05e9\u05d5\u05e8, \u05d9\u05e9 \u05dc\u05d4\u05e2\u05ea\u05d9\u05e7 \u05d0\u05ea \u05e7\u05d5\u05d3 \u05d4PIN \u05e9\u05e1\u05d5\u05e4\u05e7 \u05d5\u05dc\u05d4\u05d3\u05d1\u05d9\u05e7 \u05d0\u05d5\u05ea\u05d5 \u05dc\u05de\u05d8\u05d4.", "title": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d7\u05e9\u05d1\u05d5\u05df Nest" }, "pick_implementation": { diff --git a/homeassistant/components/nest/translations/hu.json b/homeassistant/components/nest/translations/hu.json index 5690724c4a0..58f8ea30caf 100644 --- a/homeassistant/components/nest/translations/hu.json +++ b/homeassistant/components/nest/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s az \u00e9rv\u00e9nyes\u00edt\u00e9si url gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", diff --git a/homeassistant/components/netatmo/translations/hu.json b/homeassistant/components/netatmo/translations/hu.json index 48f084f84c2..cb634547efc 100644 --- a/homeassistant/components/netatmo/translations/hu.json +++ b/homeassistant/components/netatmo/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, diff --git a/homeassistant/components/netgear/translations/ca.json b/homeassistant/components/netgear/translations/ca.json new file mode 100644 index 00000000000..48de8c99684 --- /dev/null +++ b/homeassistant/components/netgear/translations/ca.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat" + }, + "error": { + "config": "Error de connexi\u00f3 o d'inici de sessi\u00f3: comprova la configuraci\u00f3" + }, + "step": { + "user": { + "data": { + "host": "Amfitri\u00f3 (opcional)", + "password": "Contrasenya", + "port": "Port (opcional)", + "ssl": "Utilitza un certificat SSL", + "username": "Nom d'usuari (opcional)" + }, + "description": "Amfitri\u00f3 predeterminat: {host}\nPort predeterminat: {port}\nNom d'usuari predeterminat: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Temps per considerar 'a casa' (segons)" + }, + "description": "Especifica les configuracions opcional", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/cs.json b/homeassistant/components/netgear/translations/cs.json new file mode 100644 index 00000000000..786cd2229ab --- /dev/null +++ b/homeassistant/components/netgear/translations/cs.json @@ -0,0 +1,15 @@ +{ + "config": { + "step": { + "user": { + "data": { + "host": "Hostitel (nepovinn\u00fd)", + "password": "Heslo", + "port": "Port (nepovinn\u00fd)", + "ssl": "Pou\u017e\u00edv\u00e1 SSL certifik\u00e1t", + "username": "U\u017eivatelsk\u00e9 jm\u00e9no (nepovinn\u00e9)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/de.json b/homeassistant/components/netgear/translations/de.json new file mode 100644 index 00000000000..d1ee1310cad --- /dev/null +++ b/homeassistant/components/netgear/translations/de.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert" + }, + "error": { + "config": "Verbindungs- oder Anmeldefehler: Bitte \u00fcberpr\u00fcfe deine Konfiguration" + }, + "step": { + "user": { + "data": { + "host": "Host (Optional)", + "password": "Passwort", + "port": "Port (Optional)", + "ssl": "Verwendet ein SSL-Zertifikat", + "username": "Benutzername (Optional)" + }, + "description": "Standardhost: {host}\nStandardport: {port}\nStandardbenutzername: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Zu Hause Zeit (Sekunden)" + }, + "description": "Optionale Einstellungen angeben", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/en.json b/homeassistant/components/netgear/translations/en.json index 64dbeda0d7f..f9c2dbf2c91 100644 --- a/homeassistant/components/netgear/translations/en.json +++ b/homeassistant/components/netgear/translations/en.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Host already configured" + "already_configured": "Device is already configured" }, "error": { "config": "Connection or login error: please check your configuration" @@ -12,21 +12,23 @@ "host": "Host (Optional)", "password": "Password", "port": "Port (Optional)", - "ssl": "Use SSL (Optional)", + "ssl": "Uses an SSL certificate", "username": "Username (Optional)" }, - "description": "Default host: {host}\nDefault port: {port}\nDefault username: {username}" + "description": "Default host: {host}\nDefault port: {port}\nDefault username: {username}", + "title": "Netgear" } } }, "options": { "step": { - "init": { - "description": "Specify optional settings", - "data": { - "consider_home": "Consider home time (seconds)" + "init": { + "data": { + "consider_home": "Consider home time (seconds)" + }, + "description": "Specify optional settings", + "title": "Netgear" } - } } } } \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/es.json b/homeassistant/components/netgear/translations/es.json new file mode 100644 index 00000000000..57054de1c37 --- /dev/null +++ b/homeassistant/components/netgear/translations/es.json @@ -0,0 +1,18 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, + "step": { + "user": { + "data": { + "host": "Host (Opcional)", + "password": "Contrase\u00f1a", + "port": "Puerto (Opcional)", + "ssl": "Utiliza un certificado SSL", + "username": "Usuario (Opcional)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/et.json b/homeassistant/components/netgear/translations/et.json new file mode 100644 index 00000000000..ad100c4b83e --- /dev/null +++ b/homeassistant/components/netgear/translations/et.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud" + }, + "error": { + "config": "\u00dchenduse v\u00f5i sisselogimise viga: kontrolli oma s\u00e4tteid" + }, + "step": { + "user": { + "data": { + "host": "Host (valikuline)", + "password": "Salas\u00f5na", + "port": "Port (valikuline)", + "ssl": "Kasutusel on SSL sert", + "username": "Kasutajanimi (valikuline)" + }, + "description": "Vaikimisi host: {host}\nVaikeport: {port}\nVaikimisi kasutajanimi: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Kohaloleku m\u00e4\u00e4ramise aeg (sekundites)" + }, + "description": "Valikuliste s\u00e4tete m\u00e4\u00e4ramine", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/he.json b/homeassistant/components/netgear/translations/he.json new file mode 100644 index 00000000000..f1f42b6c771 --- /dev/null +++ b/homeassistant/components/netgear/translations/he.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "step": { + "user": { + "data": { + "host": "\u05de\u05d0\u05e8\u05d7 (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", + "password": "\u05e1\u05d9\u05e1\u05de\u05d4", + "port": "\u05e4\u05ea\u05d7\u05d4 (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", + "ssl": "\u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05d0\u05d9\u05e9\u05d5\u05e8 SSL", + "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9 (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)" + }, + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/hu.json b/homeassistant/components/netgear/translations/hu.json new file mode 100644 index 00000000000..64452c9ef58 --- /dev/null +++ b/homeassistant/components/netgear/translations/hu.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van" + }, + "error": { + "config": "Csatlakoz\u00e1si vagy bejelentkez\u00e9si hiba: k\u00e9rj\u00fck, ellen\u0151rizze a konfigur\u00e1ci\u00f3t" + }, + "step": { + "user": { + "data": { + "host": "C\u00edm (nem k\u00f6telez\u0151)", + "password": "Jelsz\u00f3", + "port": "Port (nem k\u00f6telez\u0151)", + "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata", + "username": "Felhaszn\u00e1l\u00f3n\u00e9v (nem k\u00f6telez\u0151)" + }, + "description": "Alap\u00e9rtelmezett c\u00edm: {host}\nAlap\u00e9rtelmezett port: {port}\nAlap\u00e9rtelmezett felhaszn\u00e1l\u00f3n\u00e9v: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Otthoni \u00e1llapotnak tekint\u00e9s (m\u00e1sodperc)" + }, + "description": "Opcion\u00e1lis be\u00e1ll\u00edt\u00e1sok megad\u00e1sa", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/id.json b/homeassistant/components/netgear/translations/id.json new file mode 100644 index 00000000000..a6a41a5023f --- /dev/null +++ b/homeassistant/components/netgear/translations/id.json @@ -0,0 +1,18 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "step": { + "user": { + "data": { + "host": "Host (Opsional)", + "password": "Kata Sandi", + "port": "Port (Opsional)", + "ssl": "Menggunakan sertifikat SSL", + "username": "Nama Pengguna (Opsional)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/it.json b/homeassistant/components/netgear/translations/it.json new file mode 100644 index 00000000000..72feece850a --- /dev/null +++ b/homeassistant/components/netgear/translations/it.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato" + }, + "error": { + "config": "Errore di connessione o di login: controlla la tua configurazione" + }, + "step": { + "user": { + "data": { + "host": "Host (Facoltativo)", + "password": "Password", + "port": "Porta (Facoltativo)", + "ssl": "Utilizza un certificato SSL", + "username": "Nome utente (Facoltativo)" + }, + "description": "Host predefinito: {host}\nPorta predefinita: {port}\nNome utente predefinito: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Considera il tempo in casa (secondi)" + }, + "description": "Specificare le impostazioni opzionali", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/nl.json b/homeassistant/components/netgear/translations/nl.json new file mode 100644 index 00000000000..22ac348af4e --- /dev/null +++ b/homeassistant/components/netgear/translations/nl.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Apparaat is al ingesteld" + }, + "error": { + "config": "Verbindings- of inlogfout; controleer uw configuratie" + }, + "step": { + "user": { + "data": { + "host": "Host (optioneel)", + "password": "Wachtwoord", + "port": "Poort (optioneel)", + "ssl": "Gebruikt een SSL certificaat", + "username": "Gebruikersnaam (optioneel)" + }, + "description": "Standaard host: {host}\nStandaard poort: {port}\nStandaard gebruikersnaam: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Overweeg thuis tijd (seconden)" + }, + "description": "Optionele instellingen opgeven", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/no.json b/homeassistant/components/netgear/translations/no.json new file mode 100644 index 00000000000..52020ae3824 --- /dev/null +++ b/homeassistant/components/netgear/translations/no.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert" + }, + "error": { + "config": "Tilkoblings- eller p\u00e5loggingsfeil: Kontroller konfigurasjonen" + }, + "step": { + "user": { + "data": { + "host": "Vert (valgfritt)", + "password": "Passord", + "port": "Port (valgfritt)", + "ssl": "Bruker et SSL-sertifikat", + "username": "Brukernavn (Valgfritt)" + }, + "description": "Standard vert: {host}\nStandardport: {port}\nStandard brukernavn: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "Vurder hjemmetid (sekunder)" + }, + "description": "Spesifiser valgfrie innstillinger", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/pt-BR.json b/homeassistant/components/netgear/translations/pt-BR.json new file mode 100644 index 00000000000..ec18c9a65df --- /dev/null +++ b/homeassistant/components/netgear/translations/pt-BR.json @@ -0,0 +1,28 @@ +{ + "config": { + "abort": { + "already_configured": "Dispositivo j\u00e1 configurado" + }, + "step": { + "user": { + "data": { + "host": "Host (Opcional)", + "password": "Senha", + "port": "Porta (Opcional)", + "ssl": "Utilize um certificado SSL", + "username": "Usu\u00e1rio (Opcional)" + }, + "description": "Host padr\u00e3o: {host}\n Porta padr\u00e3o: {port}\n Usu\u00e1rio padr\u00e3o: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "description": "Especifique configura\u00e7\u00f5es opcionais", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/ru.json b/homeassistant/components/netgear/translations/ru.json new file mode 100644 index 00000000000..035492a01fe --- /dev/null +++ b/homeassistant/components/netgear/translations/ru.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant." + }, + "error": { + "config": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e." + }, + "step": { + "user": { + "data": { + "host": "\u0425\u043e\u0441\u0442 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "port": "\u041f\u043e\u0440\u0442 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)", + "ssl": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 SSL", + "username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e)" + }, + "description": "\u0425\u043e\u0441\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: {host}\n\u041f\u043e\u0440\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: {port}\n\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: {username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "\u0412\u0440\u0435\u043c\u044f, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u043c\u0430 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)" + }, + "description": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/netgear/translations/zh-Hant.json b/homeassistant/components/netgear/translations/zh-Hant.json new file mode 100644 index 00000000000..a4978fbb6bc --- /dev/null +++ b/homeassistant/components/netgear/translations/zh-Hant.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "config": "\u9023\u7dda\u6216\u767b\u5165\u932f\u8aa4\uff1a\u8acb\u6aa2\u67e5\u60a8\u7684\u8a2d\u5b9a" + }, + "step": { + "user": { + "data": { + "host": "\u4e3b\u6a5f\u7aef\uff08\u9078\u9805\uff09", + "password": "\u5bc6\u78bc", + "port": "\u901a\u8a0a\u57e0\uff08\u9078\u9805\uff09", + "ssl": "\u4f7f\u7528 SSL \u8a8d\u8b49", + "username": "\u4f7f\u7528\u8005\u540d\u7a31\uff08\u9078\u9805\uff09" + }, + "description": "\u9810\u8a2d\u4e3b\u6a5f\u7aef\uff1a{host}\n\u9810\u8a2d\u901a\u8a0a\u57e0\uff1a{port}\n\u9810\u8a2d\u4f7f\u7528\u8005\u540d\u7a31\uff1a{username}", + "title": "Netgear" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "consider_home": "\u5224\u5b9a\u5728\u5bb6\u6642\u9593\uff08\u79d2\uff09" + }, + "description": "\u6307\u5b9a\u9078\u9805\u8a2d\u5b9a", + "title": "Netgear" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nfandroidtv/translations/es.json b/homeassistant/components/nfandroidtv/translations/es.json index efb7c6a5c8a..880835cfb1e 100644 --- a/homeassistant/components/nfandroidtv/translations/es.json +++ b/homeassistant/components/nfandroidtv/translations/es.json @@ -1,12 +1,17 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, "error": { + "cannot_connect": "No se pudo conectar", "unknown": "Error inesperado" }, "step": { "user": { "data": { - "host": "Anfitri\u00f3n" + "host": "Host", + "name": "Nombre" }, "description": "Esta integraci\u00f3n requiere la aplicaci\u00f3n de Notificaciones para Android TV.\n\nPara Android TV: https://play.google.com/store/apps/details?id=de.cyberdream.androidtv.notifications.google\nPara Fire TV: https://www.amazon.com/Christian-Fees-Notifications-for-Fire/dp/B00OESCXEK\n\nDebes configurar una reserva DHCP en su router (consulta el manual de usuario de tu router) o una direcci\u00f3n IP est\u00e1tica en el dispositivo. Si no, el dispositivo acabar\u00e1 por no estar disponible.", "title": "Notificaciones para Android TV / Fire TV" diff --git a/homeassistant/components/nfandroidtv/translations/hu.json b/homeassistant/components/nfandroidtv/translations/hu.json index e7dea95e4d0..c0dc8d679d6 100644 --- a/homeassistant/components/nfandroidtv/translations/hu.json +++ b/homeassistant/components/nfandroidtv/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "H\u00e1zigazda", + "host": "C\u00edm", "name": "N\u00e9v" }, "description": "Ehhez az integr\u00e1ci\u00f3hoz az \u00c9rtes\u00edt\u00e9sek az Android TV alkalmaz\u00e1shoz sz\u00fcks\u00e9ges. \n\nAndroid TV eset\u00e9n: https://play.google.com/store/apps/details?id=de.cyberdream.androidtv.notifications.google\nA Fire TV eset\u00e9ben: https://www.amazon.com/Christian-Fees-Notifications-for-Fire/dp/B00OESCXEK \n\nBe kell \u00e1ll\u00edtania a DHCP -foglal\u00e1st az \u00fatv\u00e1laszt\u00f3n (l\u00e1sd az \u00fatv\u00e1laszt\u00f3 felhaszn\u00e1l\u00f3i k\u00e9zik\u00f6nyv\u00e9t), vagy egy statikus IP -c\u00edmet az eszk\u00f6z\u00f6n. Ha nem, az eszk\u00f6z v\u00e9g\u00fcl el\u00e9rhetetlenn\u00e9 v\u00e1lik.", diff --git a/homeassistant/components/nfandroidtv/translations/id.json b/homeassistant/components/nfandroidtv/translations/id.json new file mode 100644 index 00000000000..087e25a22ae --- /dev/null +++ b/homeassistant/components/nfandroidtv/translations/id.json @@ -0,0 +1,10 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/nightscout/translations/hu.json b/homeassistant/components/nightscout/translations/hu.json index b3e5a36e172..569a4f3aca9 100644 --- a/homeassistant/components/nightscout/translations/hu.json +++ b/homeassistant/components/nightscout/translations/hu.json @@ -15,7 +15,7 @@ "api_key": "API kulcs", "url": "URL" }, - "description": "- URL: a nightcout p\u00e9ld\u00e1ny c\u00edme. Vagyis: https://myhomeassistant.duckdns.org:5423\n - API kulcs (opcion\u00e1lis): Csak akkor haszn\u00e1lja, ha a p\u00e9ld\u00e1nya v\u00e9dett (auth_default_roles! = Olvashat\u00f3).", + "description": "- URL: a nightscout p\u00e9ld\u00e1ny c\u00edme. Pl: https://myhomeassistant.duckdns.org:5423\n - API kulcs (opcion\u00e1lis): Csak akkor haszn\u00e1lja, ha a p\u00e9ld\u00e1nya v\u00e9dett (auth_default_roles != readable).", "title": "Adja meg a Nightscout szerver adatait." } } diff --git a/homeassistant/components/nightscout/translations/id.json b/homeassistant/components/nightscout/translations/id.json index 75496084bc4..147c3131213 100644 --- a/homeassistant/components/nightscout/translations/id.json +++ b/homeassistant/components/nightscout/translations/id.json @@ -15,7 +15,7 @@ "api_key": "Kunci API", "url": "URL" }, - "description": "- URL: alamat instans nightscout Anda, misalnya https://myhomeassistant.duckdns.org:5423\n- Kunci API (Opsional): Hanya gunakan jika instans Anda dilindungi (auth_default_roles != dapat dibaca).", + "description": "- URL: alamat instans nightscout Anda, misalnya https://myhomeassistant.duckdns.org:5423\n- Kunci API (opsional): Hanya gunakan jika instans Anda dilindungi (auth_default_roles != dapat dibaca).", "title": "Masukkan informasi server Nightscout Anda." } } diff --git a/homeassistant/components/nightscout/translations/no.json b/homeassistant/components/nightscout/translations/no.json index d68fe45c684..6a21b13aca7 100644 --- a/homeassistant/components/nightscout/translations/no.json +++ b/homeassistant/components/nightscout/translations/no.json @@ -15,7 +15,7 @@ "api_key": "API-n\u00f8kkel", "url": "URL" }, - "description": "- URL: Adressen til din nattscout-forekomst. F. Eks: https://myhomeassistant.duckdns.org:5423 \n- API-n\u00f8kkel (valgfritt): Bruk bare hvis forekomsten din er beskyttet (auth_default_roles! = readable).", + "description": "- URL: adressen til nightscout -forekomsten din. Dvs: https://myhomeassistant.duckdns.org:5423\n - API -n\u00f8kkel (valgfritt): Bruk bare hvis forekomsten din er beskyttet (auth_default_roles! = Lesbar).", "title": "Skriv inn informasjon om Nightscout-serveren." } } diff --git a/homeassistant/components/nmap_tracker/translations/es.json b/homeassistant/components/nmap_tracker/translations/es.json index d5c3d71321f..212b56a9606 100644 --- a/homeassistant/components/nmap_tracker/translations/es.json +++ b/homeassistant/components/nmap_tracker/translations/es.json @@ -25,6 +25,7 @@ "step": { "init": { "data": { + "consider_home": "Segundos de espera hasta que se marca un dispositivo de seguimiento como no en casa despu\u00e9s de no ser visto.", "exclude": "Direcciones de red (separadas por comas) para excluir del escaneo", "home_interval": "N\u00famero m\u00ednimo de minutos entre los escaneos de los dispositivos activos (preservar la bater\u00eda)", "hosts": "Direcciones de red (separadas por comas) para escanear", diff --git a/homeassistant/components/nmap_tracker/translations/hu.json b/homeassistant/components/nmap_tracker/translations/hu.json index e7443f41a0e..7385f12b3df 100644 --- a/homeassistant/components/nmap_tracker/translations/hu.json +++ b/homeassistant/components/nmap_tracker/translations/hu.json @@ -4,7 +4,7 @@ "already_configured": "A hely m\u00e1r konfigur\u00e1lva van" }, "error": { - "invalid_hosts": "\u00c9rv\u00e9nytelen gazdag\u00e9pek" + "invalid_hosts": "\u00c9rv\u00e9nytelen c\u00edmek" }, "step": { "user": { @@ -14,13 +14,13 @@ "hosts": "H\u00e1l\u00f3zati c\u00edmek (vessz\u0151vel elv\u00e1lasztva) a beolvas\u00e1shoz", "scan_options": "Nyersen konfigur\u00e1lhat\u00f3 szkennel\u00e9si lehet\u0151s\u00e9gek az Nmap sz\u00e1m\u00e1ra" }, - "description": "\u00c1ll\u00edtsa be a gazdag\u00e9peket, hogy az Nmap ellen\u0151rizhesse \u0151ket. A h\u00e1l\u00f3zati c\u00edm IP-c\u00edm (192.168.1.1), IP-h\u00e1l\u00f3zat (192.168.0.0/24) vagy IP-tartom\u00e1ny (192.168.1.0-32) lehet." + "description": "\u00c1ll\u00edtsa be a hogy milyen c\u00edmeket szkenneljen az Nmap. A h\u00e1l\u00f3zati c\u00edm lehet IP-c\u00edm (pl. 192.168.1.1), IP-h\u00e1l\u00f3zat (pl. 192.168.0.0/24) vagy IP-tartom\u00e1ny (pl. 192.168.1.0-32)." } } }, "options": { "error": { - "invalid_hosts": "\u00c9rv\u00e9nytelen gazdag\u00e9p" + "invalid_hosts": "\u00c9rv\u00e9nytelen c\u00edmek" }, "step": { "init": { @@ -33,7 +33,7 @@ "scan_options": "Nyersen konfigur\u00e1lhat\u00f3 beolvas\u00e1si lehet\u0151s\u00e9gek az Nmap sz\u00e1m\u00e1ra", "track_new_devices": "\u00daj eszk\u00f6z\u00f6k nyomon k\u00f6vet\u00e9se" }, - "description": "\u00c1ll\u00edtsa be a gazdag\u00e9peket, amelyeket a Nmap ellen\u0151riz. A h\u00e1l\u00f3zati c\u00edm IP-c\u00edm (192.168.1.1), IP-h\u00e1l\u00f3zat (192.168.0.0/24) vagy IP-tartom\u00e1ny (192.168.1.0-32) lehet." + "description": "\u00c1ll\u00edtsa be a hogy milyen c\u00edmeket szkenneljen az Nmap. A h\u00e1l\u00f3zati c\u00edm lehet IP-c\u00edm (pl. 192.168.1.1), IP-h\u00e1l\u00f3zat (pl. 192.168.0.0/24) vagy IP-tartom\u00e1ny (pl. 192.168.1.0-32)." } } }, diff --git a/homeassistant/components/nmap_tracker/translations/id.json b/homeassistant/components/nmap_tracker/translations/id.json index d36ba84e8ac..6c06e815565 100644 --- a/homeassistant/components/nmap_tracker/translations/id.json +++ b/homeassistant/components/nmap_tracker/translations/id.json @@ -8,6 +8,7 @@ "step": { "init": { "data": { + "interval_seconds": "Interval pindai", "track_new_devices": "Lacak perangkat baru" } } diff --git a/homeassistant/components/nmap_tracker/translations/nl.json b/homeassistant/components/nmap_tracker/translations/nl.json index e9675dfc328..8385aca1ffe 100644 --- a/homeassistant/components/nmap_tracker/translations/nl.json +++ b/homeassistant/components/nmap_tracker/translations/nl.json @@ -25,6 +25,7 @@ "step": { "init": { "data": { + "consider_home": "Aantal seconden wachten tot het markeren van een apparaattracker als niet thuis nadat hij niet is gezien.", "exclude": "Netwerkadressen (door komma's gescheiden) om uit te sluiten van scannen", "home_interval": "Minimum aantal minuten tussen scans van actieve apparaten (batterij sparen)", "hosts": "Netwerkadressen (gescheiden door komma's) om te scannen", diff --git a/homeassistant/components/nmap_tracker/translations/ru.json b/homeassistant/components/nmap_tracker/translations/ru.json index b899d63ce83..ba143e20d01 100644 --- a/homeassistant/components/nmap_tracker/translations/ru.json +++ b/homeassistant/components/nmap_tracker/translations/ru.json @@ -25,7 +25,7 @@ "step": { "init": { "data": { - "consider_home": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \"\u041d\u0435 \u0434\u043e\u043c\u0430\"", + "consider_home": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0434\u043e\u043c\u0430", "exclude": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e)", "home_interval": "\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043d\u0443\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0437\u0430\u0440\u044f\u0434\u0430 \u0431\u0430\u0442\u0430\u0440\u0435\u0438)", "hosts": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e)", diff --git a/homeassistant/components/notion/translations/ca.json b/homeassistant/components/notion/translations/ca.json index 5d89413d36f..51ca461f854 100644 --- a/homeassistant/components/notion/translations/ca.json +++ b/homeassistant/components/notion/translations/ca.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat", + "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", - "no_devices": "No s'han trobat dispositius al compte" + "no_devices": "No s'han trobat dispositius al compte", + "unknown": "Error inesperat" }, "step": { + "reauth_confirm": { + "data": { + "password": "Contrasenya" + }, + "description": "Torna a introduir la contrasenya de {username}.", + "title": "Reautenticaci\u00f3 de la integraci\u00f3" + }, "user": { "data": { "password": "Contrasenya", diff --git a/homeassistant/components/notion/translations/de.json b/homeassistant/components/notion/translations/de.json index 0b421911aa7..59ab1fdc1be 100644 --- a/homeassistant/components/notion/translations/de.json +++ b/homeassistant/components/notion/translations/de.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "Konto wurde bereits konfiguriert" + "already_configured": "Konto wurde bereits konfiguriert", + "reauth_successful": "Die erneute Authentifizierung war erfolgreich" }, "error": { "invalid_auth": "Ung\u00fcltige Authentifizierung", - "no_devices": "Keine Ger\u00e4te im Konto gefunden" + "no_devices": "Keine Ger\u00e4te im Konto gefunden", + "unknown": "Unerwarteter Fehler" }, "step": { + "reauth_confirm": { + "data": { + "password": "Passwort" + }, + "description": "Bitte gib das Passwort f\u00fcr {username} erneut ein.", + "title": "Integration erneut authentifizieren" + }, "user": { "data": { "password": "Passwort", diff --git a/homeassistant/components/notion/translations/en.json b/homeassistant/components/notion/translations/en.json index 0eb4689bce6..afd58a4d404 100644 --- a/homeassistant/components/notion/translations/en.json +++ b/homeassistant/components/notion/translations/en.json @@ -6,6 +6,7 @@ }, "error": { "invalid_auth": "Invalid authentication", + "no_devices": "No devices found in account", "unknown": "Unexpected error" }, "step": { diff --git a/homeassistant/components/notion/translations/et.json b/homeassistant/components/notion/translations/et.json index a377f1e69ab..7639901201d 100644 --- a/homeassistant/components/notion/translations/et.json +++ b/homeassistant/components/notion/translations/et.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "Konto on juba seadistatud" + "already_configured": "Konto on juba seadistatud", + "reauth_successful": "Taastuvastamine \u00f5nnestus" }, "error": { "invalid_auth": "Tuvastamise viga", - "no_devices": "Kontolt ei leitud \u00fchtegi seadet" + "no_devices": "Kontolt ei leitud \u00fchtegi seadet", + "unknown": "Ootamatu t\u00f5rge" }, "step": { + "reauth_confirm": { + "data": { + "password": "Salas\u00f5na" + }, + "description": "Sisesta uuesti {username} salas\u00f5na.", + "title": "Taastuvasta sidumine" + }, "user": { "data": { "password": "Salas\u00f5na", diff --git a/homeassistant/components/notion/translations/he.json b/homeassistant/components/notion/translations/he.json index 1a397f894cf..159db09e3b3 100644 --- a/homeassistant/components/notion/translations/he.json +++ b/homeassistant/components/notion/translations/he.json @@ -1,12 +1,20 @@ { "config": { "abort": { - "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", + "reauth_successful": "\u05d4\u05d0\u05d9\u05de\u05d5\u05ea \u05de\u05d7\u05d3\u05e9 \u05d4\u05e6\u05dc\u05d9\u05d7" }, "error": { - "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9" + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" }, "step": { + "reauth_confirm": { + "data": { + "password": "\u05e1\u05d9\u05e1\u05de\u05d4" + }, + "title": "\u05d0\u05d9\u05de\u05d5\u05ea \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05e9\u05d9\u05dc\u05d5\u05d1" + }, "user": { "data": { "password": "\u05e1\u05d9\u05e1\u05de\u05d4", diff --git a/homeassistant/components/notion/translations/hu.json b/homeassistant/components/notion/translations/hu.json index b4d57f83bb3..43f4f1f914c 100644 --- a/homeassistant/components/notion/translations/hu.json +++ b/homeassistant/components/notion/translations/hu.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van" + "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", + "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" }, "error": { "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", - "no_devices": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a fi\u00f3kban" + "no_devices": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a fi\u00f3kban", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, "step": { + "reauth_confirm": { + "data": { + "password": "Jelsz\u00f3" + }, + "description": "K\u00e9rem, adja meg ism\u00e9t {username} jelszav\u00e1t", + "title": "Integr\u00e1ci\u00f3 \u00fajrahiteles\u00edt\u00e9se" + }, "user": { "data": { "password": "Jelsz\u00f3", diff --git a/homeassistant/components/notion/translations/it.json b/homeassistant/components/notion/translations/it.json index 3304d2b395a..69d2294394b 100644 --- a/homeassistant/components/notion/translations/it.json +++ b/homeassistant/components/notion/translations/it.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "L'account \u00e8 gi\u00e0 configurato" + "already_configured": "L'account \u00e8 gi\u00e0 configurato", + "reauth_successful": "La nuova autenticazione \u00e8 stata eseguita correttamente" }, "error": { "invalid_auth": "Autenticazione non valida", - "no_devices": "Nessun dispositivo trovato nell'account" + "no_devices": "Nessun dispositivo trovato nell'account", + "unknown": "Errore imprevisto" }, "step": { + "reauth_confirm": { + "data": { + "password": "Password" + }, + "description": "Inserisci nuovamente la password per {username}.", + "title": "Autenticare nuovamente l'integrazione" + }, "user": { "data": { "password": "Password", diff --git a/homeassistant/components/notion/translations/nl.json b/homeassistant/components/notion/translations/nl.json index acb42046c90..81da85f6240 100644 --- a/homeassistant/components/notion/translations/nl.json +++ b/homeassistant/components/notion/translations/nl.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "Account is al geconfigureerd" + "already_configured": "Account is al geconfigureerd", + "reauth_successful": "Herauthenticatie was succesvol" }, "error": { "invalid_auth": "Ongeldige authenticatie", - "no_devices": "Geen apparaten gevonden in account" + "no_devices": "Geen apparaten gevonden in account", + "unknown": "Onverwachte fout" }, "step": { + "reauth_confirm": { + "data": { + "password": "Wachtwoord" + }, + "description": "Voer het wachtwoord voor {username} opnieuw in.", + "title": "Verifieer de integratie opnieuw" + }, "user": { "data": { "password": "Wachtwoord", diff --git a/homeassistant/components/notion/translations/no.json b/homeassistant/components/notion/translations/no.json index c1d8a1d17b5..0bbbeb9c0dd 100644 --- a/homeassistant/components/notion/translations/no.json +++ b/homeassistant/components/notion/translations/no.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "Kontoen er allerede konfigurert" + "already_configured": "Kontoen er allerede konfigurert", + "reauth_successful": "Godkjenning p\u00e5 nytt var vellykket" }, "error": { "invalid_auth": "Ugyldig godkjenning", - "no_devices": "Ingen enheter funnet i kontoen" + "no_devices": "Ingen enheter funnet i kontoen", + "unknown": "Uventet feil" }, "step": { + "reauth_confirm": { + "data": { + "password": "Passord" + }, + "description": "Skriv inn passordet for {username} p\u00e5 nytt.", + "title": "Godkjenne integrering p\u00e5 nytt" + }, "user": { "data": { "password": "Passord", diff --git a/homeassistant/components/notion/translations/ru.json b/homeassistant/components/notion/translations/ru.json index 4b9a45bbf3f..bebd8a66e0e 100644 --- a/homeassistant/components/notion/translations/ru.json +++ b/homeassistant/components/notion/translations/ru.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant." + "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant.", + "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e." }, "error": { "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", - "no_devices": "\u041d\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e." + "no_devices": "\u041d\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c\u044e.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." }, "step": { + "reauth_confirm": { + "data": { + "password": "\u041f\u0430\u0440\u043e\u043b\u044c" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {username}.", + "title": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f" + }, "user": { "data": { "password": "\u041f\u0430\u0440\u043e\u043b\u044c", diff --git a/homeassistant/components/notion/translations/zh-Hant.json b/homeassistant/components/notion/translations/zh-Hant.json index 865bd1dbd08..951ec07c8ad 100644 --- a/homeassistant/components/notion/translations/zh-Hant.json +++ b/homeassistant/components/notion/translations/zh-Hant.json @@ -1,13 +1,22 @@ { "config": { "abort": { - "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f" }, "error": { "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", - "no_devices": "\u5e33\u865f\u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u88dd\u7f6e" + "no_devices": "\u5e33\u865f\u4e2d\u627e\u4e0d\u5230\u4efb\u4f55\u88dd\u7f6e", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" }, "step": { + "reauth_confirm": { + "data": { + "password": "\u5bc6\u78bc" + }, + "description": "\u8acb\u8f38\u5165 {username} \u5bc6\u78bc\u3002", + "title": "\u91cd\u65b0\u8a8d\u8b49\u6574\u5408" + }, "user": { "data": { "password": "\u5bc6\u78bc", diff --git a/homeassistant/components/nuheat/translations/de.json b/homeassistant/components/nuheat/translations/de.json index 0ab69dd4557..682867d5404 100644 --- a/homeassistant/components/nuheat/translations/de.json +++ b/homeassistant/components/nuheat/translations/de.json @@ -16,7 +16,7 @@ "serial_number": "Seriennummer des Thermostats.", "username": "Benutzername" }, - "description": "Du musst die numerische Seriennummer oder ID deines Thermostats erhalten, indem du dich bei https://MyNuHeat.com anmeldest und deine Thermostate ausw\u00e4hlst.", + "description": "Du musst die numerische Seriennummer oder ID deines Thermostats erhalten, indem du dich bei https://MyNuHeat.com anmeldest und dein(e) Thermostat(e) ausw\u00e4hlst.", "title": "Stelle eine Verbindung zu NuHeat her" } } diff --git a/homeassistant/components/nuki/translations/hu.json b/homeassistant/components/nuki/translations/hu.json index 7a0b6b6159e..a5da7700b6f 100644 --- a/homeassistant/components/nuki/translations/hu.json +++ b/homeassistant/components/nuki/translations/hu.json @@ -18,7 +18,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port", "token": "Hozz\u00e1f\u00e9r\u00e9si token" } diff --git a/homeassistant/components/nut/translations/hu.json b/homeassistant/components/nut/translations/hu.json index bfc8e01c11a..aa8f7c37105 100644 --- a/homeassistant/components/nut/translations/hu.json +++ b/homeassistant/components/nut/translations/hu.json @@ -23,7 +23,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" diff --git a/homeassistant/components/nws/translations/hu.json b/homeassistant/components/nws/translations/hu.json index ec9bf3f4988..4533733e866 100644 --- a/homeassistant/components/nws/translations/hu.json +++ b/homeassistant/components/nws/translations/hu.json @@ -16,7 +16,7 @@ "station": "METAR \u00e1llom\u00e1s k\u00f3dja" }, "description": "Ha a METAR \u00e1llom\u00e1s k\u00f3dja nincs megadva, a sz\u00e9less\u00e9gi \u00e9s hossz\u00fas\u00e1gi fokokat haszn\u00e1lja a legk\u00f6zelebbi \u00e1llom\u00e1s megkeres\u00e9s\u00e9hez. Egyel\u0151re az API-kulcs b\u00e1rmi lehet. Javasoljuk, hogy \u00e9rv\u00e9nyes e -mail c\u00edmet haszn\u00e1ljon.", - "title": "Csatlakozzon az National Weather Service-hez" + "title": "Csatlakoz\u00e1s az National Weather Service-hez" } } } diff --git a/homeassistant/components/nzbget/translations/hu.json b/homeassistant/components/nzbget/translations/hu.json index 829fa03fe8e..6db44f83c28 100644 --- a/homeassistant/components/nzbget/translations/hu.json +++ b/homeassistant/components/nzbget/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v", "password": "Jelsz\u00f3", "port": "Port", diff --git a/homeassistant/components/nzbget/translations/id.json b/homeassistant/components/nzbget/translations/id.json index af096f4ef5f..585d50dc2f0 100644 --- a/homeassistant/components/nzbget/translations/id.json +++ b/homeassistant/components/nzbget/translations/id.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "NZBGet: {name}", + "flow_title": "{name}", "step": { "user": { "data": { diff --git a/homeassistant/components/ondilo_ico/translations/hu.json b/homeassistant/components/ondilo_ico/translations/hu.json index cae1f6d20c0..a6979721779 100644 --- a/homeassistant/components/ondilo_ico/translations/hu.json +++ b/homeassistant/components/ondilo_ico/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t." + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t." }, "create_entry": { "default": "Sikeres hiteles\u00edt\u00e9s" diff --git a/homeassistant/components/onewire/translations/hu.json b/homeassistant/components/onewire/translations/hu.json index e2c7ffa8c03..4d53659788d 100644 --- a/homeassistant/components/onewire/translations/hu.json +++ b/homeassistant/components/onewire/translations/hu.json @@ -10,7 +10,7 @@ "step": { "owserver": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "Owserver adatok be\u00e1ll\u00edt\u00e1sa" diff --git a/homeassistant/components/onvif/translations/hu.json b/homeassistant/components/onvif/translations/hu.json index c43df53ae9f..f0df008f145 100644 --- a/homeassistant/components/onvif/translations/hu.json +++ b/homeassistant/components/onvif/translations/hu.json @@ -2,10 +2,10 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", - "no_h264": "Nem voltak el\u00e9rhet\u0151 H264 streamek. Ellen\u0151rizd a profil konfigur\u00e1ci\u00f3j\u00e1t a k\u00e9sz\u00fcl\u00e9ken.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", + "no_h264": "Nem voltak el\u00e9rhet\u0151 H264 streamek. Ellen\u0151rizze a profil konfigur\u00e1ci\u00f3j\u00e1t a k\u00e9sz\u00fcl\u00e9ken.", "no_mac": "Nem siker\u00fclt konfigur\u00e1lni az egyedi azonos\u00edt\u00f3t az ONVIF eszk\u00f6zh\u00f6z.", - "onvif_error": "Hiba t\u00f6rt\u00e9nt az ONVIF eszk\u00f6z be\u00e1ll\u00edt\u00e1sakor. Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt ellen\u0151rizd a napl\u00f3kat." + "onvif_error": "Hiba t\u00f6rt\u00e9nt az ONVIF eszk\u00f6z be\u00e1ll\u00edt\u00e1sakor. Tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt ellen\u0151rizze a napl\u00f3kat." }, "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s" @@ -20,7 +20,7 @@ }, "configure": { "data": { - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "name": "N\u00e9v", "password": "Jelsz\u00f3", "port": "Port", @@ -37,13 +37,13 @@ }, "device": { "data": { - "host": "V\u00e1laszd ki a felfedezett ONVIF eszk\u00f6zt" + "host": "V\u00e1lassza ki a felfedezett ONVIF eszk\u00f6zt" }, "title": "ONVIF eszk\u00f6z kiv\u00e1laszt\u00e1sa" }, "manual_input": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v", "port": "Port" }, @@ -53,7 +53,7 @@ "data": { "auto": "Automatikus keres\u00e9s" }, - "description": "A k\u00fcld\u00e9s gombra kattintva olyan ONVIF-eszk\u00f6z\u00f6ket keres\u00fcnk a h\u00e1l\u00f3zat\u00e1ban, amelyek t\u00e1mogatj\u00e1k az S profilt.\n\nEgyes gy\u00e1rt\u00f3k alap\u00e9rtelmez\u00e9s szerint elkezdt\u00e9k letiltani az ONVIF-et. Ellen\u0151rizze, hogy az ONVIF enged\u00e9lyezve van-e a kamera konfigur\u00e1ci\u00f3j\u00e1ban.", + "description": "A K\u00fcld\u00e9s gombra kattintva olyan ONVIF-eszk\u00f6z\u00f6ket keres\u00fcnk a h\u00e1l\u00f3zat\u00e1ban, amelyek t\u00e1mogatj\u00e1k az S profilt.\n\nEgyes gy\u00e1rt\u00f3k alap\u00e9rtelmez\u00e9s szerint elkezdt\u00e9k letiltani az ONVIF-et. Ellen\u0151rizze, hogy az ONVIF enged\u00e9lyezve van-e a kamera konfigur\u00e1ci\u00f3j\u00e1ban.", "title": "ONVIF eszk\u00f6z be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/onvif/translations/id.json b/homeassistant/components/onvif/translations/id.json index 3ed50ae63c4..6fcb49dcd99 100644 --- a/homeassistant/components/onvif/translations/id.json +++ b/homeassistant/components/onvif/translations/id.json @@ -18,6 +18,15 @@ }, "title": "Konfigurasikan autentikasi" }, + "configure": { + "data": { + "host": "Host", + "name": "Nama", + "password": "Kata Sandi", + "port": "Port", + "username": "Nama Pengguna" + } + }, "configure_profile": { "data": { "include": "Buat entitas kamera" diff --git a/homeassistant/components/opengarage/translations/ca.json b/homeassistant/components/opengarage/translations/ca.json new file mode 100644 index 00000000000..6a8e611b188 --- /dev/null +++ b/homeassistant/components/opengarage/translations/ca.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat" + }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "device_key": "Clau del dispositiu", + "host": "Amfitri\u00f3", + "port": "Port", + "verify_ssl": "Verifica el certificat SSL" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/de.json b/homeassistant/components/opengarage/translations/de.json new file mode 100644 index 00000000000..4e39620a9a9 --- /dev/null +++ b/homeassistant/components/opengarage/translations/de.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "device_key": "Ger\u00e4teschl\u00fcssel", + "host": "Host", + "port": "Port", + "verify_ssl": "SSL-Zertifikat \u00fcberpr\u00fcfen" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/en.json b/homeassistant/components/opengarage/translations/en.json new file mode 100644 index 00000000000..9a103e2a1c0 --- /dev/null +++ b/homeassistant/components/opengarage/translations/en.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Device is already configured" + }, + "error": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "device_key": "Device key", + "host": "Host", + "port": "Port", + "verify_ssl": "Verify SSL certificate" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/es.json b/homeassistant/components/opengarage/translations/es.json new file mode 100644 index 00000000000..77ca2a2d001 --- /dev/null +++ b/homeassistant/components/opengarage/translations/es.json @@ -0,0 +1,11 @@ +{ + "config": { + "step": { + "user": { + "data": { + "device_key": "Clave del dispositivo" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/et.json b/homeassistant/components/opengarage/translations/et.json new file mode 100644 index 00000000000..eb25c27492b --- /dev/null +++ b/homeassistant/components/opengarage/translations/et.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud" + }, + "error": { + "cannot_connect": "\u00dchendamine nurjus", + "invalid_auth": "Tuvastamnie nurjus", + "unknown": "Ootamatu t\u00f5rge" + }, + "step": { + "user": { + "data": { + "device_key": "Seadme v\u00f5ti", + "host": "Host", + "port": "Port", + "verify_ssl": "Kontrolli SSL serti" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/hu.json b/homeassistant/components/opengarage/translations/hu.json new file mode 100644 index 00000000000..2c7687261c8 --- /dev/null +++ b/homeassistant/components/opengarage/translations/hu.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van" + }, + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s", + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" + }, + "step": { + "user": { + "data": { + "device_key": "Eszk\u00f6zkulcs", + "host": "C\u00edm", + "port": "Port", + "verify_ssl": "SSL-tan\u00fas\u00edtv\u00e1ny ellen\u0151rz\u00e9se" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/it.json b/homeassistant/components/opengarage/translations/it.json new file mode 100644 index 00000000000..0bd8adf23e0 --- /dev/null +++ b/homeassistant/components/opengarage/translations/it.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato" + }, + "error": { + "cannot_connect": "Impossibile connettersi", + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "device_key": "Chiave del dispositivo", + "host": "Host", + "port": "Porta", + "verify_ssl": "Verificare il certificato SSL" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/nl.json b/homeassistant/components/opengarage/translations/nl.json new file mode 100644 index 00000000000..96190a06817 --- /dev/null +++ b/homeassistant/components/opengarage/translations/nl.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Apparaat is al geconfigureerd" + }, + "error": { + "cannot_connect": "Kan geen verbinding maken", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, + "step": { + "user": { + "data": { + "device_key": "Apparaatsleutel", + "host": "Host", + "port": "Poort", + "verify_ssl": "SSL-certificaat verifi\u00ebren" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/no.json b/homeassistant/components/opengarage/translations/no.json new file mode 100644 index 00000000000..5c5189a9de9 --- /dev/null +++ b/homeassistant/components/opengarage/translations/no.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert" + }, + "error": { + "cannot_connect": "Tilkobling mislyktes", + "invalid_auth": "Ugyldig godkjenning", + "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "device_key": "Enhetsn\u00f8kkel", + "host": "Vert", + "port": "Port", + "verify_ssl": "Verifisere SSL-sertifikat" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/ru.json b/homeassistant/components/opengarage/translations/ru.json new file mode 100644 index 00000000000..85f528778bf --- /dev/null +++ b/homeassistant/components/opengarage/translations/ru.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant." + }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "device_key": "\u041a\u043b\u044e\u0447 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "host": "\u0425\u043e\u0441\u0442", + "port": "\u041f\u043e\u0440\u0442", + "verify_ssl": "\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 SSL" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/zh-Hant.json b/homeassistant/components/opengarage/translations/zh-Hant.json new file mode 100644 index 00000000000..fffbd19b551 --- /dev/null +++ b/homeassistant/components/opengarage/translations/zh-Hant.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "device_key": "\u88dd\u7f6e\u5bc6\u9470", + "host": "\u4e3b\u6a5f\u7aef", + "port": "\u901a\u8a0a\u57e0", + "verify_ssl": "\u78ba\u8a8d SSL \u8a8d\u8b49" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/openuv/translations/es.json b/homeassistant/components/openuv/translations/es.json index c912cef6c54..014eba04f52 100644 --- a/homeassistant/components/openuv/translations/es.json +++ b/homeassistant/components/openuv/translations/es.json @@ -21,6 +21,10 @@ "options": { "step": { "init": { + "data": { + "from_window": "\u00cdndice UV inicial para la ventana de protecci\u00f3n", + "to_window": "\u00cdndice UV final para la ventana de protecci\u00f3n" + }, "title": "Configurar OpenUV" } } diff --git a/homeassistant/components/openuv/translations/nl.json b/homeassistant/components/openuv/translations/nl.json index 0129e24e304..bd56a1fa4e0 100644 --- a/homeassistant/components/openuv/translations/nl.json +++ b/homeassistant/components/openuv/translations/nl.json @@ -21,6 +21,10 @@ "options": { "step": { "init": { + "data": { + "from_window": "Uv-index starten voor het beschermingsvenster", + "to_window": "Uv-index voor het beveiligingsvenster be\u00ebindigen" + }, "title": "Configureer OpenUV" } } diff --git a/homeassistant/components/openweathermap/translations/hu.json b/homeassistant/components/openweathermap/translations/hu.json index 2fd2f0acc7a..99932ff5c68 100644 --- a/homeassistant/components/openweathermap/translations/hu.json +++ b/homeassistant/components/openweathermap/translations/hu.json @@ -17,7 +17,7 @@ "mode": "M\u00f3d", "name": "Az integr\u00e1ci\u00f3 neve" }, - "description": "Az OpenWeatherMap integr\u00e1ci\u00f3 be\u00e1ll\u00edt\u00e1sa. Az API kulcs l\u00e9trehoz\u00e1s\u00e1hoz menj az https://openweathermap.org/appid oldalra", + "description": "Az OpenWeatherMap integr\u00e1ci\u00f3 be\u00e1ll\u00edt\u00e1sa. Az API kulcs l\u00e9trehoz\u00e1s\u00e1hoz l\u00e1togasson el a https://openweathermap.org/appid oldalra", "title": "OpenWeatherMap" } } diff --git a/homeassistant/components/ovo_energy/translations/ca.json b/homeassistant/components/ovo_energy/translations/ca.json index f8552caa86b..0d0677ec522 100644 --- a/homeassistant/components/ovo_energy/translations/ca.json +++ b/homeassistant/components/ovo_energy/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "error": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "cannot_connect": "Ha fallat la connexi\u00f3", "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida" }, diff --git a/homeassistant/components/ovo_energy/translations/id.json b/homeassistant/components/ovo_energy/translations/id.json index 05c38f244e7..fa072b59236 100644 --- a/homeassistant/components/ovo_energy/translations/id.json +++ b/homeassistant/components/ovo_energy/translations/id.json @@ -5,7 +5,7 @@ "cannot_connect": "Gagal terhubung", "invalid_auth": "Autentikasi tidak valid" }, - "flow_title": "OVO Energy: {username}", + "flow_title": "{username}", "step": { "reauth": { "data": { diff --git a/homeassistant/components/owntracks/translations/hu.json b/homeassistant/components/owntracks/translations/hu.json index f103fc9bbe1..84a40a1a593 100644 --- a/homeassistant/components/owntracks/translations/hu.json +++ b/homeassistant/components/owntracks/translations/hu.json @@ -4,11 +4,11 @@ "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, "create_entry": { - "default": "\n\nAndroidon, nyisd meg [az OwnTracks appot]({android_url}), menj a preferences -> connectionre. V\u00e1ltoztasd meg a al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\niOS-en, nyisd meg [az OwnTracks appot]({ios_url}), kattints az (i) ikonra bal oldalon fel\u00fcl -> settings. V\u00e1ltoztasd meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: ``\n\n{secret}\n\nN\u00e9zd meg [a dokument\u00e1ci\u00f3t]({docs_url}) tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt." + "default": "\n\nAndroidon, nyissa meg [az OwnTracks appot]({android_url}), majd v\u00e1lassza ki a Preferences -> Connection men\u00fct. V\u00e1ltoztassa meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: Private HTTP\n - Host: {webhook_url}\n - Identification:\n - Username: ``\n - Device ID: ``\n\niOS-en, nyissa meg [az OwnTracks appot]({ios_url}), kattintson az (i) ikonra bal oldalon fel\u00fcl -> settings. V\u00e1ltoztassa meg az al\u00e1bbi be\u00e1ll\u00edt\u00e1sokat:\n - Mode: HTTP\n - URL: {webhook_url}\n - Turn on authentication\n - UserID: ``\n\n{secret}\n\nN\u00e9zze meg [a dokument\u00e1ci\u00f3t]({docs_url}) tov\u00e1bbi inform\u00e1ci\u00f3k\u00e9rt." }, "step": { "user": { - "description": "Biztosan be szeretn\u00e9d \u00e1ll\u00edtani az Owntracks-t?", + "description": "Biztos benne, hogy be szeretn\u00e9 \u00e1ll\u00edtani az Owntracks-t?", "title": "Owntracks be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/ozw/translations/ca.json b/homeassistant/components/ozw/translations/ca.json index 835c16eb449..9c9fc17e58e 100644 --- a/homeassistant/components/ozw/translations/ca.json +++ b/homeassistant/components/ozw/translations/ca.json @@ -32,7 +32,7 @@ "start_addon": { "data": { "network_key": "Clau de xarxa", - "usb_path": "Ruta del port USB del dispositiu" + "usb_path": "Ruta del dispositiu USB" }, "title": "Introdueix la configuraci\u00f3 del complement OpenZWave" } diff --git a/homeassistant/components/ozw/translations/hu.json b/homeassistant/components/ozw/translations/hu.json index a43f234c909..06d921c86d3 100644 --- a/homeassistant/components/ozw/translations/hu.json +++ b/homeassistant/components/ozw/translations/hu.json @@ -5,7 +5,7 @@ "addon_install_failed": "Nem siker\u00fclt telep\u00edteni az OpenZWave b\u0151v\u00edtm\u00e9nyt.", "addon_set_config_failed": "Nem siker\u00fclt be\u00e1ll\u00edtani az OpenZWave konfigur\u00e1ci\u00f3t.", "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "mqtt_required": "Az MQTT integr\u00e1ci\u00f3 nincs be\u00e1ll\u00edtva", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, @@ -26,8 +26,8 @@ "data": { "use_addon": "Haszn\u00e1ld az OpenZWave Supervisor b\u0151v\u00edtm\u00e9nyt" }, - "description": "Szeretn\u00e9d haszn\u00e1lni az OpenZWave Supervisor b\u0151v\u00edtm\u00e9nyt?", - "title": "V\u00e1laszd ki a csatlakoz\u00e1si m\u00f3dot" + "description": "Szeretn\u00e9 haszn\u00e1lni az OpenZWave Supervisor b\u0151v\u00edtm\u00e9nyt?", + "title": "V\u00e1lassza ki a csatlakoz\u00e1si m\u00f3dot" }, "start_addon": { "data": { diff --git a/homeassistant/components/p1_monitor/translations/es.json b/homeassistant/components/p1_monitor/translations/es.json index 023a2a9f17c..5c8552d224b 100644 --- a/homeassistant/components/p1_monitor/translations/es.json +++ b/homeassistant/components/p1_monitor/translations/es.json @@ -1,12 +1,13 @@ { "config": { "error": { + "cannot_connect": "No se pudo conectar", "unknown": "Error inesperado" }, "step": { "user": { "data": { - "host": "Anfitri\u00f3n", + "host": "Host", "name": "Nombre" } } diff --git a/homeassistant/components/p1_monitor/translations/hu.json b/homeassistant/components/p1_monitor/translations/hu.json index 80d00e51571..f9025022c6d 100644 --- a/homeassistant/components/p1_monitor/translations/hu.json +++ b/homeassistant/components/p1_monitor/translations/hu.json @@ -7,7 +7,7 @@ "step": { "user": { "data": { - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "name": "N\u00e9v" }, "description": "\u00c1ll\u00edtsa be a P1 monitort az Otthoni asszisztenssel val\u00f3 integr\u00e1ci\u00f3hoz." diff --git a/homeassistant/components/p1_monitor/translations/id.json b/homeassistant/components/p1_monitor/translations/id.json new file mode 100644 index 00000000000..8c96f3ee6cb --- /dev/null +++ b/homeassistant/components/p1_monitor/translations/id.json @@ -0,0 +1,16 @@ +{ + "config": { + "error": { + "cannot_connect": "Gagal terhubung", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "host": "Host", + "name": "Nama" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/panasonic_viera/translations/hu.json b/homeassistant/components/panasonic_viera/translations/hu.json index df520bb1ca5..e373a352a45 100644 --- a/homeassistant/components/panasonic_viera/translations/hu.json +++ b/homeassistant/components/panasonic_viera/translations/hu.json @@ -14,7 +14,7 @@ "data": { "pin": "PIN-k\u00f3d" }, - "description": "Add meg a TV-k\u00e9sz\u00fcl\u00e9ken megjelen\u0151 PIN-k\u00f3dot", + "description": "Adja meg a TV-k\u00e9sz\u00fcl\u00e9ken megjelen\u0151 PIN-k\u00f3dot", "title": "P\u00e1ros\u00edt\u00e1s" }, "user": { @@ -22,7 +22,7 @@ "host": "IP c\u00edm", "name": "N\u00e9v" }, - "description": "Add meg a Panasonic Viera TV-hez tartoz\u00f3 IP c\u00edmet", + "description": "Adja meg a Panasonic Viera TV-hez tartoz\u00f3 IP c\u00edmet", "title": "A TV be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/philips_js/translations/hu.json b/homeassistant/components/philips_js/translations/hu.json index 1fe4811d21e..544b44ee8ee 100644 --- a/homeassistant/components/philips_js/translations/hu.json +++ b/homeassistant/components/philips_js/translations/hu.json @@ -20,7 +20,7 @@ "user": { "data": { "api_version": "API Verzi\u00f3", - "host": "Hoszt" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/pi_hole/translations/hu.json b/homeassistant/components/pi_hole/translations/hu.json index a8f8563da41..71321c4cf85 100644 --- a/homeassistant/components/pi_hole/translations/hu.json +++ b/homeassistant/components/pi_hole/translations/hu.json @@ -15,7 +15,7 @@ "user": { "data": { "api_key": "API kulcs", - "host": "Hoszt", + "host": "C\u00edm", "location": "Elhelyezked\u00e9s", "name": "N\u00e9v", "port": "Port", diff --git a/homeassistant/components/picnic/translations/id.json b/homeassistant/components/picnic/translations/id.json index 0455a5b3b5e..819125c6909 100644 --- a/homeassistant/components/picnic/translations/id.json +++ b/homeassistant/components/picnic/translations/id.json @@ -1,6 +1,11 @@ { "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, "step": { diff --git a/homeassistant/components/picnic/translations/ko.json b/homeassistant/components/picnic/translations/ko.json new file mode 100644 index 00000000000..fe58774c459 --- /dev/null +++ b/homeassistant/components/picnic/translations/ko.json @@ -0,0 +1,21 @@ +{ + "config": { + "abort": { + "already_configured": "\uae30\uae30\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + }, + "error": { + "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4", + "invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4" + }, + "step": { + "user": { + "data": { + "country_code": "\uad6d\uac00 \ucf54\ub4dc", + "password": "\ube44\ubc00\ubc88\ud638", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/plaato/translations/ca.json b/homeassistant/components/plaato/translations/ca.json index c4669b219ab..06aa27e5b37 100644 --- a/homeassistant/components/plaato/translations/ca.json +++ b/homeassistant/components/plaato/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "single_instance_allowed": "Ja configurat. Nom\u00e9s \u00e9s possible una sola configuraci\u00f3.", "webhook_not_internet_accessible": "La teva inst\u00e0ncia de Home Assistant ha de ser accessible des d'Internet per poder rebre missatges webhook." }, diff --git a/homeassistant/components/plaato/translations/es.json b/homeassistant/components/plaato/translations/es.json index e0b6c767043..d38bf2a8265 100644 --- a/homeassistant/components/plaato/translations/es.json +++ b/homeassistant/components/plaato/translations/es.json @@ -6,7 +6,7 @@ "webhook_not_internet_accessible": "Tu instancia de Home Assistant debe estar accesible desde Internet para recibir mensajes webhook." }, "create_entry": { - "default": "Para enviar eventos a Home Assistant, necesitar\u00e1s configurar la funci\u00f3n de webhook en Plaato Airlock.\n\nCompleta la siguiente informaci\u00f3n:\n\n- URL: `{webhook_url}`\n- M\u00e9todo: POST\n\nEcha un vistazo a [la documentaci\u00f3n]({docs_url}) para m\u00e1s detalles." + "default": "\u00a1Tu Plaato {device_type} con nombre **{device_name}** se configur\u00f3 correctamente!" }, "error": { "invalid_webhook_device": "Has seleccionado un dispositivo que no admite el env\u00edo de datos a un webhook. Solo est\u00e1 disponible para Airlock", diff --git a/homeassistant/components/plaato/translations/hu.json b/homeassistant/components/plaato/translations/hu.json index 4778b41e8be..a25c0c35672 100644 --- a/homeassistant/components/plaato/translations/hu.json +++ b/homeassistant/components/plaato/translations/hu.json @@ -3,7 +3,7 @@ "abort": { "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { "default": "A Plaato {device_type} **{device_name}** n\u00e9vvel sikeresen telep\u00edtve lett!" @@ -27,11 +27,11 @@ "device_name": "Eszk\u00f6z neve", "device_type": "A Plaato eszk\u00f6z t\u00edpusa" }, - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?", + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?", "title": "A Plaato eszk\u00f6z\u00f6k be\u00e1ll\u00edt\u00e1sa" }, "webhook": { - "description": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a webhook funkci\u00f3t a Plaato Airlock-ban. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: \" {webhook_url} \"\n - M\u00f3dszer: POST \n\n Tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1sd a [dokument\u00e1ci\u00f3t] ( {docs_url} ).", + "description": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a webhook funkci\u00f3t a Plaato Airlock-ban. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: \" {webhook_url} \"\n - M\u00f3dszer: POST \n\n Tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1ssa a [dokument\u00e1ci\u00f3t]({docs_url}).", "title": "Haszn\u00e1land\u00f3 webhook" } } diff --git a/homeassistant/components/plaato/translations/nl.json b/homeassistant/components/plaato/translations/nl.json index 23fae52b020..7dc3eaf6fb7 100644 --- a/homeassistant/components/plaato/translations/nl.json +++ b/homeassistant/components/plaato/translations/nl.json @@ -27,7 +27,7 @@ "device_name": "Geef uw apparaat een naam", "device_type": "Type Plaato-apparaat" }, - "description": "Wil je beginnen met instellen?", + "description": "Wilt u beginnen met instellen?", "title": "Stel de Plaato-apparaten in" }, "webhook": { diff --git a/homeassistant/components/plant/translations/hu.json b/homeassistant/components/plant/translations/hu.json index 3206ef7064d..ad2061411f5 100644 --- a/homeassistant/components/plant/translations/hu.json +++ b/homeassistant/components/plant/translations/hu.json @@ -5,5 +5,5 @@ "problem": "Probl\u00e9ma" } }, - "title": "N\u00f6v\u00e9ny" + "title": "N\u00f6v\u00e9nyfigyel\u0151" } \ No newline at end of file diff --git a/homeassistant/components/plex/translations/hu.json b/homeassistant/components/plex/translations/hu.json index c0ecbe3e02c..cde11b9c7cc 100644 --- a/homeassistant/components/plex/translations/hu.json +++ b/homeassistant/components/plex/translations/hu.json @@ -3,15 +3,15 @@ "abort": { "all_configured": "Az \u00f6sszes \u00f6sszekapcsolt szerver m\u00e1r konfigur\u00e1lva van", "already_configured": "Ez a Plex szerver m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt", "token_request_timeout": "Token k\u00e9r\u00e9sre sz\u00e1nt id\u0151 lej\u00e1rt", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, "error": { - "faulty_credentials": "A hiteles\u00edt\u00e9s sikertelen", - "host_or_token": "Legal\u00e1bb egyet kell megadnia a Gazdag\u00e9p vagy a Token k\u00f6z\u00fcl", - "no_servers": "Nincs szerver csatlakoztatva a fi\u00f3khoz", + "faulty_credentials": "A hiteles\u00edt\u00e9s sikertelen, k\u00e9rem, ellen\u0151rizze a token-t", + "host_or_token": "Legal\u00e1bb egyet kell megadnia a C\u00edm vagy a Token k\u00f6z\u00fcl", + "no_servers": "Nincsenek Plex-fi\u00f3khoz kapcsol\u00f3d\u00f3 kiszolg\u00e1l\u00f3k", "not_found": "A Plex szerver nem tal\u00e1lhat\u00f3", "ssl_error": "SSL tan\u00fas\u00edtv\u00e1ny probl\u00e9ma" }, @@ -19,7 +19,7 @@ "step": { "manual_setup": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port", "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata", "token": "Token (opcion\u00e1lis)", diff --git a/homeassistant/components/plugwise/translations/id.json b/homeassistant/components/plugwise/translations/id.json index 9047bf477bd..f3eeb0926ba 100644 --- a/homeassistant/components/plugwise/translations/id.json +++ b/homeassistant/components/plugwise/translations/id.json @@ -8,7 +8,7 @@ "invalid_auth": "Autentikasi tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Smile: {name}", + "flow_title": "{name}", "step": { "user": { "data": { diff --git a/homeassistant/components/plum_lightpad/translations/ca.json b/homeassistant/components/plum_lightpad/translations/ca.json index 86f649d57d7..c1854b868e6 100644 --- a/homeassistant/components/plum_lightpad/translations/ca.json +++ b/homeassistant/components/plum_lightpad/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "cannot_connect": "Ha fallat la connexi\u00f3" diff --git a/homeassistant/components/point/translations/he.json b/homeassistant/components/point/translations/he.json index 24decb09dd8..a226a9e4c6d 100644 --- a/homeassistant/components/point/translations/he.json +++ b/homeassistant/components/point/translations/he.json @@ -3,7 +3,8 @@ "abort": { "already_setup": "\u05ea\u05e6\u05d5\u05e8\u05ea\u05d5 \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e8\u05e7 \u05ea\u05e6\u05d5\u05e8\u05d4 \u05d0\u05d7\u05ea \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea.", "authorize_url_timeout": "\u05e4\u05e1\u05e7 \u05d6\u05de\u05df \u05dc\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05dc\u05d0\u05d9\u05e9\u05d5\u05e8.", - "no_flows": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05e8\u05db\u05d9\u05d1 \u05dc\u05d0 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e0\u05d0 \u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8 \u05d4\u05ea\u05d9\u05e2\u05d5\u05d3." + "no_flows": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05e8\u05db\u05d9\u05d1 \u05dc\u05d0 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e0\u05d0 \u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8 \u05d4\u05ea\u05d9\u05e2\u05d5\u05d3.", + "unknown_authorize_url_generation": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2\u05d4 \u05d1\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05d4\u05e8\u05e9\u05d0\u05d4." }, "create_entry": { "default": "\u05d0\u05d5\u05de\u05ea \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4" diff --git a/homeassistant/components/point/translations/hu.json b/homeassistant/components/point/translations/hu.json index 17dc73a189b..c582bbfc7cd 100644 --- a/homeassistant/components/point/translations/hu.json +++ b/homeassistant/components/point/translations/hu.json @@ -4,26 +4,26 @@ "already_setup": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", "external_setup": "A pont sikeresen konfigur\u00e1lva van egy m\u00e1sik folyamatb\u00f3l.", - "no_flows": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "no_flows": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "unknown_authorize_url_generation": "Ismeretlen hiba t\u00f6rt\u00e9nt a hiteles\u00edt\u00e9si link gener\u00e1l\u00e1sa sor\u00e1n." }, "create_entry": { "default": "Sikeres hiteles\u00edt\u00e9s" }, "error": { - "follow_link": "K\u00e9rlek, k\u00f6vesd a hivatkoz\u00e1st \u00e9s hiteles\u00edtsd magad miel\u0151tt megnyomod a K\u00fcld\u00e9s gombot", + "follow_link": "K\u00e9rem, k\u00f6vesse a hivatkoz\u00e1st \u00e9s hiteles\u00edtse mag\u00e1t miel\u0151tt megnyomn\u00e1 a K\u00fcld\u00e9s gombot", "no_token": "\u00c9rv\u00e9nytelen hozz\u00e1f\u00e9r\u00e9si token" }, "step": { "auth": { - "description": "K\u00e9rlek k\u00f6vesd az al\u00e1bbi linket \u00e9s a **Fogadd el** a hozz\u00e1f\u00e9r\u00e9st a Minut fi\u00f3kj\u00e1hoz, majd t\u00e9rj vissza \u00e9s nyomd meg a **K\u00fcld\u00e9s ** gombot. \n\n [Link]({authorization_url})", + "description": "K\u00e9rem k\u00f6vesse az al\u00e1bbi linket \u00e9s a **Fogadja el** a hozz\u00e1f\u00e9r\u00e9st a Minut fi\u00f3kj\u00e1hoz, majd t\u00e9rjen vissza \u00e9s nyomja meg a **K\u00fcld\u00e9s ** gombot. \n\n [Link]({authorization_url})", "title": "Point hiteles\u00edt\u00e9se" }, "user": { "data": { "flow_impl": "Szolg\u00e1ltat\u00f3" }, - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?", + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?", "title": "V\u00e1lassz hiteles\u00edt\u00e9si m\u00f3dszert" } } diff --git a/homeassistant/components/point/translations/nl.json b/homeassistant/components/point/translations/nl.json index 37dae8481eb..f0ab4d8696e 100644 --- a/homeassistant/components/point/translations/nl.json +++ b/homeassistant/components/point/translations/nl.json @@ -23,7 +23,7 @@ "data": { "flow_impl": "Leverancier" }, - "description": "Wil je beginnen met instellen?", + "description": "Wilt u beginnen met instellen?", "title": "Kies een authenticatie methode" } } diff --git a/homeassistant/components/poolsense/translations/hu.json b/homeassistant/components/poolsense/translations/hu.json index 80562b34e28..39274e14c21 100644 --- a/homeassistant/components/poolsense/translations/hu.json +++ b/homeassistant/components/poolsense/translations/hu.json @@ -12,7 +12,7 @@ "email": "E-mail", "password": "Jelsz\u00f3" }, - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?", + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?", "title": "PoolSense" } } diff --git a/homeassistant/components/poolsense/translations/nl.json b/homeassistant/components/poolsense/translations/nl.json index f88d14e297a..1fd59ebf2ea 100644 --- a/homeassistant/components/poolsense/translations/nl.json +++ b/homeassistant/components/poolsense/translations/nl.json @@ -12,7 +12,7 @@ "email": "E-mail", "password": "Wachtwoord" }, - "description": "Wil je beginnen met instellen?", + "description": "Wilt u beginnen met instellen?", "title": "PoolSense" } } diff --git a/homeassistant/components/powerwall/translations/id.json b/homeassistant/components/powerwall/translations/id.json index a5ae5f5e979..95f8d600901 100644 --- a/homeassistant/components/powerwall/translations/id.json +++ b/homeassistant/components/powerwall/translations/id.json @@ -10,7 +10,7 @@ "unknown": "Kesalahan yang tidak diharapkan", "wrong_version": "Powerwall Anda menggunakan versi perangkat lunak yang tidak didukung. Pertimbangkan untuk memutakhirkan atau melaporkan masalah ini agar dapat diatasi." }, - "flow_title": "Tesla Powerwall ({ip_address})", + "flow_title": "{ip_address}", "step": { "user": { "data": { diff --git a/homeassistant/components/profiler/translations/hu.json b/homeassistant/components/profiler/translations/hu.json index c5d28903888..215cd02307b 100644 --- a/homeassistant/components/profiler/translations/hu.json +++ b/homeassistant/components/profiler/translations/hu.json @@ -5,7 +5,7 @@ }, "step": { "user": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } } diff --git a/homeassistant/components/profiler/translations/nl.json b/homeassistant/components/profiler/translations/nl.json index 8690611b1c9..8b99a128bd3 100644 --- a/homeassistant/components/profiler/translations/nl.json +++ b/homeassistant/components/profiler/translations/nl.json @@ -5,7 +5,7 @@ }, "step": { "user": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } } diff --git a/homeassistant/components/progettihwsw/translations/he.json b/homeassistant/components/progettihwsw/translations/he.json index 67c80866be0..4095264c76c 100644 --- a/homeassistant/components/progettihwsw/translations/he.json +++ b/homeassistant/components/progettihwsw/translations/he.json @@ -10,20 +10,20 @@ "step": { "relay_modes": { "data": { - "relay_1": "Relay 1", - "relay_10": "Relay 10", - "relay_11": "Relay 11", - "relay_12": "Relay 12", - "relay_13": "Relay 13", - "relay_15": "Relay 15", - "relay_2": "Relay 2", - "relay_3": "Relay 3", - "relay_4": "Relay 4", - "relay_5": "Relay 5", - "relay_6": "Relay 6", - "relay_7": "Relay 7", - "relay_8": "Relay 8", - "relay_9": "Relay 9" + "relay_1": "\u05de\u05de\u05e1\u05e8 1", + "relay_10": "\u05de\u05de\u05e1\u05e8 10", + "relay_11": "\u05de\u05de\u05e1\u05e8 11", + "relay_12": "\u05de\u05de\u05e1\u05e8 12", + "relay_13": "\u05de\u05de\u05e1\u05e8 13", + "relay_15": "\u05de\u05de\u05e1\u05e8 15", + "relay_2": "\u05de\u05de\u05e1\u05e8 2", + "relay_3": "\u05de\u05de\u05e1\u05e8 3", + "relay_4": "\u05de\u05de\u05e1\u05e8 4", + "relay_5": "\u05de\u05de\u05e1\u05e8 5", + "relay_6": "\u05de\u05de\u05e1\u05e8 6", + "relay_7": "\u05de\u05de\u05e1\u05e8 7", + "relay_8": "\u05de\u05de\u05e1\u05e8 8", + "relay_9": "\u05de\u05de\u05e1\u05e8 9" }, "title": "\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05de\u05e1\u05e8\u05d9\u05dd" }, diff --git a/homeassistant/components/progettihwsw/translations/hu.json b/homeassistant/components/progettihwsw/translations/hu.json index fea70ec88ac..84258a6a01b 100644 --- a/homeassistant/components/progettihwsw/translations/hu.json +++ b/homeassistant/components/progettihwsw/translations/hu.json @@ -31,7 +31,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "\u00c1ll\u00edtsa be" diff --git a/homeassistant/components/prosegur/translations/el.json b/homeassistant/components/prosegur/translations/el.json new file mode 100644 index 00000000000..c5dee661aa2 --- /dev/null +++ b/homeassistant/components/prosegur/translations/el.json @@ -0,0 +1,11 @@ +{ + "config": { + "step": { + "reauth_confirm": { + "data": { + "description": "\u0395\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 \u03bc\u03b5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc Prosegur." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/prosegur/translations/es.json b/homeassistant/components/prosegur/translations/es.json index 272b501da30..af4f61d6fdc 100644 --- a/homeassistant/components/prosegur/translations/es.json +++ b/homeassistant/components/prosegur/translations/es.json @@ -1,27 +1,27 @@ { "config": { "abort": { - "already_configured": "El sistema ya est\u00e1 configurado", + "already_configured": "El dispositivo ya est\u00e1 configurado", "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" }, "error": { "cannot_connect": "No se pudo conectar", - "invalid_auth": "Autenticaci\u00f3n err\u00f3nea", - "unknown": "Error desconocido" + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado" }, "step": { "reauth_confirm": { "data": { "description": "Vuelva a autenticarse con su cuenta Prosegur.", "password": "Contrase\u00f1a", - "username": "Nombre de Usuario" + "username": "Usuario" } }, "user": { "data": { "country": "Pa\u00eds", "password": "Contrase\u00f1a", - "username": "Nombre de Usuario" + "username": "Usuario" } } } diff --git a/homeassistant/components/prosegur/translations/id.json b/homeassistant/components/prosegur/translations/id.json new file mode 100644 index 00000000000..9616471c03a --- /dev/null +++ b/homeassistant/components/prosegur/translations/id.json @@ -0,0 +1,27 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi", + "reauth_successful": "Autentikasi ulang berhasil" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "reauth_confirm": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + }, + "user": { + "data": { + "country": "Negara", + "password": "Kata Sandi" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/ps4/translations/he.json b/homeassistant/components/ps4/translations/he.json index e9543da8206..421f869d8c5 100644 --- a/homeassistant/components/ps4/translations/he.json +++ b/homeassistant/components/ps4/translations/he.json @@ -19,6 +19,9 @@ "region": "\u05d0\u05d9\u05d6\u05d5\u05e8" }, "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" + }, + "mode": { + "title": "\u05e4\u05dc\u05d9\u05d9\u05e1\u05d8\u05d9\u05d9\u05e9\u05df 4" } } } diff --git a/homeassistant/components/ps4/translations/hu.json b/homeassistant/components/ps4/translations/hu.json index 97614bcac57..753ea60b282 100644 --- a/homeassistant/components/ps4/translations/hu.json +++ b/homeassistant/components/ps4/translations/hu.json @@ -9,7 +9,7 @@ }, "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", - "credential_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s. Az \u00fajraind\u00edt\u00e1shoz nyomja meg a bek\u00fcld\u00e9s gombot.", + "credential_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s. Az \u00fajraind\u00edt\u00e1shoz nyomja meg a K\u00fcld\u00e9s gombot.", "login_failed": "Nem siker\u00fclt p\u00e1ros\u00edtani a PlayStation 4-gyel. Ellen\u0151rizze, hogy a PIN-k\u00f3d helyes-e.", "no_ipaddress": "\u00cdrja be a konfigur\u00e1lni k\u00edv\u00e1nt PlayStation 4 IP c\u00edm\u00e9t" }, @@ -30,7 +30,7 @@ }, "mode": { "data": { - "ip_address": "IP c\u00edm (Hagyd \u00fcresen az Automatikus Felder\u00edt\u00e9s haszn\u00e1lat\u00e1hoz).", + "ip_address": "IP c\u00edm (Hagyja \u00fcresen az Automatikus Felder\u00edt\u00e9s haszn\u00e1lat\u00e1hoz).", "mode": "Konfigur\u00e1ci\u00f3s m\u00f3d" }, "description": "V\u00e1lassza ki a m\u00f3dot a konfigur\u00e1l\u00e1shoz. Az IP c\u00edm mez\u0151 \u00fcresen maradhat, ha az Automatikus felder\u00edt\u00e9s lehet\u0151s\u00e9get v\u00e1lasztja, mivel az eszk\u00f6z\u00f6k automatikusan felfedez\u0151dnek.", diff --git a/homeassistant/components/pvpc_hourly_pricing/translations/hu.json b/homeassistant/components/pvpc_hourly_pricing/translations/hu.json index 1f706862ee1..c654c92969a 100644 --- a/homeassistant/components/pvpc_hourly_pricing/translations/hu.json +++ b/homeassistant/components/pvpc_hourly_pricing/translations/hu.json @@ -24,7 +24,7 @@ "power_p3": "Szerz\u0151d\u00f6tt teljes\u00edtm\u00e9ny P3 v\u00f6lgyid\u0151szakra (kW)", "tariff": "Alkalmazand\u00f3 tarifa f\u00f6ldrajzi z\u00f3n\u00e1k szerint" }, - "description": "Ez az \u00e9rz\u00e9kel\u0151 a hivatalos API-t haszn\u00e1lja a [villamos energia \u00f3r\u00e1nk\u00e9nti \u00e1raz\u00e1s\u00e1nak (PVPC)] (https://www.esios.ree.es/es/pvpc) megszerz\u00e9s\u00e9hez Spanyolorsz\u00e1gban.\n Pontosabb magyar\u00e1zat\u00e9rt keresse fel az [integr\u00e1ci\u00f3s dokumentumok] oldalt (https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).", + "description": "Ez az \u00e9rz\u00e9kel\u0151 a hivatalos API-t haszn\u00e1lja a [villamos energia \u00f3r\u00e1nk\u00e9nti \u00e1raz\u00e1s\u00e1nak (PVPC)] (https://www.esios.ree.es/es/pvpc) megszerz\u00e9s\u00e9hez Spanyolorsz\u00e1gban.\nPontosabb magyar\u00e1zat\u00e9rt keresse fel az [integr\u00e1ci\u00f3s dokumentumok] oldalt (https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).", "title": "\u00c9rz\u00e9kel\u0151 be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/pvpc_hourly_pricing/translations/id.json b/homeassistant/components/pvpc_hourly_pricing/translations/id.json index 8601c31fda0..9a8a18a7543 100644 --- a/homeassistant/components/pvpc_hourly_pricing/translations/id.json +++ b/homeassistant/components/pvpc_hourly_pricing/translations/id.json @@ -7,10 +7,10 @@ "user": { "data": { "name": "Nama Sensor", - "tariff": "Tarif kontrak (1, 2, atau 3 periode)" + "tariff": "Tarif yang berlaku menurut zona geografis" }, - "description": "Sensor ini menggunakan API resmi untuk mendapatkan [harga listrik per jam (PVPC)](https://www.esios.ree.es/es/pvpc) di Spanyol.\nUntuk penjelasan yang lebih tepat, kunjungi [dokumen integrasi](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).\n\nPilih tarif kontrak berdasarkan jumlah periode penagihan per hari:\n- 1 periode: normal\n- 2 periode: diskriminasi (tarif per malam)\n- 3 periode: mobil listrik (tarif per malam 3 periode)", - "title": "Pemilihan tarif" + "description": "Sensor ini menggunakan API resmi untuk mendapatkan [harga listrik per jam (PVPC)](https://www.esios.ree.es/es/pvpc) di Spanyol.\nUntuk penjelasan yang lebih tepat, kunjungi [dokumen integrasi](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/).", + "title": "Penyiapan sensor" } } } diff --git a/homeassistant/components/rainforest_eagle/translations/es.json b/homeassistant/components/rainforest_eagle/translations/es.json index 53d9cb6f7c8..08649fda7ec 100644 --- a/homeassistant/components/rainforest_eagle/translations/es.json +++ b/homeassistant/components/rainforest_eagle/translations/es.json @@ -1,12 +1,17 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "unknown": "Error inesperado" }, "step": { "user": { "data": { - "host": "Anfitri\u00f3n" + "host": "Host" } } } diff --git a/homeassistant/components/rainforest_eagle/translations/hu.json b/homeassistant/components/rainforest_eagle/translations/hu.json index 10f5a16cd23..c3d489c8eec 100644 --- a/homeassistant/components/rainforest_eagle/translations/hu.json +++ b/homeassistant/components/rainforest_eagle/translations/hu.json @@ -12,7 +12,7 @@ "user": { "data": { "cloud_id": "Cloud ID", - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "install_code": "Telep\u00edt\u00e9si k\u00f3d" } } diff --git a/homeassistant/components/rainforest_eagle/translations/id.json b/homeassistant/components/rainforest_eagle/translations/id.json new file mode 100644 index 00000000000..80db8f3182d --- /dev/null +++ b/homeassistant/components/rainforest_eagle/translations/id.json @@ -0,0 +1,19 @@ +{ + "config": { + "abort": { + "already_configured": "Perangkat sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "host": "Host" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/rainmachine/translations/hu.json b/homeassistant/components/rainmachine/translations/hu.json index 1ff7dc34b9c..c6120797a72 100644 --- a/homeassistant/components/rainmachine/translations/hu.json +++ b/homeassistant/components/rainmachine/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "ip_address": "Hosztn\u00e9v vagy IP c\u00edm", + "ip_address": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port" }, diff --git a/homeassistant/components/renault/translations/ca.json b/homeassistant/components/renault/translations/ca.json index 4aacab5cfc8..e16cb333acf 100644 --- a/homeassistant/components/renault/translations/ca.json +++ b/homeassistant/components/renault/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "kamereon_no_account": "No s'ha pogut trobar cap compte Kamereon", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, diff --git a/homeassistant/components/renault/translations/cs.json b/homeassistant/components/renault/translations/cs.json index d731b4c2ec0..94f2bbd5773 100644 --- a/homeassistant/components/renault/translations/cs.json +++ b/homeassistant/components/renault/translations/cs.json @@ -1,12 +1,19 @@ { "config": { "abort": { - "already_configured": "\u00da\u010det je ji\u017e nastaven" + "already_configured": "\u00da\u010det je ji\u017e nastaven", + "reauth_successful": "Op\u011btovn\u00e9 ov\u011b\u0159en\u00ed bylo \u00fasp\u011b\u0161n\u00e9" }, "error": { "invalid_credentials": "Neplatn\u00e9 ov\u011b\u0159en\u00ed" }, "step": { + "reauth_confirm": { + "data": { + "password": "Heslo" + }, + "title": "Znovu ov\u011b\u0159it integraci" + }, "user": { "data": { "password": "Heslo", diff --git a/homeassistant/components/renault/translations/el.json b/homeassistant/components/renault/translations/el.json new file mode 100644 index 00000000000..4f29e856865 --- /dev/null +++ b/homeassistant/components/renault/translations/el.json @@ -0,0 +1,9 @@ +{ + "config": { + "step": { + "reauth_confirm": { + "description": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03ae\u03c2 \u03c3\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03bf {username}" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/renault/translations/es.json b/homeassistant/components/renault/translations/es.json index 987377770dd..cf0f88983e0 100644 --- a/homeassistant/components/renault/translations/es.json +++ b/homeassistant/components/renault/translations/es.json @@ -1,11 +1,12 @@ { "config": { "abort": { - "already_configured": "La cuenta ya est\u00e1 configurada", - "kamereon_no_account": "No se pudo encontrar la cuenta de Kamereon." + "already_configured": "La cuenta ya ha sido configurada", + "kamereon_no_account": "No se pudo encontrar la cuenta de Kamereon.", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" }, "error": { - "invalid_credentials": "Autenticaci\u00f3n err\u00f3nea" + "invalid_credentials": "Autenticaci\u00f3n no v\u00e1lida" }, "step": { "kamereon": { @@ -14,11 +15,18 @@ }, "title": "Selecciona el id de la cuenta de Kamereon" }, + "reauth_confirm": { + "data": { + "password": "Contrase\u00f1a" + }, + "description": "Por favor, actualiza tu contrase\u00f1a para {username}", + "title": "Volver a autenticar la integraci\u00f3n" + }, "user": { "data": { "locale": "Configuraci\u00f3n regional", "password": "Contrase\u00f1a", - "username": "Correo-e" + "username": "Correo electr\u00f3nico" }, "title": "Establecer las credenciales de Renault" } diff --git a/homeassistant/components/renault/translations/hu.json b/homeassistant/components/renault/translations/hu.json index 9e63117a7c4..d74d8cdf9e4 100644 --- a/homeassistant/components/renault/translations/hu.json +++ b/homeassistant/components/renault/translations/hu.json @@ -19,7 +19,7 @@ "data": { "password": "Jelsz\u00f3" }, - "description": "K\u00e9rj\u00fck, friss\u00edtse a (z) {username} jelszav\u00e1t", + "description": "K\u00e9rj\u00fck, friss\u00edtse {username} jelszav\u00e1t", "title": "Integr\u00e1ci\u00f3 \u00fajb\u00f3li hiteles\u00edt\u00e9se" }, "user": { diff --git a/homeassistant/components/renault/translations/id.json b/homeassistant/components/renault/translations/id.json new file mode 100644 index 00000000000..e1b1f3fc893 --- /dev/null +++ b/homeassistant/components/renault/translations/id.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "already_configured": "Akun sudah dikonfigurasi", + "reauth_successful": "Autentikasi ulang berhasil" + }, + "error": { + "invalid_credentials": "Autentikasi tidak valid" + }, + "step": { + "reauth_confirm": { + "data": { + "password": "Kata Sandi" + }, + "description": "Perbarui kata sandi Anda untuk {username}", + "title": "Autentikasi Ulang Integrasi" + }, + "user": { + "data": { + "password": "Kata Sandi", + "username": "Email" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/renault/translations/nl.json b/homeassistant/components/renault/translations/nl.json index 1ca9e0ae32b..c2e02b03166 100644 --- a/homeassistant/components/renault/translations/nl.json +++ b/homeassistant/components/renault/translations/nl.json @@ -2,7 +2,8 @@ "config": { "abort": { "already_configured": "Account is al geconfigureerd", - "kamereon_no_account": "Kan Kamereon-account niet vinden." + "kamereon_no_account": "Kan Kamereon-account niet vinden.", + "reauth_successful": "Opnieuw verifi\u00ebren is gelukt" }, "error": { "invalid_credentials": "Ongeldige authenticatie" @@ -15,7 +16,11 @@ "title": "Selecteer Kamereon-account-ID" }, "reauth_confirm": { - "description": "Werk uw wachtwoord voor {gebruikersnaam} bij" + "data": { + "password": "Wachtwoord" + }, + "description": "Werk uw wachtwoord voor {gebruikersnaam} bij", + "title": "Integratie opnieuw verifi\u00ebren" }, "user": { "data": { diff --git a/homeassistant/components/rfxtrx/translations/ca.json b/homeassistant/components/rfxtrx/translations/ca.json index d7db4107e3b..477bfa14608 100644 --- a/homeassistant/components/rfxtrx/translations/ca.json +++ b/homeassistant/components/rfxtrx/translations/ca.json @@ -23,7 +23,7 @@ }, "setup_serial_manual_path": { "data": { - "device": "Ruta del port USB del dispositiu" + "device": "Ruta del dispositiu USB" }, "title": "Ruta" }, @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Envia comanda: {subtype}", + "send_status": "Envia comanda d'estat: {subtype}" + }, + "trigger_type": { + "command": "Comanda rebuda: {subtype}", + "status": "Estat rebut: {subtype}" + } + }, "options": { "error": { "already_configured_device": "El dispositiu ja est\u00e0 configurat", diff --git a/homeassistant/components/rfxtrx/translations/de.json b/homeassistant/components/rfxtrx/translations/de.json index 7b006782d96..ee65e371330 100644 --- a/homeassistant/components/rfxtrx/translations/de.json +++ b/homeassistant/components/rfxtrx/translations/de.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Befehl senden: {subtype}", + "send_status": "Statusaktualisierung senden: {subtype}" + }, + "trigger_type": { + "command": "Empfangener Befehl: {subtype}", + "status": "Erhaltener Status: {subtype}" + } + }, "options": { "error": { "already_configured_device": "Ger\u00e4t ist bereits konfiguriert", diff --git a/homeassistant/components/rfxtrx/translations/en.json b/homeassistant/components/rfxtrx/translations/en.json index 69be3726865..2728c189010 100644 --- a/homeassistant/components/rfxtrx/translations/en.json +++ b/homeassistant/components/rfxtrx/translations/en.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Send command: {subtype}", + "send_status": "Send status update: {subtype}" + }, + "trigger_type": { + "command": "Received command: {subtype}", + "status": "Received status: {subtype}" + } + }, "options": { "error": { "already_configured_device": "Device is already configured", @@ -70,16 +80,5 @@ "title": "Configure device options" } } - }, - "device_automation": { - "action_type": { - "send_status": "Send status update: {subtype}", - "send_command": "Send command: {subtype}" - }, - "trigger_type": { - "status": "Received status: {subtype}", - "command": "Received command: {subtype}" - } - }, - "title": "Rfxtrx" -} + } +} \ No newline at end of file diff --git a/homeassistant/components/rfxtrx/translations/es.json b/homeassistant/components/rfxtrx/translations/es.json index c1c4d72735c..fa45fe8a777 100644 --- a/homeassistant/components/rfxtrx/translations/es.json +++ b/homeassistant/components/rfxtrx/translations/es.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Enviar comando: {subtype}", + "send_status": "Enviar actualizaci\u00f3n de estado: {subtype}" + }, + "trigger_type": { + "command": "Comando recibido: {subtype}", + "status": "Estado recibido: {subtype}" + } + }, "options": { "error": { "already_configured_device": "El dispositivo ya est\u00e1 configurado", diff --git a/homeassistant/components/rfxtrx/translations/et.json b/homeassistant/components/rfxtrx/translations/et.json index 662664b4454..1b414db656c 100644 --- a/homeassistant/components/rfxtrx/translations/et.json +++ b/homeassistant/components/rfxtrx/translations/et.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Saada k\u00e4sk: {subtype}", + "send_status": "Saada olekuv\u00e4rskendus: {subtype}" + }, + "trigger_type": { + "command": "Saabunud k\u00e4sk: {subtype}", + "status": "Saabunud olek: {subtype}" + } + }, "options": { "error": { "already_configured_device": "Seade on juba h\u00e4\u00e4lestatud", diff --git a/homeassistant/components/rfxtrx/translations/hu.json b/homeassistant/components/rfxtrx/translations/hu.json index 5b953c1260e..86242a4e973 100644 --- a/homeassistant/components/rfxtrx/translations/hu.json +++ b/homeassistant/components/rfxtrx/translations/hu.json @@ -14,7 +14,7 @@ "other": "\u00dcres", "setup_network": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "title": "V\u00e1lassza ki a csatlakoz\u00e1si c\u00edmet" @@ -39,6 +39,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Parancs k\u00fcld\u00e9se: {subtype}", + "send_status": "\u00c1llapotfriss\u00edt\u00e9s k\u00fcld\u00e9se: {subtype}" + }, + "trigger_type": { + "command": "Be\u00e9rkezett parancs: {alt\u00edpus}", + "status": "Be\u00e9rkezett st\u00e1tusz: {subtype}" + } + }, "one": "\u00dcres", "options": { "error": { diff --git a/homeassistant/components/rfxtrx/translations/it.json b/homeassistant/components/rfxtrx/translations/it.json index 4d2ae4710e7..d5bb516b26b 100644 --- a/homeassistant/components/rfxtrx/translations/it.json +++ b/homeassistant/components/rfxtrx/translations/it.json @@ -39,6 +39,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Invia comando: {subtype}", + "send_status": "Invia aggiornamento di stato: {subtype}" + }, + "trigger_type": { + "command": "Comando ricevuto: {subtype}", + "status": "Stato ricevuto: {subtype}" + } + }, "one": "Pi\u00f9", "options": { "error": { diff --git a/homeassistant/components/rfxtrx/translations/nl.json b/homeassistant/components/rfxtrx/translations/nl.json index 1d22751ceed..92154861f15 100644 --- a/homeassistant/components/rfxtrx/translations/nl.json +++ b/homeassistant/components/rfxtrx/translations/nl.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Stuur commando: {subtype}", + "send_status": "Stuur status update: {subtype}" + }, + "trigger_type": { + "command": "Ontvangen commando: {subtype}", + "status": "Ontvangen status: {subtype}" + } + }, "options": { "error": { "already_configured_device": "Apparaat is al geconfigureerd", diff --git a/homeassistant/components/rfxtrx/translations/no.json b/homeassistant/components/rfxtrx/translations/no.json index 3eb9c9b83df..2f867554442 100644 --- a/homeassistant/components/rfxtrx/translations/no.json +++ b/homeassistant/components/rfxtrx/translations/no.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "Send kommando: {subtype}", + "send_status": "Send statusoppdatering: {subtype}" + }, + "trigger_type": { + "command": "Mottatt kommando: {subtype}", + "status": "Mottatt status: {subtype}" + } + }, "options": { "error": { "already_configured_device": "Enheten er allerede konfigurert", diff --git a/homeassistant/components/rfxtrx/translations/ru.json b/homeassistant/components/rfxtrx/translations/ru.json index 5a635766d3f..4a56f37687a 100644 --- a/homeassistant/components/rfxtrx/translations/ru.json +++ b/homeassistant/components/rfxtrx/translations/ru.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443: {subtype}", + "send_status": "\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430: {subtype}" + }, + "trigger_type": { + "command": "\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430: {subtype}", + "status": "\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441: {subtype}" + } + }, "options": { "error": { "already_configured_device": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", diff --git a/homeassistant/components/rfxtrx/translations/zh-Hant.json b/homeassistant/components/rfxtrx/translations/zh-Hant.json index fbbfeb5d6a0..ec763ece1de 100644 --- a/homeassistant/components/rfxtrx/translations/zh-Hant.json +++ b/homeassistant/components/rfxtrx/translations/zh-Hant.json @@ -35,6 +35,16 @@ } } }, + "device_automation": { + "action_type": { + "send_command": "\u50b3\u9001\u547d\u4ee4\uff1a{subtype}", + "send_status": "\u50b3\u9001\u72c0\u614b\u66f4\u65b0\uff1a{subtype}" + }, + "trigger_type": { + "command": "\u63a5\u6536\u547d\u4ee4\uff1a{subtype}", + "status": "\u63a5\u6536\u72c0\u614b\uff1a{subtype}" + } + }, "options": { "error": { "already_configured_device": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", diff --git a/homeassistant/components/risco/translations/hu.json b/homeassistant/components/risco/translations/hu.json index aaa7974cd4a..198c30d2b02 100644 --- a/homeassistant/components/risco/translations/hu.json +++ b/homeassistant/components/risco/translations/hu.json @@ -27,8 +27,8 @@ "armed_home": "\u00c9les\u00edtve (otthon)", "armed_night": "\u00c9les\u00edtve (\u00e9jszakai)" }, - "description": "V\u00e1lassza ki, hogy milyen \u00e1llapotba \u00e1ll\u00edtsa a Risco riaszt\u00e1st a Home Assistant riaszt\u00e1s \u00e9les\u00edt\u00e9sekor", - "title": "A Home Assistant \u00e1llapotok megjelen\u00edt\u00e9se Risco \u00e1llapotokba" + "description": "V\u00e1lassza ki, hogy milyen \u00e1llapotba \u00e1ll\u00edtsa a Risco riaszt\u00e1st Home Assistant riaszt\u00e1s \u00e9les\u00edt\u00e9sekor", + "title": "Home Assistant \u00e1llapotok megjelen\u00edt\u00e9se Risco \u00e1llapotokba" }, "init": { "data": { diff --git a/homeassistant/components/roku/translations/hu.json b/homeassistant/components/roku/translations/hu.json index b7aa12bfb4d..101931e0d21 100644 --- a/homeassistant/components/roku/translations/hu.json +++ b/homeassistant/components/roku/translations/hu.json @@ -2,20 +2,20 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, - "flow_title": "Roku: {name}", + "flow_title": "{name}", "step": { "discovery_confirm": { "data": { "one": "Egy", "other": "Egy\u00e9b" }, - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a(z) {name}-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}?", "title": "Roku" }, "ssdp_confirm": { @@ -23,12 +23,12 @@ "one": "\u00dcres", "other": "\u00dcres" }, - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}?", "title": "Roku" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "Adja meg Roku adatait." } diff --git a/homeassistant/components/roku/translations/id.json b/homeassistant/components/roku/translations/id.json index 0e60de9b61f..3a227e80eaf 100644 --- a/homeassistant/components/roku/translations/id.json +++ b/homeassistant/components/roku/translations/id.json @@ -8,7 +8,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "Roku: {name}", + "flow_title": "{name}", "step": { "discovery_confirm": { "description": "Ingin menyiapkan {name}?", diff --git a/homeassistant/components/roomba/translations/es.json b/homeassistant/components/roomba/translations/es.json index c78b66bbb87..315c8bda096 100644 --- a/homeassistant/components/roomba/translations/es.json +++ b/homeassistant/components/roomba/translations/es.json @@ -34,7 +34,7 @@ "blid": "BLID", "host": "Host" }, - "description": "No se ha descubierto ning\u00fan dispositivo Roomba ni Braava en tu red. El BLID es la parte del nombre de host del dispositivo despu\u00e9s de 'iRobot-'. Por favor, sigue los pasos descritos en la documentaci\u00f3n en: {auth_help_url}", + "description": "No se ha descubierto ning\u00fan dispositivo Roomba ni Braava en tu red.", "title": "Conectar manualmente con el dispositivo" }, "user": { diff --git a/homeassistant/components/roomba/translations/hu.json b/homeassistant/components/roomba/translations/hu.json index 0d76ce920b2..34e36f55150 100644 --- a/homeassistant/components/roomba/translations/hu.json +++ b/homeassistant/components/roomba/translations/hu.json @@ -13,7 +13,7 @@ "step": { "init": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "V\u00e1lasszon egy Roomba vagy Braava k\u00e9sz\u00fcl\u00e9ket.", "title": "Automatikus csatlakoz\u00e1s az eszk\u00f6zh\u00f6z" @@ -32,9 +32,9 @@ "manual": { "data": { "blid": "BLID", - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "A h\u00e1l\u00f3zaton egyetlen Roomba vagy Braava sem ker\u00fclt el\u0151. A BLID az eszk\u00f6z hostnev\u00e9nek az `iRobot-` vagy `Roomba -` ut\u00e1ni r\u00e9sze. K\u00e9rj\u00fck, k\u00f6vesse a dokument\u00e1ci\u00f3ban ismertetett l\u00e9p\u00e9seket: {auth_help_url}", + "description": "A h\u00e1l\u00f3zaton egyetlen Roomba vagy Braava sem ker\u00fclt el\u0151.", "title": "Manu\u00e1lis csatlakoz\u00e1s az eszk\u00f6zh\u00f6z" }, "user": { @@ -42,11 +42,11 @@ "blid": "BLID", "continuous": "Folyamatos", "delay": "K\u00e9sleltet\u00e9s", - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3" }, "description": "V\u00e1lasszon Roomba-t vagy Braava-t.", - "title": "Csatlakoz\u00e1s az eszk\u00f6zh\u00f6z" + "title": "Automatikus csatlakoz\u00e1s az eszk\u00f6zh\u00f6z" } } }, diff --git a/homeassistant/components/roomba/translations/id.json b/homeassistant/components/roomba/translations/id.json index aaffac267aa..1ade232fd70 100644 --- a/homeassistant/components/roomba/translations/id.json +++ b/homeassistant/components/roomba/translations/id.json @@ -9,7 +9,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "iRobot {name} ({host})", + "flow_title": "{name} ({host})", "step": { "init": { "data": { @@ -19,7 +19,7 @@ "title": "Sambungkan secara otomatis ke perangkat" }, "link": { - "description": "Tekan dan tahan tombol Home pada {name} hingga perangkat mengeluarkan suara (sekitar dua detik).", + "description": "Tekan dan tahan tombol Home pada {name} hingga perangkat mengeluarkan suara (sekitar dua detik), lalu kirim dalam waktu 30 detik.", "title": "Ambil Kata Sandi" }, "link_manual": { @@ -34,7 +34,7 @@ "blid": "BLID", "host": "Host" }, - "description": "Tidak ada Roomba atau Braava yang ditemukan di jaringan Anda. BLID adalah bagian dari nama host perangkat setelah `iRobot-`. Ikuti langkah-langkah yang diuraikan dalam dokumentasi di: {auth_help_url}", + "description": "Tidak ada Roomba atau Braava yang ditemukan di jaringan Anda.", "title": "Hubungkan ke perangkat secara manual" }, "user": { @@ -45,8 +45,8 @@ "host": "Host", "password": "Kata Sandi" }, - "description": "Saat ini proses mengambil BLID dan kata sandi merupakan proses manual. Iikuti langkah-langkah yang diuraikan dalam dokumentasi di: https://www.home-assistant.io/integrations/roomba/#retrieving-your-credentials", - "title": "Hubungkan ke perangkat" + "description": "Pilih Roomba atau Braava.", + "title": "Sambungkan secara otomatis ke perangkat" } } }, diff --git a/homeassistant/components/roon/translations/hu.json b/homeassistant/components/roon/translations/hu.json index 56a8ade165c..09bad262c45 100644 --- a/homeassistant/components/roon/translations/hu.json +++ b/homeassistant/components/roon/translations/hu.json @@ -9,14 +9,14 @@ }, "step": { "link": { - "description": "Enged\u00e9lyeznie kell az HomeAssistantot a Roonban. Miut\u00e1n r\u00e1kattintott a K\u00fcld\u00e9s gombra, nyissa meg a Roon Core alkalmaz\u00e1st, nyissa meg a Be\u00e1ll\u00edt\u00e1sokat, \u00e9s enged\u00e9lyezze a HomeAssistant funkci\u00f3t a B\u0151v\u00edtm\u00e9nyek lapon.", - "title": "Enged\u00e9lyezze a HomeAssistant alkalmaz\u00e1st Roon-ban" + "description": "Enged\u00e9lyeznie kell az Home Assistant-ot a Roonban. Miut\u00e1n r\u00e1kattintott a K\u00fcld\u00e9s gombra, nyissa meg a Roon Core alkalmaz\u00e1st, nyissa meg a Be\u00e1ll\u00edt\u00e1sokat, \u00e9s enged\u00e9lyezze a Home Assistant funkci\u00f3t a B\u0151v\u00edtm\u00e9nyek lapon.", + "title": "Enged\u00e9lyezze a Home Assistant alkalmaz\u00e1st Roon-ban" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "Nem tal\u00e1lta a Roon szervert, adja meg a gazdag\u00e9p nev\u00e9t vagy IP-c\u00edm\u00e9t." + "description": "A Roon szerver nem tal\u00e1lhat\u00f3, adja meg a hosztnev\u00e9t vagy c\u00edm\u00e9t" } } } diff --git a/homeassistant/components/rpi_power/translations/hu.json b/homeassistant/components/rpi_power/translations/hu.json index feb1687037f..840ce725b8b 100644 --- a/homeassistant/components/rpi_power/translations/hu.json +++ b/homeassistant/components/rpi_power/translations/hu.json @@ -6,9 +6,9 @@ }, "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } }, - "title": "Raspberry Pi Power Supply Checker" + "title": "Raspberry Pi t\u00e1pegys\u00e9g ellen\u0151rz\u0151" } \ No newline at end of file diff --git a/homeassistant/components/rpi_power/translations/nl.json b/homeassistant/components/rpi_power/translations/nl.json index 5529aa39f20..d9e42ef11f3 100644 --- a/homeassistant/components/rpi_power/translations/nl.json +++ b/homeassistant/components/rpi_power/translations/nl.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } }, diff --git a/homeassistant/components/ruckus_unleashed/translations/hu.json b/homeassistant/components/ruckus_unleashed/translations/hu.json index 0abcc301f0c..9590d3c12be 100644 --- a/homeassistant/components/ruckus_unleashed/translations/hu.json +++ b/homeassistant/components/ruckus_unleashed/translations/hu.json @@ -11,7 +11,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" } diff --git a/homeassistant/components/samsungtv/translations/bg.json b/homeassistant/components/samsungtv/translations/bg.json new file mode 100644 index 00000000000..c30e629d8ad --- /dev/null +++ b/homeassistant/components/samsungtv/translations/bg.json @@ -0,0 +1,7 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0432\u044a\u0440\u0437\u0432\u0430\u043d\u0435" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/samsungtv/translations/ca.json b/homeassistant/components/samsungtv/translations/ca.json index 64e2298d141..e701bdb1d92 100644 --- a/homeassistant/components/samsungtv/translations/ca.json +++ b/homeassistant/components/samsungtv/translations/ca.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant no est\u00e0 autenticat per connectar-se amb aquest televisor Samsung. V\u00e9s a la configuraci\u00f3 de dispositius externs del televisor per autoritzar Home Assistant.", "cannot_connect": "Ha fallat la connexi\u00f3", "id_missing": "El dispositiu Samsung no t\u00e9 cap n\u00famero de s\u00e8rie.", + "missing_config_entry": "Aquest dispositiu Samsung no t\u00e9 cap entrada de configuraci\u00f3.", "not_supported": "Actualment aquest dispositiu Samsung no \u00e9s compatible.", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament", "unknown": "Error inesperat" diff --git a/homeassistant/components/samsungtv/translations/de.json b/homeassistant/components/samsungtv/translations/de.json index f59004a5dab..ec5b791626a 100644 --- a/homeassistant/components/samsungtv/translations/de.json +++ b/homeassistant/components/samsungtv/translations/de.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant ist nicht berechtigt, eine Verbindung zu diesem Samsung TV herzustellen. \u00dcberpr\u00fcfe den Ger\u00e4teverbindungsmanager in den Einstellungen deines Fernsehger\u00e4ts, um Home Assistant zu autorisieren.", "cannot_connect": "Verbindung fehlgeschlagen", "id_missing": "Dieses Samsung-Ger\u00e4t hat keine Seriennummer.", + "missing_config_entry": "Dieses Samsung-Ger\u00e4t hat keinen Konfigurationseintrag.", "not_supported": "Dieses Samsung TV-Ger\u00e4t wird derzeit nicht unterst\u00fctzt.", "reauth_successful": "Die erneute Authentifizierung war erfolgreich", "unknown": "Unerwarteter Fehler" diff --git a/homeassistant/components/samsungtv/translations/en.json b/homeassistant/components/samsungtv/translations/en.json index 8b48de950ee..4648f930e9b 100644 --- a/homeassistant/components/samsungtv/translations/en.json +++ b/homeassistant/components/samsungtv/translations/en.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant is not authorized to connect to this Samsung TV. Check your TV's External Device Manager settings to authorize Home Assistant.", "cannot_connect": "Failed to connect", "id_missing": "This Samsung device doesn't have a SerialNumber.", + "missing_config_entry": "This Samsung device doesn't have a configuration entry.", "not_supported": "This Samsung device is currently not supported.", "reauth_successful": "Re-authentication was successful", "unknown": "Unexpected error" @@ -16,7 +17,8 @@ "flow_title": "{device}", "step": { "confirm": { - "description": "Do you want to set up {device}? If you never connected Home Assistant before you should see a popup on your TV asking for authorization." + "description": "Do you want to set up {device}? If you never connected Home Assistant before you should see a popup on your TV asking for authorization.", + "title": "Samsung TV" }, "reauth_confirm": { "description": "After submitting, accept the the popup on {device} requesting authorization within 30 seconds." diff --git a/homeassistant/components/samsungtv/translations/es.json b/homeassistant/components/samsungtv/translations/es.json index 0228ca3101f..42b0f794e7a 100644 --- a/homeassistant/components/samsungtv/translations/es.json +++ b/homeassistant/components/samsungtv/translations/es.json @@ -6,12 +6,18 @@ "auth_missing": "Home Assistant no est\u00e1 autorizado para conectarse a este televisor Samsung. Revisa la configuraci\u00f3n de tu televisor para autorizar a Home Assistant.", "cannot_connect": "No se pudo conectar", "id_missing": "Este dispositivo Samsung no tiene un n\u00famero de serie.", - "not_supported": "Esta televisi\u00f3n Samsung actualmente no es compatible." + "missing_config_entry": "Este dispositivo de Samsung no est\u00e1 configurado.", + "not_supported": "Esta televisi\u00f3n Samsung actualmente no es compatible.", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente", + "unknown": "Error inesperado" }, - "flow_title": "Televisor Samsung: {model}", + "error": { + "auth_missing": "Home Assistant no est\u00e1 autorizado para conectarse a este televisor Samsung. Revisa la configuraci\u00f3n de tu televisor para autorizar a Home Assistant." + }, + "flow_title": "{device}", "step": { "confirm": { - "description": "\u00bfQuieres configurar la televisi\u00f3n Samsung {model}? Si nunca la has conectado a Home Assistant antes deber\u00edas ver una ventana en tu TV pidiendo autorizaci\u00f3n. Cualquier configuraci\u00f3n manual de esta TV se sobreescribir\u00e1.", + "description": "\u00bfQuieres configurar {device}? Si nunca la has conectado a Home Assistant antes deber\u00edas ver una ventana en tu TV pidiendo autorizaci\u00f3n.", "title": "Samsung TV" }, "reauth_confirm": { diff --git a/homeassistant/components/samsungtv/translations/et.json b/homeassistant/components/samsungtv/translations/et.json index 0cc9bf8ebcc..47360f4ed06 100644 --- a/homeassistant/components/samsungtv/translations/et.json +++ b/homeassistant/components/samsungtv/translations/et.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistantil pole selle Samsungi teleriga \u00fchenduse loomiseks luba. Home Assistanti autoriseerimiseks kontrolli oma teleri seadeid.", "cannot_connect": "\u00dchendamine nurjus", "id_missing": "Sellel Samsungi seadmel puudub seerianumber.", + "missing_config_entry": "Sellel Samsungi seadmel puudub seadekirje.", "not_supported": "Seda Samsungi seadet praegu ei toetata.", "reauth_successful": "Taastuvastamine \u00f5nnestus", "unknown": "Tundmatu t\u00f5rge" diff --git a/homeassistant/components/samsungtv/translations/hu.json b/homeassistant/components/samsungtv/translations/hu.json index f0aa85433a1..93c0b2bee6d 100644 --- a/homeassistant/components/samsungtv/translations/hu.json +++ b/homeassistant/components/samsungtv/translations/hu.json @@ -2,21 +2,22 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", - "auth_missing": "A Home Assistant nem jogosult csatlakozni ehhez a Samsung TV-hez. Ellen\u0151rizd a TV be\u00e1ll\u00edt\u00e1sait a Home Assistant enged\u00e9lyez\u00e9s\u00e9hez.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", + "auth_missing": "Home Assistant nem jogosult csatlakozni ehhez a Samsung TV-hez. Ellen\u0151rizze a TV be\u00e1ll\u00edt\u00e1sait Home Assistant enged\u00e9lyez\u00e9s\u00e9hez.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", "id_missing": "Ennek a Samsung eszk\u00f6znek nincs sorsz\u00e1ma.", + "missing_config_entry": "Ez a Samsung eszk\u00f6z nem rendelkezik konfigur\u00e1ci\u00f3s bejegyz\u00e9ssel.", "not_supported": "Ez a Samsung k\u00e9sz\u00fcl\u00e9k jelenleg nem t\u00e1mogatott.", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt", "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" }, "error": { - "auth_missing": "A Home Assistant nem jogosult csatlakozni ehhez a Samsung TV-hez. Ellen\u0151rizd a TV be\u00e1ll\u00edt\u00e1sait a Home Assistant enged\u00e9lyez\u00e9s\u00e9hez." + "auth_missing": "Home Assistant nem jogosult csatlakozni ehhez a Samsung TV-hez. Ellen\u0151rizze a TV be\u00e1ll\u00edt\u00e1sait Home Assistant enged\u00e9lyez\u00e9s\u00e9hez." }, "flow_title": "{device}", "step": { "confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a(z) {device} k\u00e9sz\u00fcl\u00e9ket? Ha kor\u00e1bban m\u00e9g csatlakoztattad a Home Assistantet, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ami j\u00f3v\u00e1hagy\u00e1sra v\u00e1r.", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani {device} k\u00e9sz\u00fcl\u00e9k\u00e9t? Ha kor\u00e1bban m\u00e9g sosem csatlakoztatta Home Assistant-hoz, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ami j\u00f3v\u00e1hagy\u00e1sra v\u00e1r.", "title": "Samsung TV" }, "reauth_confirm": { @@ -24,7 +25,7 @@ }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v" }, "description": "\u00cdrd be a Samsung TV adatait. Ha m\u00e9g soha nem csatlakozott Home Assistant-hez, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ahol hiteles\u00edt\u00e9st k\u00e9r." diff --git a/homeassistant/components/samsungtv/translations/id.json b/homeassistant/components/samsungtv/translations/id.json index 0b8bbe60150..0714af37146 100644 --- a/homeassistant/components/samsungtv/translations/id.json +++ b/homeassistant/components/samsungtv/translations/id.json @@ -3,21 +3,26 @@ "abort": { "already_configured": "Perangkat sudah dikonfigurasi", "already_in_progress": "Alur konfigurasi sedang berlangsung", - "auth_missing": "Home Assistant tidak diizinkan untuk tersambung ke TV Samsung ini. Periksa setelan TV Anda untuk mengotorisasi Home Assistant.", + "auth_missing": "Home Assistant tidak diizinkan untuk tersambung ke TV Samsung ini. Periksa Manajer Perangkat Eksternal TV Anda untuk mengotorisasi Home Assistant.", "cannot_connect": "Gagal terhubung", + "id_missing": "Perangkat Samsung ini tidak memiliki SerialNumber.", + "missing_config_entry": "Perangkat Samsung ini tidak memiliki entri konfigurasi.", "not_supported": "Perangkat TV Samsung ini saat ini tidak didukung.", "reauth_successful": "Autentikasi ulang berhasil", "unknown": "Kesalahan yang tidak diharapkan" }, "error": { - "auth_missing": "Home Assistant tidak diizinkan untuk tersambung ke TV Samsung ini. Periksa setelan TV Anda untuk mengotorisasi Home Assistant." + "auth_missing": "Home Assistant tidak diizinkan untuk tersambung ke TV Samsung ini. Periksa Manajer Perangkat Eksternal TV Anda untuk mengotorisasi Home Assistant." }, - "flow_title": "TV Samsung: {model}", + "flow_title": "{device}", "step": { "confirm": { - "description": "Apakah Anda ingin menyiapkan TV Samsung {model}? Jika Anda belum pernah menyambungkan Home Assistant sebelumnya, Anda akan melihat dialog di TV yang meminta otorisasi. Konfigurasi manual untuk TV ini akan ditimpa.", + "description": "Apakah Anda ingin menyiapkan {device}? Jika Anda belum pernah menyambungkan Home Assistant sebelumnya, Anda akan melihat dialog di TV yang meminta otorisasi.", "title": "TV Samsung" }, + "reauth_confirm": { + "description": "Setelah mengirimkan, setujui pada popup di {device} yang meminta otorisasi dalam waktu 30 detik." + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/samsungtv/translations/it.json b/homeassistant/components/samsungtv/translations/it.json index ee1219305d7..51f9b4e2ef9 100644 --- a/homeassistant/components/samsungtv/translations/it.json +++ b/homeassistant/components/samsungtv/translations/it.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant non \u00e8 autorizzato a connettersi a questo televisore Samsung. Controlla le impostazioni di Gestione dispositivi esterni della tua TV per autorizzare Home Assistant.", "cannot_connect": "Impossibile connettersi", "id_missing": "Questo dispositivo Samsung non ha un SerialNumber.", + "missing_config_entry": "Questo dispositivo Samsung non ha una voce di configurazione.", "not_supported": "Questo dispositivo Samsung non \u00e8 attualmente supportato.", "reauth_successful": "La nuova autenticazione \u00e8 stata eseguita correttamente", "unknown": "Errore imprevisto" diff --git a/homeassistant/components/samsungtv/translations/nl.json b/homeassistant/components/samsungtv/translations/nl.json index b4478994e1c..692c70642d6 100644 --- a/homeassistant/components/samsungtv/translations/nl.json +++ b/homeassistant/components/samsungtv/translations/nl.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant is niet gemachtigd om verbinding te maken met deze Samsung TV. Controleer de instellingen van Extern apparaatbeheer van uw tv om Home Assistant te machtigen.", "cannot_connect": "Kan geen verbinding maken", "id_missing": "Dit Samsung-apparaat heeft geen serienummer.", + "missing_config_entry": "Dit Samsung-apparaat heeft geen configuratie-invoer.", "not_supported": "Deze Samsung TV wordt momenteel niet ondersteund.", "reauth_successful": "Herauthenticatie was succesvol", "unknown": "Onverwachte fout" diff --git a/homeassistant/components/samsungtv/translations/no.json b/homeassistant/components/samsungtv/translations/no.json index 6da9787d3f6..7b7108cbf77 100644 --- a/homeassistant/components/samsungtv/translations/no.json +++ b/homeassistant/components/samsungtv/translations/no.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant er ikke autorisert til \u00e5 koble til denne Samsung TV-en. Sjekk TV-ens innstillinger for ekstern enhetsbehandling for \u00e5 autorisere Home Assistant.", "cannot_connect": "Tilkobling mislyktes", "id_missing": "Denne Samsung-enheten har ikke serienummer.", + "missing_config_entry": "Denne Samsung -enheten har ingen konfigurasjonsoppf\u00f8ring.", "not_supported": "Denne Samsung-enheten st\u00f8ttes forel\u00f8pig ikke.", "reauth_successful": "Godkjenning p\u00e5 nytt var vellykket", "unknown": "Uventet feil" diff --git a/homeassistant/components/samsungtv/translations/ru.json b/homeassistant/components/samsungtv/translations/ru.json index 7d4c24aba45..111b30c5488 100644 --- a/homeassistant/components/samsungtv/translations/ru.json +++ b/homeassistant/components/samsungtv/translations/ru.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant \u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 Samsung TV. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 External Device Manager \u0412\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430.", "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", "id_missing": "\u0423 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Samsung \u043d\u0435\u0442 \u0441\u0435\u0440\u0438\u0439\u043d\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430.", + "missing_config_entry": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Samsung.", "not_supported": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Samsung \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.", "reauth_successful": "\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e.", "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." diff --git a/homeassistant/components/samsungtv/translations/zh-Hant.json b/homeassistant/components/samsungtv/translations/zh-Hant.json index 950a460965b..ba828665cea 100644 --- a/homeassistant/components/samsungtv/translations/zh-Hant.json +++ b/homeassistant/components/samsungtv/translations/zh-Hant.json @@ -6,6 +6,7 @@ "auth_missing": "Home Assistant \u672a\u7372\u5f97\u9a57\u8b49\u4ee5\u9023\u7dda\u81f3\u6b64\u4e09\u661f\u96fb\u8996\u3002\u8acb\u6aa2\u67e5\u60a8\u7684\u96fb\u8996\u5916\u90e8\u88dd\u7f6e\u7ba1\u7406\u54e1\u8a2d\u5b9a\u4ee5\u9032\u884c\u9a57\u8b49\u3002", "cannot_connect": "\u9023\u7dda\u5931\u6557", "id_missing": "\u4e09\u661f\u88dd\u7f6e\u4e26\u672a\u5305\u542b\u5e8f\u865f\u3002", + "missing_config_entry": "\u6b64\u4e09\u661f\u88dd\u7f6e\u4e26\u672a\u5305\u542b\u8a2d\u5b9a\u3002", "not_supported": "\u4e0d\u652f\u63f4\u6b64\u6b3e\u4e09\u661f\u88dd\u7f6e\u3002", "reauth_successful": "\u91cd\u65b0\u8a8d\u8b49\u6210\u529f", "unknown": "\u672a\u9810\u671f\u932f\u8aa4" diff --git a/homeassistant/components/screenlogic/translations/hu.json b/homeassistant/components/screenlogic/translations/hu.json index 3efb8ec6e60..6781f477ab6 100644 --- a/homeassistant/components/screenlogic/translations/hu.json +++ b/homeassistant/components/screenlogic/translations/hu.json @@ -13,7 +13,7 @@ "ip_address": "IP c\u00edm", "port": "Port" }, - "description": "Add meg a ScreenLogic Gateway adatait.", + "description": "Adja meg a ScreenLogic Gateway adatait.", "title": "ScreenLogic" }, "gateway_select": { diff --git a/homeassistant/components/screenlogic/translations/id.json b/homeassistant/components/screenlogic/translations/id.json index 5af1cfbe5ef..b0052f6f0f7 100644 --- a/homeassistant/components/screenlogic/translations/id.json +++ b/homeassistant/components/screenlogic/translations/id.json @@ -6,7 +6,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "ScreenLogic {name}", + "flow_title": "{name}", "step": { "gateway_entry": { "data": { diff --git a/homeassistant/components/sensor/translations/el.json b/homeassistant/components/sensor/translations/el.json index ed9e92cd4b1..ff8750f52dc 100644 --- a/homeassistant/components/sensor/translations/el.json +++ b/homeassistant/components/sensor/translations/el.json @@ -3,7 +3,8 @@ "condition_type": { "is_gas": "\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b1\u03ad\u03c1\u03b9\u03bf {entity_name}", "is_pm25": "\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b5\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 {entity_name} PM2.5", - "is_sulphur_dioxide": "\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b5\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b4\u03b9\u03bf\u03be\u03b5\u03b9\u03b4\u03af\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03b8\u03b5\u03af\u03bf\u03c5 {entity_name}" + "is_sulphur_dioxide": "\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b5\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b4\u03b9\u03bf\u03be\u03b5\u03b9\u03b4\u03af\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03b8\u03b5\u03af\u03bf\u03c5 {entity_name}", + "is_volatile_organic_compounds": "\u03a4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b5\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 \u03c0\u03c4\u03b7\u03c4\u03b9\u03ba\u03ce\u03bd \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03ba\u03ce\u03bd \u03b5\u03bd\u03ce\u03c3\u03b5\u03c9\u03bd {entity_name}" }, "trigger_type": { "gas": "{entity_name} \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ad\u03c2 \u03b1\u03b5\u03c1\u03af\u03bf\u03c5", @@ -14,7 +15,8 @@ "pm1": "{entity_name} \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ad\u03c2 \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 PM1", "pm10": "{entity_name} \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ad\u03c2 \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 PM10", "pm25": "{entity_name} \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ad\u03c2 \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 PM2.5", - "sulphur_dioxide": "{entity_name} \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ad\u03c2 \u03c3\u03c4\u03b7 \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b4\u03b9\u03bf\u03be\u03b5\u03b9\u03b4\u03af\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03b8\u03b5\u03af\u03bf\u03c5" + "sulphur_dioxide": "{entity_name} \u03bc\u03b5\u03c4\u03b1\u03b2\u03bf\u03bb\u03ad\u03c2 \u03c3\u03c4\u03b7 \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7\u03c2 \u03b4\u03b9\u03bf\u03be\u03b5\u03b9\u03b4\u03af\u03bf\u03c5 \u03c4\u03bf\u03c5 \u03b8\u03b5\u03af\u03bf\u03c5", + "volatile_organic_compounds": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2 \u03c3\u03c4\u03b7 \u03c3\u03c5\u03b3\u03ba\u03ad\u03bd\u03c4\u03c1\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c0\u03c4\u03b7\u03c4\u03b9\u03ba\u03ce\u03bd \u03bf\u03c1\u03b3\u03b1\u03bd\u03b9\u03ba\u03ce\u03bd \u03b5\u03bd\u03ce\u03c3\u03b5\u03c9\u03bd {entity_name}" } }, "state": { diff --git a/homeassistant/components/sensor/translations/id.json b/homeassistant/components/sensor/translations/id.json index 9af162d1357..cea3f890430 100644 --- a/homeassistant/components/sensor/translations/id.json +++ b/homeassistant/components/sensor/translations/id.json @@ -6,14 +6,24 @@ "is_carbon_monoxide": "Level konsentasi karbonmonoksida {entity_name} saat ini", "is_current": "Arus {entity_name} saat ini", "is_energy": "Energi {entity_name} saat ini", + "is_gas": "Gas {entity_name} saat ini", "is_humidity": "Kelembaban {entity_name} saat ini", "is_illuminance": "Pencahayaan {entity_name} saat ini", + "is_nitrogen_dioxide": "Tingkat konsentrasi nitrogen dioksida {entity_name} saat ini", + "is_nitrogen_monoxide": "Tingkat konsentrasi nitrogen monoksida {entity_name} saat ini", + "is_nitrous_oxide": "Tingkat konsentrasi nitrit oksida {entity_name} saat ini", + "is_ozone": "Tingkat konsentrasi ozon {entity_name} saat ini", + "is_pm1": "Tingkat konsentrasi PM1 {entity_name} saat ini", + "is_pm10": "Tingkat konsentrasi PM10 {entity_name} saat ini", + "is_pm25": "Tingkat konsentrasi PM2.5 {entity_name} saat ini", "is_power": "Daya {entity_name} saat ini", "is_power_factor": "Faktor daya {entity_name} saat ini", "is_pressure": "Tekanan {entity_name} saat ini", "is_signal_strength": "Kekuatan sinyal {entity_name} saat ini", + "is_sulphur_dioxide": "Tingkat konsentrasi sulfur dioksida {entity_name} saat ini", "is_temperature": "Suhu {entity_name} saat ini", "is_value": "Nilai {entity_name} saat ini", + "is_volatile_organic_compounds": "Tingkat konsentrasi senyawa organik volatil {entity_name} saat ini", "is_voltage": "Tegangan {entity_name} saat ini" }, "trigger_type": { @@ -22,14 +32,24 @@ "carbon_monoxide": "Perubahan konsentrasi karbonmonoksida {entity_name}", "current": "Perubahan arus {entity_name}", "energy": "Perubahan energi {entity_name}", + "gas": "Perubahan gas {entity_name}", "humidity": "Perubahan kelembaban {entity_name}", "illuminance": "Perubahan pencahayaan {entity_name}", + "nitrogen_dioxide": "Perubahan konsentrasi nitrogen dioksida {entity_name}", + "nitrogen_monoxide": "Perubahan konsentrasi nitrogen monoksida {entity_name}", + "nitrous_oxide": "Perubahan konsentrasi nitro oksida {entity_name}", + "ozone": "Perubahan konsentrasi ozon {entity_name}", + "pm1": "Perubahan konsentrasi PM1 {entity_name}", + "pm10": "Perubahan konsentrasi PM10 {entity_name}", + "pm25": "Perubahan konsentrasi PM2.5 {entity_name}", "power": "Perubahan daya {entity_name}", "power_factor": "Perubahan faktor daya {entity_name}", "pressure": "Perubahan tekanan {entity_name}", "signal_strength": "Perubahan kekuatan sinyal {entity_name}", + "sulphur_dioxide": "Perubahan konsentrasi sulfur dioksida {entity_name}", "temperature": "Perubahan suhu {entity_name}", "value": "Perubahan nilai {entity_name}", + "volatile_organic_compounds": "Perubahan konsentrasi senyawa organik volatil {entity_name}", "voltage": "Perubahan tegangan {entity_name}" } }, diff --git a/homeassistant/components/sentry/translations/hu.json b/homeassistant/components/sentry/translations/hu.json index df07c41449e..9c28d57eb5d 100644 --- a/homeassistant/components/sentry/translations/hu.json +++ b/homeassistant/components/sentry/translations/hu.json @@ -12,7 +12,7 @@ "data": { "dsn": "DSN" }, - "description": "Add meg a Sentry DSN-t", + "description": "Adja meg a Sentry DSN-t", "title": "Sentry" } } diff --git a/homeassistant/components/sharkiq/translations/ca.json b/homeassistant/components/sharkiq/translations/ca.json index 9ae6a703835..70402446062 100644 --- a/homeassistant/components/sharkiq/translations/ca.json +++ b/homeassistant/components/sharkiq/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "cannot_connect": "Ha fallat la connexi\u00f3", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament", "unknown": "Error inesperat" diff --git a/homeassistant/components/shelly/translations/ca.json b/homeassistant/components/shelly/translations/ca.json index 13cc79ac3d8..c485d955ff2 100644 --- a/homeassistant/components/shelly/translations/ca.json +++ b/homeassistant/components/shelly/translations/ca.json @@ -33,14 +33,20 @@ "button": "Bot\u00f3", "button1": "Primer bot\u00f3", "button2": "Segon bot\u00f3", - "button3": "Tercer bot\u00f3" + "button3": "Tercer bot\u00f3", + "button4": "Quart bot\u00f3" }, "trigger_type": { + "btn_down": "Bot\u00f3 {subtype} avall", + "btn_up": "Bot\u00f3 {subtype} amunt", "double": "{subtype} clicat dues vegades", + "double_push": "{subtype} clicat dues vegades", "long": "{subtype} clicat durant una estona", + "long_push": "{subtype} clicat durant una estona", "long_single": "{subtype} clicat durant una estona i despr\u00e9s r\u00e0pid", "single": "{subtype} clicat una vegada", "single_long": "{subtype} clicat r\u00e0pid i, despr\u00e9s, durant una estona", + "single_push": "{subtype} clicat una vegada", "triple": "{subtype} clicat tres vegades" } } diff --git a/homeassistant/components/shelly/translations/cs.json b/homeassistant/components/shelly/translations/cs.json index afdfe7c8f56..e3f1215d6f2 100644 --- a/homeassistant/components/shelly/translations/cs.json +++ b/homeassistant/components/shelly/translations/cs.json @@ -33,7 +33,8 @@ "button": "Tla\u010d\u00edtko", "button1": "Prvn\u00ed tla\u010d\u00edtko", "button2": "Druh\u00e9 tla\u010d\u00edtko", - "button3": "T\u0159et\u00ed tla\u010d\u00edtko" + "button3": "T\u0159et\u00ed tla\u010d\u00edtko", + "button4": "\u010ctvrt\u00e9 tla\u010d\u00edtko" }, "trigger_type": { "double": "\"{subtype}\" stisknuto dvakr\u00e1t", diff --git a/homeassistant/components/shelly/translations/de.json b/homeassistant/components/shelly/translations/de.json index 513ff66dff1..3a943507284 100644 --- a/homeassistant/components/shelly/translations/de.json +++ b/homeassistant/components/shelly/translations/de.json @@ -33,14 +33,20 @@ "button": "Taste", "button1": "Erste Taste", "button2": "Zweite Taste", - "button3": "Dritte Taste" + "button3": "Dritte Taste", + "button4": "Vierte Taste" }, "trigger_type": { + "btn_down": "{subtype} Taste nach unten", + "btn_up": "{subtype} Taste nach oben", "double": "{subtype} zweifach bet\u00e4tigt", + "double_push": "{subtype} Doppelter Push", "long": "{subtype} gehalten", + "long_push": "{subtype} langer Push", "long_single": "{subtype} gehalten und dann einfach bet\u00e4tigt", "single": "{subtype} einfach bet\u00e4tigt", "single_long": "{subtype} einfach bet\u00e4tigt und dann gehalten", + "single_push": "{subtype} einzelner Push", "triple": "{subtype} dreifach bet\u00e4tigt" } } diff --git a/homeassistant/components/shelly/translations/en.json b/homeassistant/components/shelly/translations/en.json index 2ed09356363..b48eb630024 100644 --- a/homeassistant/components/shelly/translations/en.json +++ b/homeassistant/components/shelly/translations/en.json @@ -37,17 +37,17 @@ "button4": "Fourth button" }, "trigger_type": { + "btn_down": "{subtype} button down", + "btn_up": "{subtype} button up", "double": "{subtype} double clicked", + "double_push": "{subtype} double push", "long": " {subtype} long clicked", + "long_push": " {subtype} long push", "long_single": "{subtype} long clicked and then single clicked", "single": "{subtype} single clicked", "single_long": "{subtype} single clicked and then long clicked", - "triple": "{subtype} triple clicked", - "btn_down": "{subtype} button down", - "btn_up": "{subtype} button up", "single_push": "{subtype} single push", - "double_push": "{subtype} double push", - "long_push": " {subtype} long push" + "triple": "{subtype} triple clicked" } } } \ No newline at end of file diff --git a/homeassistant/components/shelly/translations/es.json b/homeassistant/components/shelly/translations/es.json index 09cc3f51378..6f5c86417d4 100644 --- a/homeassistant/components/shelly/translations/es.json +++ b/homeassistant/components/shelly/translations/es.json @@ -33,14 +33,20 @@ "button": "Bot\u00f3n", "button1": "Primer bot\u00f3n", "button2": "Segundo bot\u00f3n", - "button3": "Tercer bot\u00f3n" + "button3": "Tercer bot\u00f3n", + "button4": "Cuarto bot\u00f3n" }, "trigger_type": { + "btn_down": "Bot\u00f3n {subtype} pulsado", + "btn_up": "Bot\u00f3n {subtype} soltado", "double": "Pulsaci\u00f3n doble de {subtype}", + "double_push": "Pulsaci\u00f3n doble de {subtype}", "long": "Pulsaci\u00f3n larga de {subtype}", + "long_push": "Pulsaci\u00f3n larga de {subtype}", "long_single": "Pulsaci\u00f3n larga de {subtype} seguida de una pulsaci\u00f3n simple", "single": "Pulsaci\u00f3n simple de {subtype}", "single_long": "Pulsaci\u00f3n simple de {subtype} seguida de una pulsaci\u00f3n larga", + "single_push": "Pulsaci\u00f3n simple de {subtype}", "triple": "Pulsaci\u00f3n triple de {subtype}" } } diff --git a/homeassistant/components/shelly/translations/et.json b/homeassistant/components/shelly/translations/et.json index 7059ce6b3d3..7db0eaad4ac 100644 --- a/homeassistant/components/shelly/translations/et.json +++ b/homeassistant/components/shelly/translations/et.json @@ -33,14 +33,20 @@ "button": "Nupp", "button1": "Esimene nupp", "button2": "Teine nupp", - "button3": "Kolmas nupp" + "button3": "Kolmas nupp", + "button4": "Neljas nupp" }, "trigger_type": { + "btn_down": "{subtype} nupp vajutatud", + "btn_up": "{subtype} nupp vabastatud", "double": "Nuppu {subtype} topeltkl\u00f5psati", + "double_push": "{subtype} topeltkl\u00f5ps", "long": "Nuppu \"{subtype}\" hoiti all", + "long_push": "{subtype} pikk vajutus", "long_single": "Nuppu {subtype} hoiti all ja seej\u00e4rel kl\u00f5psati", "single": "Nuppu {subtype} kl\u00f5psati", "single_long": "Nuppu {subtype} kl\u00f5psati \u00fcks kord ja seej\u00e4rel hoiti all", + "single_push": "{subtype} l\u00fchike vajutus", "triple": "Nuppu {subtype} kl\u00f5psati kolm korda" } } diff --git a/homeassistant/components/shelly/translations/he.json b/homeassistant/components/shelly/translations/he.json index a27b19c08e7..5eb76e4b55e 100644 --- a/homeassistant/components/shelly/translations/he.json +++ b/homeassistant/components/shelly/translations/he.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", + "unsupported_firmware": "\u05d4\u05d4\u05ea\u05e7\u05df \u05de\u05e9\u05ea\u05de\u05e9 \u05d1\u05d2\u05d9\u05e8\u05e1\u05ea \u05e7\u05d5\u05e9\u05d7\u05d4 \u05e9\u05d0\u05d9\u05e0\u05d4 \u05e0\u05ea\u05de\u05db\u05ea." }, "error": { "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", @@ -22,8 +23,31 @@ "user": { "data": { "host": "\u05de\u05d0\u05e8\u05d7" - } + }, + "description": "\u05dc\u05e4\u05e0\u05d9 \u05d4\u05d4\u05ea\u05e7\u05e0\u05d4, \u05d9\u05e9 \u05dc\u05d4\u05e2\u05d9\u05e8 \u05d4\u05ea\u05e7\u05e0\u05d9\u05dd \u05d4\u05de\u05d5\u05e4\u05e2\u05dc\u05d9\u05dd \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05e1\u05d5\u05dc\u05dc\u05d4, \u05db\u05e2\u05ea \u05d1\u05d0\u05e4\u05e9\u05e8\u05d5\u05ea\u05da \u05dc\u05d4\u05e2\u05d9\u05e8 \u05d0\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05dc\u05d7\u05d9\u05e6\u05d4 \u05e2\u05dc\u05d9\u05d5." } } + }, + "device_automation": { + "trigger_subtype": { + "button": "\u05dc\u05d7\u05e6\u05df", + "button1": "\u05dc\u05d7\u05e6\u05df \u05e8\u05d0\u05e9\u05d5\u05df", + "button2": "\u05dc\u05d7\u05e6\u05df \u05e9\u05e0\u05d9", + "button3": "\u05dc\u05d7\u05e6\u05df \u05e9\u05dc\u05d9\u05e9\u05d9", + "button4": "\u05dc\u05d7\u05e6\u05df \u05e8\u05d1\u05d9\u05e2\u05d9" + }, + "trigger_type": { + "btn_down": "{subtype} \u05dc\u05d7\u05e6\u05df \u05de\u05d8\u05d4", + "btn_up": "{subtype} \u05dc\u05d7\u05e6\u05df\u05df \u05de\u05e2\u05dc\u05d4", + "double": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4", + "double_push": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4", + "long": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05de\u05d5\u05e9\u05db\u05ea", + "long_push": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05de\u05d5\u05e9\u05db\u05ea", + "long_single": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05de\u05d5\u05e9\u05db\u05ea \u05d5\u05dc\u05d0\u05d7\u05e8 \u05de\u05db\u05df \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d1\u05d5\u05d3\u05d3\u05ea", + "single": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d1\u05d5\u05d3\u05d3\u05ea", + "single_long": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d1\u05d5\u05d3\u05d3\u05ea \u05d5\u05dc\u05d0\u05d7\u05e8 \u05de\u05db\u05df \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05de\u05d5\u05e9\u05db\u05ea", + "single_push": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d1\u05d5\u05d3\u05d3\u05ea", + "triple": "{subtype} \u05dc\u05d7\u05d9\u05e6\u05d4 \u05de\u05e9\u05d5\u05dc\u05e9\u05ea" + } } } \ No newline at end of file diff --git a/homeassistant/components/shelly/translations/hu.json b/homeassistant/components/shelly/translations/hu.json index 9388e26515a..bfaf591d7c2 100644 --- a/homeassistant/components/shelly/translations/hu.json +++ b/homeassistant/components/shelly/translations/hu.json @@ -12,7 +12,7 @@ "flow_title": "{name}", "step": { "confirm_discovery": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a(z) {model} a(z) {host} c\u00edmen? \n\n A jelsz\u00f3val v\u00e9dett akkumul\u00e1toros eszk\u00f6z\u00f6ket fel kell \u00e9breszteni, miel\u0151tt folytatn\u00e1 a be\u00e1ll\u00edt\u00e1st.\n Az elemmel m\u0171k\u00f6d\u0151, jelsz\u00f3val nem v\u00e9dett eszk\u00f6z\u00f6k hozz\u00e1ad\u00e1sra ker\u00fclnek, amikor az eszk\u00f6z fel\u00e9bred, most manu\u00e1lisan \u00e9bresztheti fel az eszk\u00f6zt egy rajta l\u00e9v\u0151 gombbal, vagy v\u00e1rhat a k\u00f6vetkez\u0151 adatfriss\u00edt\u00e9sre." + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani {model}-t {host} c\u00edmen? \n\nA jelsz\u00f3val v\u00e9dett akkumul\u00e1toros eszk\u00f6z\u00f6ket fel kell \u00e9breszteni, miel\u0151tt folytatn\u00e1 a be\u00e1ll\u00edt\u00e1st.\nAz elemmel m\u0171k\u00f6d\u0151, jelsz\u00f3val nem v\u00e9dett eszk\u00f6z\u00f6k hozz\u00e1ad\u00e1sra ker\u00fclnek, amikor az eszk\u00f6z fel\u00e9bred, most manu\u00e1lisan \u00e9bresztheti fel az eszk\u00f6zt egy rajta l\u00e9v\u0151 gombbal, vagy v\u00e1rhat a k\u00f6vetkez\u0151 adatfriss\u00edt\u00e9sre." }, "credentials": { "data": { @@ -22,7 +22,7 @@ }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "A be\u00e1ll\u00edt\u00e1s el\u0151tt az akkumul\u00e1toros eszk\u00f6z\u00f6ket fel kell \u00e9breszteni, most egy rajta l\u00e9v\u0151 gombbal fel\u00e9bresztheted az eszk\u00f6zt." } @@ -33,14 +33,20 @@ "button": "Gomb", "button1": "Els\u0151 gomb", "button2": "M\u00e1sodik gomb", - "button3": "Harmadik gomb" + "button3": "Harmadik gomb", + "button4": "Negyedik gomb" }, "trigger_type": { + "btn_down": "{subtype} gomb lenyomva", + "btn_up": "{subtype} gomb elengedve", "double": "{subtype} dupla kattint\u00e1s", + "double_push": "{subtype} dupla lenyom\u00e1s", "long": "{subtype} hosszan nyomva", + "long_push": "{subtype} hosszan lenyomva", "long_single": "{subtype} hosszan nyomva, majd egy kattint\u00e1s", "single": "{subtype} egy kattint\u00e1s", "single_long": "{subtype} egy kattint\u00e1s, majd hosszan nyomva", + "single_push": "{subtype} egy lenyom\u00e1s", "triple": "{subtype} tripla kattint\u00e1s" } } diff --git a/homeassistant/components/shelly/translations/id.json b/homeassistant/components/shelly/translations/id.json index 606ee473805..2f385796fd1 100644 --- a/homeassistant/components/shelly/translations/id.json +++ b/homeassistant/components/shelly/translations/id.json @@ -38,9 +38,11 @@ "trigger_type": { "double": "{subtype} diklik dua kali", "long": "{subtype} diklik lama", + "long_push": "Push lama {subtype}", "long_single": "{subtype} diklik lama kemudian diklik sekali", "single": "{subtype} diklik sekali", "single_long": "{subtype} diklik sekali kemudian diklik lama", + "single_push": "Push tunggal {subtype}", "triple": "{subtype} diklik tiga kali" } } diff --git a/homeassistant/components/shelly/translations/it.json b/homeassistant/components/shelly/translations/it.json index 051cf88dc38..c004141cac4 100644 --- a/homeassistant/components/shelly/translations/it.json +++ b/homeassistant/components/shelly/translations/it.json @@ -33,14 +33,20 @@ "button": "Pulsante", "button1": "Primo pulsante", "button2": "Secondo pulsante", - "button3": "Terzo pulsante" + "button3": "Terzo pulsante", + "button4": "Quarto pulsante" }, "trigger_type": { + "btn_down": "{subtype} pulsante in gi\u00f9", + "btn_up": "{subtype} pulsante in su", "double": "{subtype} premuto due volte", + "double_push": "{subtype} doppia pressione", "long": "{subtype} premuto a lungo", + "long_push": "{subtype} pressione prolungata", "long_single": "{subtype} premuto a lungo e poi singolarmente", "single": "{subtype} premuto singolarmente", "single_long": "{subtype} premuto singolarmente e poi a lungo", + "single_push": "{subtype} singola pressione", "triple": "{subtype} premuto tre volte" } } diff --git a/homeassistant/components/shelly/translations/nl.json b/homeassistant/components/shelly/translations/nl.json index 4a58fa31d85..0251e2e7267 100644 --- a/homeassistant/components/shelly/translations/nl.json +++ b/homeassistant/components/shelly/translations/nl.json @@ -33,14 +33,20 @@ "button": "Knop", "button1": "Eerste knop", "button2": "Tweede knop", - "button3": "Derde knop" + "button3": "Derde knop", + "button4": "Vierde knop" }, "trigger_type": { + "btn_down": "{subtype} knop omlaag", + "btn_up": "{subtype} knop omhoog", "double": "{subtype} dubbel geklikt", + "double_push": "{subtype} dubbele druk", "long": "{subtype} lang geklikt", + "long_push": " {subtype} lange druk", "long_single": "{subtype} lang geklikt en daarna \u00e9\u00e9n keer geklikt", "single": "{subtype} enkel geklikt", "single_long": "{subtype} een keer geklikt en daarna lang geklikt", + "single_push": "{subtype} een druk", "triple": "{subtype} driemaal geklikt" } } diff --git a/homeassistant/components/shelly/translations/no.json b/homeassistant/components/shelly/translations/no.json index 90cfe3ca906..dd587e56a6b 100644 --- a/homeassistant/components/shelly/translations/no.json +++ b/homeassistant/components/shelly/translations/no.json @@ -33,14 +33,20 @@ "button": "Knapp", "button1": "F\u00f8rste knapp", "button2": "Andre knapp", - "button3": "Tredje knapp" + "button3": "Tredje knapp", + "button4": "Fjerde knapp" }, "trigger_type": { + "btn_down": "{subtype}-knappen ned", + "btn_up": "{subtype} -knappen opp", "double": "{subtype} dobbeltklikket", + "double_push": "{subtype} dobbelt trykk", "long": "{subtype} lenge klikket", + "long_push": "{subtype} langt trykk", "long_single": "{subtype} lengre klikk og deretter et enkeltklikk", "single": "{subtype} enkeltklikket", "single_long": "{subtype} enkeltklikket og deretter et lengre klikk", + "single_push": "{subtype} enkelt trykk", "triple": "{subtype} trippelklikket" } } diff --git a/homeassistant/components/shelly/translations/ru.json b/homeassistant/components/shelly/translations/ru.json index 9996e347e96..d3f38aa9eeb 100644 --- a/homeassistant/components/shelly/translations/ru.json +++ b/homeassistant/components/shelly/translations/ru.json @@ -24,7 +24,7 @@ "data": { "host": "\u0425\u043e\u0441\u0442" }, - "description": "\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043e\u0442 \u0431\u0430\u0442\u0430\u0440\u0435\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437 \u0441\u043f\u044f\u0449\u0435\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430, \u043d\u0430\u0436\u0430\u0432 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435." + "description": "\u0420\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043e\u0442 \u0431\u0430\u0442\u0430\u0440\u0435\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437 \u0441\u043f\u044f\u0449\u0435\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043a\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435." } } }, @@ -33,14 +33,20 @@ "button": "\u041a\u043d\u043e\u043f\u043a\u0430", "button1": "\u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", "button2": "\u0412\u0442\u043e\u0440\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430", - "button3": "\u0422\u0440\u0435\u0442\u044c\u044f \u043a\u043d\u043e\u043f\u043a\u0430" + "button3": "\u0422\u0440\u0435\u0442\u044c\u044f \u043a\u043d\u043e\u043f\u043a\u0430", + "button4": "\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430" }, "trigger_type": { + "btn_down": "{subtype} \u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 '\u0432\u043d\u0438\u0437'", + "btn_up": "{subtype} \u0432 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 '\u0432\u0432\u0435\u0440\u0445'", "double": "{subtype} \u043d\u0430\u0436\u0430\u0442\u0430 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430", + "double_push": "{subtype} \u043d\u0430\u0436\u0430\u0442\u0430 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430", "long": "{subtype} \u0434\u043e\u043b\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0430", + "long_push": "{subtype} \u0434\u043e\u043b\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0430", "long_single": "{subtype} \u0434\u043e\u043b\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0430 \u0438 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437", "single": "{subtype} \u043d\u0430\u0436\u0430\u0442\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437", "single_long": "{subtype} \u043d\u0430\u0436\u0430\u0442\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u043b\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0430", + "single_push": "{subtype} \u043d\u0430\u0436\u0430\u0442\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437", "triple": "{subtype} \u043d\u0430\u0436\u0430\u0442\u0430 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430" } } diff --git a/homeassistant/components/shelly/translations/zh-Hant.json b/homeassistant/components/shelly/translations/zh-Hant.json index d0e255560be..bc746ccac2a 100644 --- a/homeassistant/components/shelly/translations/zh-Hant.json +++ b/homeassistant/components/shelly/translations/zh-Hant.json @@ -33,14 +33,20 @@ "button": "\u6309\u9215", "button1": "\u7b2c\u4e00\u500b\u6309\u9215", "button2": "\u7b2c\u4e8c\u500b\u6309\u9215", - "button3": "\u7b2c\u4e09\u500b\u6309\u9215" + "button3": "\u7b2c\u4e09\u500b\u6309\u9215", + "button4": "\u7b2c\u56db\u500b\u6309\u9215" }, "trigger_type": { + "btn_down": "\"{subtype}\" \u6309\u9215\u6309\u4e0b", + "btn_up": "\"{subtype}\" \u6309\u9215\u91cb\u653e", "double": "{subtype} \u96d9\u64ca", + "double_push": "{subtype} \u96d9\u6309", "long": "{subtype} \u9577\u6309", + "long_push": "{subtype} \u9577\u6309", "long_single": "{subtype} \u9577\u6309\u5f8c\u55ae\u64ca", "single": "{subtype} \u55ae\u64ca", "single_long": "{subtype} \u55ae\u64ca\u5f8c\u9577\u6309", + "single_push": "{subtype} \u55ae\u6309", "triple": "{subtype} \u4e09\u9023\u64ca" } } diff --git a/homeassistant/components/shopping_list/translations/hu.json b/homeassistant/components/shopping_list/translations/hu.json index 5f092963da3..27c984ce1ae 100644 --- a/homeassistant/components/shopping_list/translations/hu.json +++ b/homeassistant/components/shopping_list/translations/hu.json @@ -5,7 +5,7 @@ }, "step": { "user": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a bev\u00e1s\u00e1rl\u00f3list\u00e1t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a bev\u00e1s\u00e1rl\u00f3list\u00e1t?", "title": "Bev\u00e1s\u00e1rl\u00f3lista" } } diff --git a/homeassistant/components/sia/translations/es.json b/homeassistant/components/sia/translations/es.json index 34ff6847421..8e1bb05978d 100644 --- a/homeassistant/components/sia/translations/es.json +++ b/homeassistant/components/sia/translations/es.json @@ -6,10 +6,18 @@ "invalid_key_format": "La clave no es un valor hexadecimal, por favor utilice s\u00f3lo 0-9 y A-F.", "invalid_key_length": "La clave no tiene la longitud correcta, tiene que ser de 16, 24 o 32 caracteres hexadecimales.", "invalid_ping": "El intervalo de ping debe estar entre 1 y 1440 minutos.", - "invalid_zones": "Tiene que haber al menos 1 zona." + "invalid_zones": "Tiene que haber al menos 1 zona.", + "unknown": "Error inesperado" }, "step": { "additional_account": { + "data": { + "account": "ID de la cuenta", + "additional_account": "Cuentas adicionales", + "encryption_key": "Clave de encriptaci\u00f3n", + "ping_interval": "Intervalo de ping (min)", + "zones": "N\u00famero de zonas de la cuenta" + }, "title": "Agrega otra cuenta al puerto actual." }, "user": { @@ -30,7 +38,8 @@ "step": { "options": { "data": { - "ignore_timestamps": "Ignore la verificaci\u00f3n de la marca de tiempo de los eventos SIA" + "ignore_timestamps": "Ignore la verificaci\u00f3n de la marca de tiempo de los eventos SIA", + "zones": "N\u00famero de zonas de la cuenta" }, "description": "Configure las opciones para la cuenta: {account}", "title": "Opciones para la configuraci\u00f3n de SIA." diff --git a/homeassistant/components/sia/translations/id.json b/homeassistant/components/sia/translations/id.json new file mode 100644 index 00000000000..e7ab7918fb3 --- /dev/null +++ b/homeassistant/components/sia/translations/id.json @@ -0,0 +1,50 @@ +{ + "config": { + "error": { + "invalid_account_format": "Format akun ini tidak dalam nilai heksadesimal, gunakan hanya karakter 0-9 dan A-F.", + "invalid_account_length": "Panjang format akun tidak tepat, harus antara 3 dan 16 karakter.", + "invalid_key_format": "Format kunci ini tidak dalam nilai heksadesimal, gunakan hanya karakter 0-9 dan A-F.", + "invalid_key_length": "Panjang format kunci tidak tepat, harus antara 16, 25, atau 32 karakter heksadesimal.", + "invalid_ping": "Interval ping harus antara 1 dan 1440 menit.", + "invalid_zones": "Setidaknya harus ada 1 zona.", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "additional_account": { + "data": { + "account": "ID Akun", + "additional_account": "Akun lainnya", + "encryption_key": "Kunci Enkripsi", + "ping_interval": "Interval Ping (menit)", + "zones": "Jumlah zona untuk akun" + }, + "title": "Tambahkan akun lain ke port saat ini." + }, + "user": { + "data": { + "account": "ID Akun", + "additional_account": "Akun lainnya", + "encryption_key": "Kunci Enkripsi", + "ping_interval": "Interval Ping (menit)", + "port": "Port", + "protocol": "Protokol", + "zones": "Jumlah zona untuk akun" + }, + "title": "Buat koneksi untuk sistem alarm berbasis SIA." + } + } + }, + "options": { + "step": { + "options": { + "data": { + "ignore_timestamps": "Abaikan pemeriksaan stempel waktu peristiwa SIA", + "zones": "Jumlah zona untuk akun" + }, + "description": "Setel opsi untuk akun: {account}", + "title": "Opsi untuk Pengaturan SIA." + } + } + }, + "title": "Sistem Alarm SIA" +} \ No newline at end of file diff --git a/homeassistant/components/simplisafe/translations/hu.json b/homeassistant/components/simplisafe/translations/hu.json index f7c1b5afd9d..ed0eb0b2212 100644 --- a/homeassistant/components/simplisafe/translations/hu.json +++ b/homeassistant/components/simplisafe/translations/hu.json @@ -28,7 +28,7 @@ "password": "Jelsz\u00f3", "username": "E-mail" }, - "title": "T\u00f6ltsd ki az adataid" + "title": "T\u00f6ltse ki az adatait" } } }, diff --git a/homeassistant/components/simplisafe/translations/id.json b/homeassistant/components/simplisafe/translations/id.json index 512d6a38405..c9ff0f96bb9 100644 --- a/homeassistant/components/simplisafe/translations/id.json +++ b/homeassistant/components/simplisafe/translations/id.json @@ -19,7 +19,7 @@ "data": { "password": "Kata Sandi" }, - "description": "Token akses Anda telah kedaluwarsa atau dicabut. Masukkan kata sandi Anda untuk menautkan kembali akun Anda.", + "description": "Akses Anda telah kedaluwarsa atau dicabut. Masukkan kata sandi Anda untuk menautkan kembali akun Anda.", "title": "Autentikasi Ulang Integrasi" }, "user": { diff --git a/homeassistant/components/sma/translations/hu.json b/homeassistant/components/sma/translations/hu.json index cab063cd077..f1958dbcc1f 100644 --- a/homeassistant/components/sma/translations/hu.json +++ b/homeassistant/components/sma/translations/hu.json @@ -14,7 +14,7 @@ "user": { "data": { "group": "Csoport", - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "password": "Jelsz\u00f3", "ssl": "SSL tan\u00fas\u00edtv\u00e1nyt haszn\u00e1l", "verify_ssl": "Ellen\u0151rizze az SSL tan\u00fas\u00edtv\u00e1nyt" diff --git a/homeassistant/components/smappee/translations/hu.json b/homeassistant/components/smappee/translations/hu.json index 5b00dffde9c..5b4a83a74b0 100644 --- a/homeassistant/components/smappee/translations/hu.json +++ b/homeassistant/components/smappee/translations/hu.json @@ -6,7 +6,7 @@ "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_mdns": "Nem t\u00e1mogatott eszk\u00f6z a Smappee integr\u00e1ci\u00f3hoz.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz." }, "flow_title": "{name}", @@ -19,9 +19,9 @@ }, "local": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "Adja meg a gazdag\u00e9pet a Smappee helyi integr\u00e1ci\u00f3j\u00e1nak elind\u00edt\u00e1s\u00e1hoz" + "description": "Adja meg a c\u00edmet a Smappee helyi integr\u00e1ci\u00f3j\u00e1nak elind\u00edt\u00e1s\u00e1hoz" }, "pick_implementation": { "title": "V\u00e1lassz hiteles\u00edt\u00e9si m\u00f3dszert" diff --git a/homeassistant/components/smappee/translations/id.json b/homeassistant/components/smappee/translations/id.json index b72200c34ca..66efc23dcee 100644 --- a/homeassistant/components/smappee/translations/id.json +++ b/homeassistant/components/smappee/translations/id.json @@ -9,7 +9,7 @@ "missing_configuration": "Komponen tidak dikonfigurasi. Ikuti petunjuk dalam dokumentasi.", "no_url_available": "Tidak ada URL yang tersedia. Untuk informasi tentang kesalahan ini, [lihat bagian bantuan]({docs_url})" }, - "flow_title": "Smappee: {name}", + "flow_title": "{name}", "step": { "environment": { "data": { diff --git a/homeassistant/components/smartthings/translations/hu.json b/homeassistant/components/smartthings/translations/hu.json index 05e99bef2ea..90ea748ae33 100644 --- a/homeassistant/components/smartthings/translations/hu.json +++ b/homeassistant/components/smartthings/translations/hu.json @@ -1,15 +1,15 @@ { "config": { "abort": { - "invalid_webhook_url": "A Home Assistant nincs megfelel\u0151en konfigur\u00e1lva a SmartThings friss\u00edt\u00e9seinek fogad\u00e1s\u00e1ra. A webhook URL \u00e9rv\u00e9nytelen:\n > {webhook_url} \n\n K\u00e9rj\u00fck, friss\u00edtse konfigur\u00e1ci\u00f3j\u00e1t az [utas\u00edt\u00e1sok] szerint ({component_url}), ind\u00edtsa \u00fajra a Home Assistant alkalmaz\u00e1st, \u00e9s pr\u00f3b\u00e1lja \u00fajra.", + "invalid_webhook_url": "Home Assistant nincs megfelel\u0151en konfigur\u00e1lva a SmartThings friss\u00edt\u00e9seinek fogad\u00e1s\u00e1ra. A webhook URL \u00e9rv\u00e9nytelen:\n > {webhook_url} \n\nK\u00e9rj\u00fck, friss\u00edtse konfigur\u00e1ci\u00f3j\u00e1t az [utas\u00edt\u00e1sok]({component_url}) szerint, ind\u00edtsa \u00fajra a Home Assistant alkalmaz\u00e1st, \u00e9s pr\u00f3b\u00e1lja \u00fajra.", "no_available_locations": "Nincsenek be\u00e1ll\u00edthat\u00f3 SmartThings helyek a Home Assistant alkalmaz\u00e1sban." }, "error": { - "app_setup_error": "A SmartApp be\u00e1ll\u00edt\u00e1sa nem siker\u00fclt. K\u00e9rlek pr\u00f3b\u00e1ld \u00fajra.", + "app_setup_error": "A SmartApp be\u00e1ll\u00edt\u00e1sa nem siker\u00fclt. K\u00e9rem, pr\u00f3b\u00e1lja \u00fajra.", "token_forbidden": "A token nem rendelkezik a sz\u00fcks\u00e9ges OAuth-tartom\u00e1nyokkal.", "token_invalid_format": "A tokennek UID / GUID form\u00e1tumban kell lennie", "token_unauthorized": "A token \u00e9rv\u00e9nytelen vagy m\u00e1r nem enged\u00e9lyezett.", - "webhook_error": "A SmartThings nem tudta \u00e9rv\u00e9nyes\u00edteni a `base_url`-ben konfigur\u00e1lt v\u00e9gpontot. K\u00e9rlek, tekintsd \u00e1t az \u00f6sszetev\u0151 k\u00f6vetelm\u00e9nyeit." + "webhook_error": "SmartThings nem tudta \u00e9rv\u00e9nyes\u00edteni a webhook URL-t. K\u00e9rj\u00fck, ellen\u0151rizze, hogy a webhook URL el\u00e9rhet\u0151-e az internet fel\u0151l, \u00e9s pr\u00f3b\u00e1lja meg \u00fajra." }, "step": { "authorize": { @@ -30,7 +30,7 @@ "title": "Hely kiv\u00e1laszt\u00e1sa" }, "user": { - "description": "K\u00e9rlek add meg a SmartThings [Personal Access Tokent]({token_url}), amit az [instrukci\u00f3k]({component_url}) alapj\u00e1n hozt\u00e1l l\u00e9tre.", + "description": "K\u00e9rem adja meg a SmartThings [Personal Access Tokent]({token_url}), amit az [instrukci\u00f3k]({component_url}) alapj\u00e1n hozott l\u00e9tre.", "title": "Callback URL meger\u0151s\u00edt\u00e9se" } } diff --git a/homeassistant/components/smarttub/translations/ca.json b/homeassistant/components/smarttub/translations/ca.json index d00c4d26c98..4f0e9a2c502 100644 --- a/homeassistant/components/smarttub/translations/ca.json +++ b/homeassistant/components/smarttub/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/smarttub/translations/hu.json b/homeassistant/components/smarttub/translations/hu.json index e9a45d3773f..3764b27abd2 100644 --- a/homeassistant/components/smarttub/translations/hu.json +++ b/homeassistant/components/smarttub/translations/hu.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", + "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" }, "error": { @@ -17,7 +17,7 @@ "email": "E-mail", "password": "Jelsz\u00f3" }, - "description": "Add meg SmartTub e-mail c\u00edmet \u00e9s jelsz\u00f3t a bejelentkez\u00e9shez", + "description": "Adja meg SmartTub e-mail c\u00edmet \u00e9s jelsz\u00f3t a bejelentkez\u00e9shez", "title": "Bejelentkez\u00e9s" } } diff --git a/homeassistant/components/smarttub/translations/id.json b/homeassistant/components/smarttub/translations/id.json index bf32b29d1e7..9b021f65771 100644 --- a/homeassistant/components/smarttub/translations/id.json +++ b/homeassistant/components/smarttub/translations/id.json @@ -9,6 +9,7 @@ }, "step": { "reauth_confirm": { + "description": "Integrasi SmartTub perlu mengautentikasi ulang akun Anda", "title": "Autentikasi Ulang Integrasi" }, "user": { diff --git a/homeassistant/components/smarttub/translations/ko.json b/homeassistant/components/smarttub/translations/ko.json index b68ff871d4d..ff50dadc63e 100644 --- a/homeassistant/components/smarttub/translations/ko.json +++ b/homeassistant/components/smarttub/translations/ko.json @@ -8,6 +8,9 @@ "invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4" }, "step": { + "reauth_confirm": { + "title": "\ud1b5\ud569 \uad6c\uc131\uc694\uc18c \uc7ac\uc778\uc99d\ud558\uae30" + }, "user": { "data": { "email": "\uc774\uba54\uc77c", diff --git a/homeassistant/components/solarlog/translations/hu.json b/homeassistant/components/solarlog/translations/hu.json index 23baa393942..ada2ab95751 100644 --- a/homeassistant/components/solarlog/translations/hu.json +++ b/homeassistant/components/solarlog/translations/hu.json @@ -10,7 +10,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "A Solar-Log szenzorokhoz haszn\u00e1land\u00f3 el\u0151tag" }, "title": "Hat\u00e1rozza meg a Solar-Log kapcsolatot" diff --git a/homeassistant/components/soma/translations/hu.json b/homeassistant/components/soma/translations/hu.json index c3e572ebe0a..e7ac9d8d71c 100644 --- a/homeassistant/components/soma/translations/hu.json +++ b/homeassistant/components/soma/translations/hu.json @@ -13,7 +13,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" }, "description": "K\u00e9rj\u00fck, adja meg a SOMA Connect csatlakoz\u00e1si be\u00e1ll\u00edt\u00e1sait.", diff --git a/homeassistant/components/somfy/translations/hu.json b/homeassistant/components/somfy/translations/hu.json index ce4e94b3399..06b0894faf1 100644 --- a/homeassistant/components/somfy/translations/hu.json +++ b/homeassistant/components/somfy/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, diff --git a/homeassistant/components/somfy_mylink/translations/hu.json b/homeassistant/components/somfy_mylink/translations/hu.json index 3610a930022..fa6620859f5 100644 --- a/homeassistant/components/somfy_mylink/translations/hu.json +++ b/homeassistant/components/somfy_mylink/translations/hu.json @@ -12,7 +12,7 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port", "system_id": "Rendszerazonos\u00edt\u00f3" }, diff --git a/homeassistant/components/somfy_mylink/translations/id.json b/homeassistant/components/somfy_mylink/translations/id.json index 0203ae421e2..c4b2269ef2c 100644 --- a/homeassistant/components/somfy_mylink/translations/id.json +++ b/homeassistant/components/somfy_mylink/translations/id.json @@ -8,7 +8,7 @@ "invalid_auth": "Autentikasi tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Somfy MyLink {mac} ({ip})", + "flow_title": "{mac} ({ip})", "step": { "user": { "data": { diff --git a/homeassistant/components/sonarr/translations/hu.json b/homeassistant/components/sonarr/translations/hu.json index 6ebdb22404c..7ac0b621b13 100644 --- a/homeassistant/components/sonarr/translations/hu.json +++ b/homeassistant/components/sonarr/translations/hu.json @@ -19,7 +19,7 @@ "data": { "api_key": "API kulcs", "base_path": "El\u00e9r\u00e9si \u00fat az API-hoz", - "host": "Hoszt", + "host": "C\u00edm", "port": "Port", "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata", "verify_ssl": "SSL-tan\u00fas\u00edtv\u00e1ny ellen\u0151rz\u00e9se" diff --git a/homeassistant/components/sonarr/translations/id.json b/homeassistant/components/sonarr/translations/id.json index ffaf1d22604..9d906a07f91 100644 --- a/homeassistant/components/sonarr/translations/id.json +++ b/homeassistant/components/sonarr/translations/id.json @@ -9,7 +9,7 @@ "cannot_connect": "Gagal terhubung", "invalid_auth": "Autentikasi tidak valid" }, - "flow_title": "Sonarr: {name}", + "flow_title": "{name}", "step": { "reauth_confirm": { "description": "Integrasi Sonarr perlu diautentikasi ulang secara manual dengan API Sonarr yang dihosting di: {host}", diff --git a/homeassistant/components/songpal/translations/hu.json b/homeassistant/components/songpal/translations/hu.json index 2bce32d0cb8..a02844a50a7 100644 --- a/homeassistant/components/songpal/translations/hu.json +++ b/homeassistant/components/songpal/translations/hu.json @@ -10,7 +10,7 @@ "flow_title": "{name} ({host})", "step": { "init": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}({host})-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name} ({host})?" }, "user": { "data": { diff --git a/homeassistant/components/songpal/translations/id.json b/homeassistant/components/songpal/translations/id.json index 2b8149661bc..9e619e5bf76 100644 --- a/homeassistant/components/songpal/translations/id.json +++ b/homeassistant/components/songpal/translations/id.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "Sony Songpal {name} ({host})", + "flow_title": "{name} ({host})", "step": { "init": { "description": "Ingin menyiapkan {name} ({host})?" diff --git a/homeassistant/components/sonos/translations/he.json b/homeassistant/components/sonos/translations/he.json index 878c14a5119..64824b942ec 100644 --- a/homeassistant/components/sonos/translations/he.json +++ b/homeassistant/components/sonos/translations/he.json @@ -2,6 +2,7 @@ "config": { "abort": { "no_devices_found": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05de\u05db\u05e9\u05d9\u05e8\u05d9\u05dd \u05d1\u05e8\u05e9\u05ea", + "not_sonos_device": "\u05d4\u05ea\u05e7\u05df \u05e9\u05d4\u05ea\u05d2\u05dc\u05d4 \u05d0\u05d9\u05e0\u05d5 \u05d4\u05ea\u05e7\u05df Sonos", "single_instance_allowed": "\u05ea\u05e6\u05d5\u05e8\u05ea\u05d5 \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e8\u05e7 \u05ea\u05e6\u05d5\u05e8\u05d4 \u05d0\u05d7\u05ea \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea." }, "step": { diff --git a/homeassistant/components/sonos/translations/hu.json b/homeassistant/components/sonos/translations/hu.json index a928f97b3d6..a521c1e9d75 100644 --- a/homeassistant/components/sonos/translations/hu.json +++ b/homeassistant/components/sonos/translations/hu.json @@ -7,7 +7,7 @@ }, "step": { "confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a Sonos-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a Sonos-t?" } } } diff --git a/homeassistant/components/sonos/translations/id.json b/homeassistant/components/sonos/translations/id.json index 145e2775e4a..d64dccf3af3 100644 --- a/homeassistant/components/sonos/translations/id.json +++ b/homeassistant/components/sonos/translations/id.json @@ -2,6 +2,7 @@ "config": { "abort": { "no_devices_found": "Tidak ada perangkat yang ditemukan di jaringan", + "not_sonos_device": "Perangkat yang ditemukan bukan perangkat Sonos", "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." }, "step": { diff --git a/homeassistant/components/speedtestdotnet/translations/hu.json b/homeassistant/components/speedtestdotnet/translations/hu.json index cd08c3bd2d6..9e602652e5b 100644 --- a/homeassistant/components/speedtestdotnet/translations/hu.json +++ b/homeassistant/components/speedtestdotnet/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "user": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } }, @@ -16,7 +16,7 @@ "data": { "manual": "Automatikus friss\u00edt\u00e9s letilt\u00e1sa", "scan_interval": "Friss\u00edt\u00e9si gyakoris\u00e1g (perc)", - "server_name": "V\u00e1laszd ki a teszt szervert" + "server_name": "V\u00e1lassza ki a teszt szervert" } } } diff --git a/homeassistant/components/speedtestdotnet/translations/nl.json b/homeassistant/components/speedtestdotnet/translations/nl.json index 5de8460fd77..3a112d48e9d 100644 --- a/homeassistant/components/speedtestdotnet/translations/nl.json +++ b/homeassistant/components/speedtestdotnet/translations/nl.json @@ -6,7 +6,7 @@ }, "step": { "user": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } }, diff --git a/homeassistant/components/spotify/translations/hu.json b/homeassistant/components/spotify/translations/hu.json index 8ffeadaf842..136e6185b46 100644 --- a/homeassistant/components/spotify/translations/hu.json +++ b/homeassistant/components/spotify/translations/hu.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s az \u00e9rv\u00e9nyes\u00edt\u00e9si url gener\u00e1l\u00e1sa sor\u00e1n.", + "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s az \u00e9rv\u00e9nyes\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", "missing_configuration": "A Spotify integr\u00e1ci\u00f3 nincs konfigur\u00e1lva. K\u00e9rj\u00fck, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "reauth_account_mismatch": "A Spotify-fi\u00f3kkal hiteles\u00edtett fi\u00f3k nem egyezik meg az \u00faj hiteles\u00edt\u00e9shez sz\u00fcks\u00e9ges fi\u00f3kkal." diff --git a/homeassistant/components/squeezebox/translations/hu.json b/homeassistant/components/squeezebox/translations/hu.json index a047dbca45f..5c2a3d37e85 100644 --- a/homeassistant/components/squeezebox/translations/hu.json +++ b/homeassistant/components/squeezebox/translations/hu.json @@ -14,7 +14,7 @@ "step": { "edit": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" @@ -23,7 +23,7 @@ }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" } } } diff --git a/homeassistant/components/squeezebox/translations/id.json b/homeassistant/components/squeezebox/translations/id.json index 764c356ba84..02d82e872d8 100644 --- a/homeassistant/components/squeezebox/translations/id.json +++ b/homeassistant/components/squeezebox/translations/id.json @@ -10,7 +10,7 @@ "no_server_found": "Tidak dapat menemukan server secara otomatis.", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Logitech Squeezebox: {host}", + "flow_title": "{host}", "step": { "edit": { "data": { diff --git a/homeassistant/components/subaru/translations/ca.json b/homeassistant/components/subaru/translations/ca.json index 310747f613e..6b83af06bb8 100644 --- a/homeassistant/components/subaru/translations/ca.json +++ b/homeassistant/components/subaru/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "cannot_connect": "Ha fallat la connexi\u00f3" }, "error": { diff --git a/homeassistant/components/surepetcare/translations/ca.json b/homeassistant/components/surepetcare/translations/ca.json new file mode 100644 index 00000000000..5165473860a --- /dev/null +++ b/homeassistant/components/surepetcare/translations/ca.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "El compte ja est\u00e0 configurat" + }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "password": "Contrasenya", + "username": "Nom d'usuari" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/cs.json b/homeassistant/components/surepetcare/translations/cs.json new file mode 100644 index 00000000000..b6c00c05389 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/cs.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u00da\u010det je ji\u017e nastaven" + }, + "error": { + "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit", + "invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed", + "unknown": "Neo\u010dek\u00e1van\u00e1 chyba" + }, + "step": { + "user": { + "data": { + "password": "Heslo", + "username": "U\u017eivatelsk\u00e9 jm\u00e9no" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/de.json b/homeassistant/components/surepetcare/translations/de.json new file mode 100644 index 00000000000..14f319fb4d3 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/de.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Konto wurde bereits konfiguriert" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "password": "Passwort", + "username": "Benutzername" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/en.json b/homeassistant/components/surepetcare/translations/en.json new file mode 100644 index 00000000000..a6c0889765f --- /dev/null +++ b/homeassistant/components/surepetcare/translations/en.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Account is already configured" + }, + "error": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "unknown": "Unexpected error" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Username" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/es.json b/homeassistant/components/surepetcare/translations/es.json new file mode 100644 index 00000000000..3d3945748cb --- /dev/null +++ b/homeassistant/components/surepetcare/translations/es.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "La cuenta ya ha sido configurada" + }, + "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado" + }, + "step": { + "user": { + "data": { + "password": "Contrase\u00f1a", + "username": "Usuario" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/et.json b/homeassistant/components/surepetcare/translations/et.json new file mode 100644 index 00000000000..74f668d14dc --- /dev/null +++ b/homeassistant/components/surepetcare/translations/et.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Konto on juba h\u00e4\u00e4lestatud" + }, + "error": { + "cannot_connect": "\u00dchendamine nurjus", + "invalid_auth": "Tuvastamine nurjus", + "unknown": "Ootamatu t\u00f5rge" + }, + "step": { + "user": { + "data": { + "password": "Salas\u00f5na", + "username": "Kasutajanimi" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/he.json b/homeassistant/components/surepetcare/translations/he.json new file mode 100644 index 00000000000..454b7e1ae51 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/he.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "step": { + "user": { + "data": { + "password": "\u05e1\u05d9\u05e1\u05de\u05d4", + "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/hu.json b/homeassistant/components/surepetcare/translations/hu.json new file mode 100644 index 00000000000..cc0c820facf --- /dev/null +++ b/homeassistant/components/surepetcare/translations/hu.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van" + }, + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s", + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" + }, + "step": { + "user": { + "data": { + "password": "Jelsz\u00f3", + "username": "Felhaszn\u00e1l\u00f3n\u00e9v" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/id.json b/homeassistant/components/surepetcare/translations/id.json new file mode 100644 index 00000000000..a346fab8e56 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/id.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Akun sudah dikonfigurasi" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/it.json b/homeassistant/components/surepetcare/translations/it.json new file mode 100644 index 00000000000..aee18749ab0 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/it.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "L'account \u00e8 gi\u00e0 configurato" + }, + "error": { + "cannot_connect": "Impossibile connettersi", + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Nome utente" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/nl.json b/homeassistant/components/surepetcare/translations/nl.json new file mode 100644 index 00000000000..1dd597d28b4 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/nl.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Account is al geconfigureerd" + }, + "error": { + "cannot_connect": "Kan geen verbinding maken", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, + "step": { + "user": { + "data": { + "password": "Wachtwoord", + "username": "Gebruikersnaam" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/no.json b/homeassistant/components/surepetcare/translations/no.json new file mode 100644 index 00000000000..f34edbd641d --- /dev/null +++ b/homeassistant/components/surepetcare/translations/no.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Kontoen er allerede konfigurert" + }, + "error": { + "cannot_connect": "Tilkobling mislyktes", + "invalid_auth": "Ugyldig godkjenning", + "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "password": "Passord", + "username": "Brukernavn" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/pt-BR.json b/homeassistant/components/surepetcare/translations/pt-BR.json new file mode 100644 index 00000000000..c41610abb32 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/pt-BR.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "Dispositivo j\u00e1 configurado" + }, + "error": { + "cannot_connect": "Falha ao conectar", + "invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida", + "unknown": "Erro inesperado" + }, + "step": { + "user": { + "data": { + "password": "Senha", + "username": "Usu\u00e1rio" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/ru.json b/homeassistant/components/surepetcare/translations/ru.json new file mode 100644 index 00000000000..c31f79d1d04 --- /dev/null +++ b/homeassistant/components/surepetcare/translations/ru.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant." + }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/surepetcare/translations/zh-Hant.json b/homeassistant/components/surepetcare/translations/zh-Hant.json new file mode 100644 index 00000000000..ad4530cb30f --- /dev/null +++ b/homeassistant/components/surepetcare/translations/zh-Hant.json @@ -0,0 +1,20 @@ +{ + "config": { + "abort": { + "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "password": "\u5bc6\u78bc", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switch/translations/he.json b/homeassistant/components/switch/translations/he.json index 0b70a69350b..6d41c202beb 100644 --- a/homeassistant/components/switch/translations/he.json +++ b/homeassistant/components/switch/translations/he.json @@ -1,4 +1,19 @@ { + "device_automation": { + "action_type": { + "toggle": "\u05d4\u05d7\u05dc\u05e4\u05ea \u05de\u05e6\u05d1 {entity_name}", + "turn_off": "\u05db\u05d9\u05d1\u05d5\u05d9 {entity_name}", + "turn_on": "\u05d4\u05e4\u05e2\u05dc\u05ea {entity_name}" + }, + "condition_type": { + "is_off": "{entity_name} \u05db\u05d1\u05d5\u05d9", + "is_on": "{entity_name} \u05e4\u05d5\u05e2\u05dc" + }, + "trigger_type": { + "turned_off": "{entity_name} \u05db\u05d5\u05d1\u05d4", + "turned_on": "{entity_name} \u05d4\u05d5\u05e4\u05e2\u05dc" + } + }, "state": { "_": { "off": "\u05db\u05d1\u05d5\u05d9", diff --git a/homeassistant/components/switchbot/translations/ca.json b/homeassistant/components/switchbot/translations/ca.json new file mode 100644 index 00000000000..6409efcbab7 --- /dev/null +++ b/homeassistant/components/switchbot/translations/ca.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "El dispositiu ja est\u00e0 configurat", + "cannot_connect": "Ha fallat la connexi\u00f3", + "no_unconfigured_devices": "No s'han trobat dispositius no configurats.", + "switchbot_unsupported_type": "Tipus de Switchbot no compatible.", + "unknown": "Error inesperat" + }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Adre\u00e7a MAC del dispositiu", + "name": "Nom", + "password": "Contrasenya" + }, + "title": "Configuraci\u00f3 de dispositiu Switchbot" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Nombre de reintents", + "retry_timeout": "Temps d'espera entre reintents", + "scan_timeout": "Quant de temps s'ha d'escanejar en busca de dades d'alerta", + "update_time": "Temps entre actualitzacions (segons)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/cs.json b/homeassistant/components/switchbot/translations/cs.json new file mode 100644 index 00000000000..7a44ab78d3b --- /dev/null +++ b/homeassistant/components/switchbot/translations/cs.json @@ -0,0 +1,14 @@ +{ + "config": { + "abort": { + "already_configured_device": "Za\u0159\u00edzen\u00ed je ji\u017e nastaveno" + }, + "step": { + "user": { + "data": { + "password": "Heslo" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/de.json b/homeassistant/components/switchbot/translations/de.json new file mode 100644 index 00000000000..f499712718e --- /dev/null +++ b/homeassistant/components/switchbot/translations/de.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "Ger\u00e4t ist bereits konfiguriert", + "cannot_connect": "Verbindung fehlgeschlagen", + "no_unconfigured_devices": "Keine unkonfigurierten Ger\u00e4te gefunden.", + "switchbot_unsupported_type": "Nicht unterst\u00fctzter Switchbot-Typ.", + "unknown": "Unerwarteter Fehler" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "MAC-Adresse des Ger\u00e4ts", + "name": "Name", + "password": "Passwort" + }, + "title": "Switchbot-Ger\u00e4t einrichten" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Anzahl der Wiederholungen", + "retry_timeout": "Zeit\u00fcberschreitung zwischen Wiederholungsversuchen", + "scan_timeout": "Wie lange nach Anzeigendaten suchen", + "update_time": "Zeit zwischen Aktualisierungen (Sekunden)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/en.json b/homeassistant/components/switchbot/translations/en.json index 5f2c49e74f5..4ea3d21de65 100644 --- a/homeassistant/components/switchbot/translations/en.json +++ b/homeassistant/components/switchbot/translations/en.json @@ -2,18 +2,19 @@ "config": { "abort": { "already_configured_device": "Device is already configured", - "no_unconfigured_devices": "No unconfigured devices found.", - "unknown": "Unexpected error", "cannot_connect": "Failed to connect", - "switchbot_unsupported_type": "Unsupported Switchbot Type." + "no_unconfigured_devices": "No unconfigured devices found.", + "switchbot_unsupported_type": "Unsupported Switchbot Type.", + "unknown": "Unexpected error" + }, + "error": { + "cannot_connect": "Failed to connect" }, - "error": {}, "flow_title": "{name}", "step": { - "user": { "data": { - "mac": "Mac", + "mac": "Device MAC address", "name": "Name", "password": "Password" }, @@ -25,10 +26,10 @@ "step": { "init": { "data": { - "update_time": "Time between updates (seconds)", "retry_count": "Retry count", "retry_timeout": "Timeout between retries", - "scan_timeout": "How long to scan for advertisement data" + "scan_timeout": "How long to scan for advertisement data", + "update_time": "Time between updates (seconds)" } } } diff --git a/homeassistant/components/switchbot/translations/es.json b/homeassistant/components/switchbot/translations/es.json new file mode 100644 index 00000000000..fe22d91e7f1 --- /dev/null +++ b/homeassistant/components/switchbot/translations/es.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured_device": "El dispositivo ya est\u00e1 configurado", + "switchbot_unsupported_type": "Tipo de Switchbot no compatible.", + "unknown": "Error inesperado" + }, + "error": { + "cannot_connect": "Fall\u00f3 al conectar" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Direcci\u00f3n MAC del dispositivo", + "name": "Nombre", + "password": "Contrase\u00f1a" + }, + "title": "Configurar el dispositivo Switchbot" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Recuento de reintentos", + "retry_timeout": "Tiempo de espera entre reintentos", + "scan_timeout": "Cu\u00e1nto tiempo se debe buscar datos de anuncio", + "update_time": "Tiempo entre actualizaciones (segundos)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/et.json b/homeassistant/components/switchbot/translations/et.json new file mode 100644 index 00000000000..cc746796195 --- /dev/null +++ b/homeassistant/components/switchbot/translations/et.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "Seade on juba h\u00e4\u00e4lestatud", + "cannot_connect": "\u00dchendamine nurjus", + "no_unconfigured_devices": "H\u00e4\u00e4lestamata seadmeid ei leitud.", + "switchbot_unsupported_type": "Toetamata Switchboti t\u00fc\u00fcp.", + "unknown": "Ootamatu t\u00f5rge" + }, + "error": { + "cannot_connect": "\u00dchendamine nurjus" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Seadme MAC-aadress", + "name": "Nimi", + "password": "Salas\u00f5na" + }, + "title": "Switchbot seadme seadistamine" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Korduskatsete arv", + "retry_timeout": "Korduskatsete vaheline aeg", + "scan_timeout": "Kui kaua andmeid otsida", + "update_time": "V\u00e4rskenduste vaheline aeg (sekundites)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/he.json b/homeassistant/components/switchbot/translations/he.json new file mode 100644 index 00000000000..9e4d8129169 --- /dev/null +++ b/homeassistant/components/switchbot/translations/he.json @@ -0,0 +1,33 @@ +{ + "config": { + "abort": { + "already_configured_device": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "name": "\u05e9\u05dd", + "password": "\u05e1\u05d9\u05e1\u05de\u05d4" + }, + "title": "\u05d4\u05ea\u05e7\u05e0\u05ea \u05d1\u05d5\u05e8\u05e8 \u05db\u05d9\u05d5\u05d5\u05e0\u05d5\u05df" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "\u05e1\u05e4\u05d9\u05e8\u05ea \u05e0\u05e1\u05d9\u05d5\u05e0\u05d5\u05ea \u05d7\u05d5\u05d6\u05e8\u05d9\u05dd", + "retry_timeout": "\u05e4\u05e1\u05e7 \u05d6\u05de\u05df \u05d1\u05d9\u05df \u05e0\u05d9\u05e1\u05d9\u05d5\u05e0\u05d5\u05ea \u05d7\u05d5\u05d6\u05e8\u05d9\u05dd", + "scan_timeout": "\u05db\u05de\u05d4 \u05d6\u05de\u05df \u05dc\u05e1\u05e8\u05d5\u05e7 \u05e0\u05ea\u05d5\u05e0\u05d9 \u05e4\u05e8\u05e1\u05d5\u05de\u05ea", + "update_time": "\u05d6\u05de\u05df \u05d1\u05d9\u05df \u05e2\u05d3\u05db\u05d5\u05e0\u05d9\u05dd (\u05e9\u05e0\u05d9\u05d5\u05ea)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/hu.json b/homeassistant/components/switchbot/translations/hu.json new file mode 100644 index 00000000000..5af1acb5d35 --- /dev/null +++ b/homeassistant/components/switchbot/translations/hu.json @@ -0,0 +1,39 @@ +{ + "config": { + "abort": { + "already_configured_device": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", + "cannot_connect": "A csatlakoz\u00e1s sikertelen", + "no_unconfigured_devices": "Nem tal\u00e1lhat\u00f3 konfigur\u00e1latlan eszk\u00f6z.", + "switchbot_unsupported_type": "Nem t\u00e1mogatott Switchbot t\u00edpus.", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" + }, + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s", + "one": "\u00dcres", + "other": "\u00dcres" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Eszk\u00f6z MAC-c\u00edme", + "name": "N\u00e9v", + "password": "Jelsz\u00f3" + }, + "title": "Switchbot eszk\u00f6z be\u00e1ll\u00edt\u00e1sa" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "\u00dajrapr\u00f3b\u00e1lkoz\u00e1sok sz\u00e1ma", + "retry_timeout": "\u00dajrapr\u00f3b\u00e1lkoz\u00e1sok k\u00f6z\u00f6tti id\u0151korl\u00e1t", + "scan_timeout": "Mennyi ideig keresse a hirdet\u00e9si adatokat", + "update_time": "Friss\u00edt\u00e9sek k\u00f6z\u00f6tti id\u0151 (m\u00e1sodperc)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/id.json b/homeassistant/components/switchbot/translations/id.json new file mode 100644 index 00000000000..af61966afa5 --- /dev/null +++ b/homeassistant/components/switchbot/translations/id.json @@ -0,0 +1,35 @@ +{ + "config": { + "abort": { + "already_configured_device": "Perangkat sudah dikonfigurasi", + "switchbot_unsupported_type": "Jenis Switchbot yang tidak didukung.", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "error": { + "cannot_connect": "Gagal terhubung" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Alamat MAC perangkat", + "name": "Nama", + "password": "Kata Sandi" + }, + "title": "Siapkan perangkat Switchbot" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Jumlah percobaan", + "retry_timeout": "Tenggang waktu antara percobaan ulang", + "scan_timeout": "Berapa lama untuk memindai data iklan", + "update_time": "Waktu antara pembaruan (detik)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/it.json b/homeassistant/components/switchbot/translations/it.json new file mode 100644 index 00000000000..fc8296f6442 --- /dev/null +++ b/homeassistant/components/switchbot/translations/it.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "Il dispositivo \u00e8 gi\u00e0 configurato", + "cannot_connect": "Impossibile connettersi", + "no_unconfigured_devices": "Nessun dispositivo non configurato trovato.", + "switchbot_unsupported_type": "Tipo di Switchbot non supportato.", + "unknown": "Errore imprevisto" + }, + "error": { + "cannot_connect": "Impossibile connettersi" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Indirizzo MAC del dispositivo", + "name": "Nome", + "password": "Password" + }, + "title": "Impostare il dispositivo Switchbot" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Conteggio dei tentativi di ripetizione", + "retry_timeout": "Tempo scaduto tra i tentativi", + "scan_timeout": "Per quanto tempo eseguire la scansione dei dati pubblicitari", + "update_time": "Tempo tra gli aggiornamenti (secondi)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/nl.json b/homeassistant/components/switchbot/translations/nl.json new file mode 100644 index 00000000000..fb1e55f6b9d --- /dev/null +++ b/homeassistant/components/switchbot/translations/nl.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "Apparaat is al geconfigureerd", + "cannot_connect": "Kan geen verbinding maken", + "no_unconfigured_devices": "Geen niet-geconfigureerde apparaten gevonden.", + "switchbot_unsupported_type": "Niet-ondersteund Switchbot-type.", + "unknown": "Onverwachte fout" + }, + "error": { + "cannot_connect": "Kan geen verbinding maken" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "MAC-adres apparaat", + "name": "Naam", + "password": "Wachtwoord" + }, + "title": "Switchbot-apparaat instellen" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Aantal herhalingen", + "retry_timeout": "Time-out tussen nieuwe pogingen", + "scan_timeout": "Hoe lang te scannen voor advertentiegegevens", + "update_time": "Tijd tussen updates (seconden)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/no.json b/homeassistant/components/switchbot/translations/no.json new file mode 100644 index 00000000000..4d8cb95061a --- /dev/null +++ b/homeassistant/components/switchbot/translations/no.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "Enheten er allerede konfigurert", + "cannot_connect": "Tilkobling mislyktes", + "no_unconfigured_devices": "Ingen ukonfigurerte enheter ble funnet.", + "switchbot_unsupported_type": "Switchbot-type st\u00f8ttes ikke.", + "unknown": "Uventet feil" + }, + "error": { + "cannot_connect": "Tilkobling mislyktes" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "Enhetens MAC -adresse", + "name": "Navn", + "password": "Passord" + }, + "title": "Sett opp Switchbot-enhet" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "Antall nye fors\u00f8k", + "retry_timeout": "Tidsavbrudd mellom fors\u00f8k", + "scan_timeout": "Hvor lenge skal jeg s\u00f8ke etter annonsedata", + "update_time": "Tid mellom oppdateringer (sekunder)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/ro.json b/homeassistant/components/switchbot/translations/ro.json new file mode 100644 index 00000000000..7668dd5e8e2 --- /dev/null +++ b/homeassistant/components/switchbot/translations/ro.json @@ -0,0 +1,7 @@ +{ + "config": { + "abort": { + "switchbot_unsupported_type": "Tipul Switchbot neacceptat." + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/ru.json b/homeassistant/components/switchbot/translations/ru.json new file mode 100644 index 00000000000..5eaa1cdbc4f --- /dev/null +++ b/homeassistant/components/switchbot/translations/ru.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", + "no_unconfigured_devices": "\u041d\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e.", + "switchbot_unsupported_type": "\u041d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f Switchbot.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f." + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "MAC-\u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c" + }, + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Switchbot" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a", + "retry_timeout": "\u0422\u0430\u0439\u043c-\u0430\u0443\u0442 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u043c\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u043c\u0438", + "scan_timeout": "\u041a\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435", + "update_time": "\u0412\u0440\u0435\u043c\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/zh-Hant.json b/homeassistant/components/switchbot/translations/zh-Hant.json new file mode 100644 index 00000000000..44fe1fe5c54 --- /dev/null +++ b/homeassistant/components/switchbot/translations/zh-Hant.json @@ -0,0 +1,37 @@ +{ + "config": { + "abort": { + "already_configured_device": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "cannot_connect": "\u9023\u7dda\u5931\u6557", + "no_unconfigured_devices": "\u627e\u4e0d\u5230\u4efb\u4f55\u672a\u8a2d\u5b9a\u88dd\u7f6e\u3002", + "switchbot_unsupported_type": "\u4e0d\u652f\u6301\u7684 Switchbot \u985e\u578b\u3002", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557" + }, + "flow_title": "{name}", + "step": { + "user": { + "data": { + "mac": "\u88dd\u7f6e MAC \u4f4d\u5740", + "name": "\u540d\u7a31", + "password": "\u5bc6\u78bc" + }, + "title": "\u8a2d\u5b9a Switchbot \u88dd\u7f6e" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "retry_count": "\u91cd\u8a66\u6b21\u6578", + "retry_timeout": "\u903e\u6642", + "scan_timeout": "\u6383\u63cf\u5ee3\u544a\u6578\u64da\u7684\u6642\u9593", + "update_time": "\u66f4\u65b0\u9593\u9694\u6642\u9593\uff08\u79d2\uff09" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switcher_kis/translations/es.json b/homeassistant/components/switcher_kis/translations/es.json new file mode 100644 index 00000000000..520df7ee4cd --- /dev/null +++ b/homeassistant/components/switcher_kis/translations/es.json @@ -0,0 +1,13 @@ +{ + "config": { + "abort": { + "no_devices_found": "No se encontraron dispositivos en la red", + "single_instance_allowed": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n." + }, + "step": { + "confirm": { + "description": "\u00bfQuieres iniciar la configuraci\u00f3n?" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switcher_kis/translations/hu.json b/homeassistant/components/switcher_kis/translations/hu.json index c3be866fb85..20237758f11 100644 --- a/homeassistant/components/switcher_kis/translations/hu.json +++ b/homeassistant/components/switcher_kis/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "El akarja kezdeni a be\u00e1ll\u00edt\u00e1sokat?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1sokat?" } } } diff --git a/homeassistant/components/switcher_kis/translations/id.json b/homeassistant/components/switcher_kis/translations/id.json new file mode 100644 index 00000000000..223836a8b40 --- /dev/null +++ b/homeassistant/components/switcher_kis/translations/id.json @@ -0,0 +1,13 @@ +{ + "config": { + "abort": { + "no_devices_found": "Tidak ada perangkat yang ditemukan di jaringan", + "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." + }, + "step": { + "confirm": { + "description": "Ingin memulai penyiapan?" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switcher_kis/translations/nl.json b/homeassistant/components/switcher_kis/translations/nl.json index d11896014fd..0671f0b3674 100644 --- a/homeassistant/components/switcher_kis/translations/nl.json +++ b/homeassistant/components/switcher_kis/translations/nl.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } } diff --git a/homeassistant/components/syncthru/translations/id.json b/homeassistant/components/syncthru/translations/id.json index 54d5e6f5c96..5a79e74a771 100644 --- a/homeassistant/components/syncthru/translations/id.json +++ b/homeassistant/components/syncthru/translations/id.json @@ -8,7 +8,7 @@ "syncthru_not_supported": "Perangkat tidak mendukung SyncThru", "unknown_state": "Status printer tidak diketahui, verifikasi URL dan konektivitas jaringan" }, - "flow_title": "Printer Samsung SyncThru: {name}", + "flow_title": "{name}", "step": { "confirm": { "data": { diff --git a/homeassistant/components/synology_dsm/translations/es.json b/homeassistant/components/synology_dsm/translations/es.json index 571dced9bc7..e143a636fb0 100644 --- a/homeassistant/components/synology_dsm/translations/es.json +++ b/homeassistant/components/synology_dsm/translations/es.json @@ -1,7 +1,9 @@ { "config": { "abort": { - "already_configured": "El host ya est\u00e1 configurado." + "already_configured": "El host ya est\u00e1 configurado.", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente", + "reconfigure_successful": "La reconfiguraci\u00f3n se realiz\u00f3 correctamente" }, "error": { "cannot_connect": "No se pudo conectar", @@ -31,10 +33,18 @@ }, "reauth": { "data": { - "password": "Contrase\u00f1a" + "password": "Contrase\u00f1a", + "username": "Usuario" }, "description": "Raz\u00f3n: {details}", - "title": "Synology DSM Volver a autenticar la integraci\u00f3n" + "title": "Volver a autenticar la integraci\u00f3n Synology DSM" + }, + "reauth_confirm": { + "data": { + "password": "Contrase\u00f1a", + "username": "Usuario" + }, + "title": "Volver a autenticar la integraci\u00f3n Synology DSM" }, "user": { "data": { diff --git a/homeassistant/components/synology_dsm/translations/hu.json b/homeassistant/components/synology_dsm/translations/hu.json index 56a5ebb994f..f3f3d4ead4c 100644 --- a/homeassistant/components/synology_dsm/translations/hu.json +++ b/homeassistant/components/synology_dsm/translations/hu.json @@ -28,7 +28,7 @@ "username": "Felhaszn\u00e1l\u00f3n\u00e9v", "verify_ssl": "SSL-tan\u00fas\u00edtv\u00e1ny ellen\u0151rz\u00e9se" }, - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a {name}({host})-t?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name} ({host})?", "title": "Synology DSM" }, "reauth": { @@ -39,9 +39,16 @@ "description": "Indokl\u00e1s: {details}", "title": "Synology DSM Integr\u00e1ci\u00f3 \u00fajrahiteles\u00edt\u00e9se" }, + "reauth_confirm": { + "data": { + "password": "Jelsz\u00f3", + "username": "Felhaszn\u00e1l\u00f3n\u00e9v" + }, + "title": "Synology DSM Integr\u00e1ci\u00f3 \u00fajrahiteles\u00edt\u00e9se" + }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", "ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata", diff --git a/homeassistant/components/synology_dsm/translations/id.json b/homeassistant/components/synology_dsm/translations/id.json index e614c2578d4..ca322fc518e 100644 --- a/homeassistant/components/synology_dsm/translations/id.json +++ b/homeassistant/components/synology_dsm/translations/id.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "already_configured": "Perangkat sudah dikonfigurasi" + "already_configured": "Perangkat sudah dikonfigurasi", + "reauth_successful": "Autentikasi ulang berhasil" }, "error": { "cannot_connect": "Gagal terhubung", @@ -10,7 +11,7 @@ "otp_failed": "Autentikasi dua langkah gagal, coba lagi dengan kode sandi baru", "unknown": "Kesalahan yang tidak diharapkan" }, - "flow_title": "Synology DSM {name} ({host})", + "flow_title": "{name} ({host})", "step": { "2sa": { "data": { @@ -29,6 +30,18 @@ "description": "Ingin menyiapkan {name} ({host})?", "title": "Synology DSM" }, + "reauth": { + "data": { + "username": "Nama Pengguna" + }, + "title": "Autentikasi Ulang Integrasi Synology DSM" + }, + "reauth_confirm": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/synology_dsm/translations/it.json b/homeassistant/components/synology_dsm/translations/it.json index a9ea23bf08a..41c535f714f 100644 --- a/homeassistant/components/synology_dsm/translations/it.json +++ b/homeassistant/components/synology_dsm/translations/it.json @@ -39,6 +39,13 @@ "description": "Motivo: {details}", "title": "Synology DSM Autenticare nuovamente l'integrazione" }, + "reauth_confirm": { + "data": { + "password": "Password", + "username": "Nome utente" + }, + "title": "Autenticare nuovamente l'integrazione Synology DSM " + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/synology_dsm/translations/nl.json b/homeassistant/components/synology_dsm/translations/nl.json index d33ed48ce10..8740308faf0 100644 --- a/homeassistant/components/synology_dsm/translations/nl.json +++ b/homeassistant/components/synology_dsm/translations/nl.json @@ -39,6 +39,13 @@ "description": "Reden: {details}", "title": "Synology DSM Verifieer de integratie opnieuw" }, + "reauth_confirm": { + "data": { + "password": "Wachtwoord", + "username": "Gebruikersnaam" + }, + "title": "Synology DSM Integratie opnieuw verifi\u00ebren" + }, "user": { "data": { "host": "Host", diff --git a/homeassistant/components/system_bridge/translations/hu.json b/homeassistant/components/system_bridge/translations/hu.json index 50643ca5e95..31082202419 100644 --- a/homeassistant/components/system_bridge/translations/hu.json +++ b/homeassistant/components/system_bridge/translations/hu.json @@ -21,7 +21,7 @@ "user": { "data": { "api_key": "API kulcs", - "host": "Gazdag\u00e9p", + "host": "C\u00edm", "port": "Port" }, "description": "K\u00e9rj\u00fck, adja meg kapcsolati adatait." diff --git a/homeassistant/components/tasmota/translations/hu.json b/homeassistant/components/tasmota/translations/hu.json index 72a26925bc9..3a6c32dbb42 100644 --- a/homeassistant/components/tasmota/translations/hu.json +++ b/homeassistant/components/tasmota/translations/hu.json @@ -11,11 +11,11 @@ "data": { "discovery_prefix": "Felder\u00edt\u00e9si t\u00e9ma el\u0151tagja" }, - "description": "Add meg a Tasmota konfigur\u00e1ci\u00f3t.", + "description": "Adja meg a Tasmota konfigur\u00e1ci\u00f3t.", "title": "Tasmota" }, "confirm": { - "description": "Be szeretn\u00e9d \u00e1ll\u00edtani a Tasmota-t?" + "description": "Szeretn\u00e9 b\u00e1ll\u00edtani a Tasmota-t?" } } } diff --git a/homeassistant/components/tellduslive/translations/he.json b/homeassistant/components/tellduslive/translations/he.json index d19fa6d3d31..6a1c8a23c65 100644 --- a/homeassistant/components/tellduslive/translations/he.json +++ b/homeassistant/components/tellduslive/translations/he.json @@ -3,7 +3,8 @@ "abort": { "already_configured": "\u05e9\u05d9\u05e8\u05d5\u05ea \u05d6\u05d4 \u05db\u05d1\u05e8 \u05de\u05d5\u05d2\u05d3\u05e8", "authorize_url_timeout": "\u05e4\u05e1\u05e7 \u05d6\u05de\u05df \u05dc\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05dc\u05d0\u05d9\u05e9\u05d5\u05e8.", - "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4", + "unknown_authorize_url_generation": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2\u05d4 \u05d1\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05d4\u05e8\u05e9\u05d0\u05d4." }, "error": { "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9" diff --git a/homeassistant/components/tellduslive/translations/hu.json b/homeassistant/components/tellduslive/translations/hu.json index 207e9ada090..a07259b67f9 100644 --- a/homeassistant/components/tellduslive/translations/hu.json +++ b/homeassistant/components/tellduslive/translations/hu.json @@ -11,15 +11,15 @@ }, "step": { "auth": { - "description": "A TelldusLive-fi\u00f3k \u00f6sszekapcsol\u00e1sa:\n 1. Kattintson az al\u00e1bbi linkre\n 2. Jelentkezzen be a Telldus Live szolg\u00e1ltat\u00e1sba\n 3. Enged\u00e9lyezze ** {app_name} ** (kattintson a ** Yes ** gombra).\n 4. J\u00f6jj\u00f6n vissza ide, \u00e9s kattintson a ** SUBMIT ** gombra. \n\n [Link TelldusLive-fi\u00f3k] ( {auth_url} )", + "description": "A TelldusLive-fi\u00f3k \u00f6sszekapcsol\u00e1sa:\n 1. Kattintson az al\u00e1bbi linkre\n 2. Jelentkezzen be a Telldus Live szolg\u00e1ltat\u00e1sba\n 3. Enged\u00e9lyezzeie kell **{app_name}** (kattintson a ** Yes ** gombra).\n 4. J\u00f6jj\u00f6n vissza ide, \u00e9s kattintson a ** K\u00fcld\u00e9s ** gombra. \n\n [Link TelldusLive-fi\u00f3k]({auth_url})", "title": "Hiteles\u00edtsen a TelldusLive-on" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "\u00dcres", - "title": "V\u00e1lassz v\u00e9gpontot." + "title": "V\u00e1lasszon v\u00e9gpontot." } } } diff --git a/homeassistant/components/tibber/translations/hu.json b/homeassistant/components/tibber/translations/hu.json index 6ad59022845..1ff558b7280 100644 --- a/homeassistant/components/tibber/translations/hu.json +++ b/homeassistant/components/tibber/translations/hu.json @@ -13,7 +13,7 @@ "data": { "access_token": "Hozz\u00e1f\u00e9r\u00e9si token" }, - "description": "Add meg a hozz\u00e1f\u00e9r\u00e9si tokent a https://developer.tibber.com/settings/accesstoken c\u00edmr\u0151l", + "description": "Adja meg a hozz\u00e1f\u00e9r\u00e9si tokent a https://developer.tibber.com/settings/accesstoken c\u00edmr\u0151l", "title": "Tibber" } } diff --git a/homeassistant/components/tile/translations/ca.json b/homeassistant/components/tile/translations/ca.json index 60c31b8dce6..1d70a94f7af 100644 --- a/homeassistant/components/tile/translations/ca.json +++ b/homeassistant/components/tile/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida" diff --git a/homeassistant/components/toon/translations/he.json b/homeassistant/components/toon/translations/he.json index 431a7b32509..c4269a46b1c 100644 --- a/homeassistant/components/toon/translations/he.json +++ b/homeassistant/components/toon/translations/he.json @@ -3,7 +3,8 @@ "abort": { "authorize_url_timeout": "\u05e4\u05e1\u05e7 \u05d6\u05de\u05df \u05dc\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05dc\u05d0\u05d9\u05e9\u05d5\u05e8.", "missing_configuration": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05e8\u05db\u05d9\u05d1 \u05dc\u05d0 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e0\u05d0 \u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8 \u05d4\u05ea\u05d9\u05e2\u05d5\u05d3.", - "no_url_available": "\u05d0\u05d9\u05df \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05ea\u05e8 \u05d6\u05de\u05d9\u05e0\u05d4. \u05e7\u05d1\u05dc\u05ea \u05de\u05d9\u05d3\u05e2 \u05e2\u05dc \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d6\u05d5, [\u05e2\u05d9\u05d9\u05df \u05d1\u05e1\u05e2\u05d9\u05e3 \u05d4\u05e2\u05d6\u05e8\u05d4] ({docs_url})" + "no_url_available": "\u05d0\u05d9\u05df \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05ea\u05e8 \u05d6\u05de\u05d9\u05e0\u05d4. \u05e7\u05d1\u05dc\u05ea \u05de\u05d9\u05d3\u05e2 \u05e2\u05dc \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d6\u05d5, [\u05e2\u05d9\u05d9\u05df \u05d1\u05e1\u05e2\u05d9\u05e3 \u05d4\u05e2\u05d6\u05e8\u05d4] ({docs_url})", + "unknown_authorize_url_generation": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2\u05d4 \u05d1\u05d9\u05e6\u05d9\u05e8\u05ea \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05d4\u05e8\u05e9\u05d0\u05d4." } } } \ No newline at end of file diff --git a/homeassistant/components/toon/translations/hu.json b/homeassistant/components/toon/translations/hu.json index 18f333dccdf..b1a69144dd5 100644 --- a/homeassistant/components/toon/translations/hu.json +++ b/homeassistant/components/toon/translations/hu.json @@ -3,7 +3,7 @@ "abort": { "already_configured": "A kiv\u00e1lasztott meg\u00e1llapod\u00e1s m\u00e1r konfigur\u00e1lva van.", "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_agreements": "Ennek a fi\u00f3knak nincsenek Toon kijelz\u0151i.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.", "unknown_authorize_url_generation": "Ismeretlen hiba t\u00f6rt\u00e9nt a hiteles\u00edt\u00e9si link gener\u00e1l\u00e1sa sor\u00e1n." @@ -17,7 +17,7 @@ "title": "V\u00e1lassza ki a meg\u00e1llapod\u00e1st" }, "pick_implementation": { - "title": "V\u00e1lassza ki a hiteles\u00edt\u00e9shez" + "title": "V\u00e1lassza ki a b\u00e9rl\u0151t a hiteles\u00edt\u00e9shez" } } } diff --git a/homeassistant/components/totalconnect/translations/ca.json b/homeassistant/components/totalconnect/translations/ca.json index cbe1d4e449c..fa42c81e1be 100644 --- a/homeassistant/components/totalconnect/translations/ca.json +++ b/homeassistant/components/totalconnect/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/totalconnect/translations/es.json b/homeassistant/components/totalconnect/translations/es.json index c4923884c43..63d61445ef5 100644 --- a/homeassistant/components/totalconnect/translations/es.json +++ b/homeassistant/components/totalconnect/translations/es.json @@ -14,7 +14,7 @@ "location": "Localizaci\u00f3n", "usercode": "Codigo de usuario" }, - "description": "Ingrese el c\u00f3digo de usuario para este usuario en esta ubicaci\u00f3n", + "description": "Introduce el c\u00f3digo de usuario para este usuario en la ubicaci\u00f3n {location_id}", "title": "C\u00f3digos de usuario de ubicaci\u00f3n" }, "reauth_confirm": { diff --git a/homeassistant/components/totalconnect/translations/hu.json b/homeassistant/components/totalconnect/translations/hu.json index 319611fd2b1..9b55278e9a8 100644 --- a/homeassistant/components/totalconnect/translations/hu.json +++ b/homeassistant/components/totalconnect/translations/hu.json @@ -14,7 +14,7 @@ "location": "Elhelyezked\u00e9s", "usercode": "Felhaszn\u00e1l\u00f3i k\u00f3d" }, - "description": "Adja meg ennek a felhaszn\u00e1l\u00f3nak a felhaszn\u00e1l\u00f3i k\u00f3dj\u00e1t a k\u00f6vetkez\u0151 helyen: {location_id}", + "description": "Adja meg ennek a felhaszn\u00e1l\u00f3i k\u00f3dj\u00e1t a k\u00f6vetkez\u0151 helyen: {location_id}", "title": "Helyhaszn\u00e1lati k\u00f3dok" }, "reauth_confirm": { diff --git a/homeassistant/components/totalconnect/translations/id.json b/homeassistant/components/totalconnect/translations/id.json index c1bdf664994..b1bc5573021 100644 --- a/homeassistant/components/totalconnect/translations/id.json +++ b/homeassistant/components/totalconnect/translations/id.json @@ -13,7 +13,7 @@ "data": { "location": "Lokasi" }, - "description": "Masukkan kode pengguna untuk pengguna ini di lokasi ini", + "description": "Masukkan kode pengguna untuk pengguna ini di lokasi {location_id}", "title": "Lokasi Kode Pengguna" }, "reauth_confirm": { diff --git a/homeassistant/components/tplink/translations/ca.json b/homeassistant/components/tplink/translations/ca.json index 69dfc1b4b9d..4dfb749a9d7 100644 --- a/homeassistant/components/tplink/translations/ca.json +++ b/homeassistant/components/tplink/translations/ca.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat", "no_devices_found": "No s'han trobat dispositius a la xarxa", "single_instance_allowed": "Ja configurat. Nom\u00e9s \u00e9s possible una sola configuraci\u00f3." }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3" + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { "description": "Vols configurar dispositius intel\u00b7ligents TP-Link?" + }, + "discovery_confirm": { + "description": "Vols configurar {name} {model} ({host})?" + }, + "pick_device": { + "data": { + "device": "Dispositiu" + } + }, + "user": { + "data": { + "host": "Amfitri\u00f3" + }, + "description": "Si deixes l'amfitri\u00f3 buit, s'utilitzar\u00e0 el descobriment per cercar dispositius." } } } diff --git a/homeassistant/components/tplink/translations/de.json b/homeassistant/components/tplink/translations/de.json index 6f804a6eeef..4d6a07b881e 100644 --- a/homeassistant/components/tplink/translations/de.json +++ b/homeassistant/components/tplink/translations/de.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert", "no_devices_found": "Keine Ger\u00e4te im Netzwerk gefunden", "single_instance_allowed": "Bereits konfiguriert. Nur eine einzige Konfiguration m\u00f6glich." }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen" + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { "description": "M\u00f6chtest du TP-Link Smart Devices einrichten?" + }, + "discovery_confirm": { + "description": "M\u00f6chtest du {name} {model} ({host}) einrichten?" + }, + "pick_device": { + "data": { + "device": "Ger\u00e4t" + } + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Wenn du den Host leer l\u00e4sst, wird die Erkennung verwendet, um Ger\u00e4te zu finden." } } } diff --git a/homeassistant/components/tplink/translations/en.json b/homeassistant/components/tplink/translations/en.json index 0697974e708..da4681145d8 100644 --- a/homeassistant/components/tplink/translations/en.json +++ b/homeassistant/components/tplink/translations/en.json @@ -2,13 +2,17 @@ "config": { "abort": { "already_configured": "Device is already configured", - "no_devices_found": "No devices found on the network" + "no_devices_found": "No devices found on the network", + "single_instance_allowed": "Already configured. Only a single configuration possible." }, "error": { "cannot_connect": "Failed to connect" }, "flow_title": "{name} {model} ({host})", "step": { + "confirm": { + "description": "Do you want to setup TP-Link smart devices?" + }, "discovery_confirm": { "description": "Do you want to setup {name} {model} ({host})?" }, diff --git a/homeassistant/components/tplink/translations/et.json b/homeassistant/components/tplink/translations/et.json index 972e581fc61..12c4f3d6f84 100644 --- a/homeassistant/components/tplink/translations/et.json +++ b/homeassistant/components/tplink/translations/et.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud", "no_devices_found": "V\u00f5rgust ei leitud seadmeid", "single_instance_allowed": "Juba seadistatud. V\u00f5imalik on ainult \u00fcks seadistamine." }, + "error": { + "cannot_connect": "\u00dchendamine nurjus" + }, + "flow_title": "{name} {model} ( {host} )", "step": { "confirm": { "description": "Kas soovid seadistada TP-Linki nutiseadmeid?" + }, + "discovery_confirm": { + "description": "Kas seadistada {name}{model} ({host})?" + }, + "pick_device": { + "data": { + "device": "Seade" + } + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Kui j\u00e4tad hosti t\u00fchjaks kasutatakse seadmete leidmiseks avastamist." } } } diff --git a/homeassistant/components/tplink/translations/hu.json b/homeassistant/components/tplink/translations/hu.json index bcfb467538d..c00744d0dcf 100644 --- a/homeassistant/components/tplink/translations/hu.json +++ b/homeassistant/components/tplink/translations/hu.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r be van konfigur\u00e1lva", "no_devices_found": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a h\u00e1l\u00f3zaton", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, + "error": { + "cannot_connect": "A csatlakoz\u00e1s sikertelen" + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a TP-Link intelligens eszk\u00f6z\u00f6ket?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a TP-Link intelligens eszk\u00f6zeit?" + }, + "discovery_confirm": { + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name} {model} ({host})?" + }, + "pick_device": { + "data": { + "device": "Eszk\u00f6z" + } + }, + "user": { + "data": { + "host": "C\u00edm" + }, + "description": "Ha nem ad meg c\u00edmet, akkor az eszk\u00f6z\u00f6k keres\u00e9se a felder\u00edt\u00e9ssel t\u00f6rt\u00e9nik." } } } diff --git a/homeassistant/components/tplink/translations/it.json b/homeassistant/components/tplink/translations/it.json index 8940b1c8ee6..3fd30d8d12c 100644 --- a/homeassistant/components/tplink/translations/it.json +++ b/homeassistant/components/tplink/translations/it.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", "no_devices_found": "Nessun dispositivo trovato sulla rete", "single_instance_allowed": "Gi\u00e0 configurato. \u00c8 possibile una sola configurazione." }, + "error": { + "cannot_connect": "Impossibile connettersi" + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { "description": "Vuoi configurare i dispositivi intelligenti TP-Link?" + }, + "discovery_confirm": { + "description": "Vuoi configurare {name} {model} ({host})?" + }, + "pick_device": { + "data": { + "device": "Dispositivo" + } + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Se si lascia vuoto l'host, l'individuazione verr\u00e0 utilizzata per trovare i dispositivi." } } } diff --git a/homeassistant/components/tplink/translations/nl.json b/homeassistant/components/tplink/translations/nl.json index 362645d9f19..f6cf6a21e72 100644 --- a/homeassistant/components/tplink/translations/nl.json +++ b/homeassistant/components/tplink/translations/nl.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "Apparaat is al geconfigureerd", "no_devices_found": "Geen apparaten gevonden op het netwerk", "single_instance_allowed": "Al geconfigureerd. Slechts een enkele configuratie mogelijk." }, + "error": { + "cannot_connect": "Kon geen verbinding maken" + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { "description": "Wil je TP-Link slimme apparaten instellen?" + }, + "discovery_confirm": { + "description": "Wilt u {name} {model} ({host}) instellen?" + }, + "pick_device": { + "data": { + "device": "Apparaat" + } + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Als u de host leeg laat, wordt detectie gebruikt om apparaten te vinden." } } } diff --git a/homeassistant/components/tplink/translations/no.json b/homeassistant/components/tplink/translations/no.json index 1d1d624ab40..6c7bd7dcbf4 100644 --- a/homeassistant/components/tplink/translations/no.json +++ b/homeassistant/components/tplink/translations/no.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "Enheten er allerede konfigurert", "no_devices_found": "Ingen enheter funnet p\u00e5 nettverket", "single_instance_allowed": "Allerede konfigurert. Bare \u00e9n enkelt konfigurasjon er mulig." }, + "error": { + "cannot_connect": "Tilkobling mislyktes" + }, + "flow_title": "{name} {model} ( {host} )", "step": { "confirm": { "description": "Vil du konfigurere TP-Link smart enheter?" + }, + "discovery_confirm": { + "description": "Vil du konfigurere {name} {model} ( {host} )?" + }, + "pick_device": { + "data": { + "device": "Enhet" + } + }, + "user": { + "data": { + "host": "Vert" + }, + "description": "Hvis du lar verten st\u00e5 tom, brukes automatisk oppdagelse til \u00e5 finne enheter" } } } diff --git a/homeassistant/components/tplink/translations/ru.json b/homeassistant/components/tplink/translations/ru.json index 4df755bee4f..47f1459e572 100644 --- a/homeassistant/components/tplink/translations/ru.json +++ b/homeassistant/components/tplink/translations/ru.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", "no_devices_found": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432 \u0441\u0435\u0442\u0438.", "single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e." }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f." + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { "description": "\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c TP-Link Smart Home?" + }, + "discovery_confirm": { + "description": "\u0425\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c {name} {model} ({host})?" + }, + "pick_device": { + "data": { + "device": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e" + } + }, + "user": { + "data": { + "host": "\u0425\u043e\u0441\u0442" + }, + "description": "\u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0445\u043e\u0441\u0442\u0430, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438." } } } diff --git a/homeassistant/components/tplink/translations/zh-Hant.json b/homeassistant/components/tplink/translations/zh-Hant.json index 2fac2ac142d..153783b1b90 100644 --- a/homeassistant/components/tplink/translations/zh-Hant.json +++ b/homeassistant/components/tplink/translations/zh-Hant.json @@ -1,12 +1,31 @@ { "config": { "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", "no_devices_found": "\u7db2\u8def\u4e0a\u627e\u4e0d\u5230\u88dd\u7f6e", "single_instance_allowed": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002" }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557" + }, + "flow_title": "{name} {model} ({host})", "step": { "confirm": { "description": "\u662f\u5426\u8981\u8a2d\u5b9a TP-Link \u667a\u80fd\u88dd\u7f6e\uff1f" + }, + "discovery_confirm": { + "description": "\u662f\u5426\u8981\u8a2d\u5b9a {name} {model} ({host})\uff1f" + }, + "pick_device": { + "data": { + "device": "\u88dd\u7f6e" + } + }, + "user": { + "data": { + "host": "\u4e3b\u6a5f\u7aef" + }, + "description": "\u5047\u5982\u4e3b\u6a5f\u7aef\u4f4d\u5740\u6b04\u4f4d\u70ba\u7a7a\u767d\uff0c\u5c07\u6703\u63a2\u7d22\u6240\u6709\u53ef\u7528\u88dd\u7f6e\u3002" } } } diff --git a/homeassistant/components/traccar/translations/hu.json b/homeassistant/components/traccar/translations/hu.json index 94fc9198921..902b4ea5231 100644 --- a/homeassistant/components/traccar/translations/hu.json +++ b/homeassistant/components/traccar/translations/hu.json @@ -2,10 +2,10 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { - "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a webhook funkci\u00f3t a Traccar-ban. \n\n Haszn\u00e1lja a k\u00f6vetkez\u0151 URL-t: `{webhook_url}`\n\n Tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1sd a [dokument\u00e1ci\u00f3t]({docs_url})." + "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a webhook funkci\u00f3t a Traccar-ban. \n\nHaszn\u00e1lja a k\u00f6vetkez\u0151 URL-t: `{webhook_url}`\n\nTov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1ssa a [dokument\u00e1ci\u00f3t]({docs_url})." }, "step": { "user": { diff --git a/homeassistant/components/tractive/translations/es.json b/homeassistant/components/tractive/translations/es.json index 11aa4f1aa9c..9b252a0b2f0 100644 --- a/homeassistant/components/tractive/translations/es.json +++ b/homeassistant/components/tractive/translations/es.json @@ -1,17 +1,18 @@ { "config": { "abort": { - "already_configured": "El sistema ya est\u00e1 configurado" + "already_configured": "El dispositivo ya est\u00e1 configurado", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" }, "error": { - "invalid_auth": "Autenticaci\u00f3n err\u00f3nea", - "unknown": "Error desconocido" + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado" }, "step": { "user": { "data": { - "email": "Correo-e", - "password": "Clave" + "email": "Correo electr\u00f3nico", + "password": "Contrase\u00f1a" } } } diff --git a/homeassistant/components/tradfri/translations/fi.json b/homeassistant/components/tradfri/translations/fi.json index 31984784ee6..4946d88778f 100644 --- a/homeassistant/components/tradfri/translations/fi.json +++ b/homeassistant/components/tradfri/translations/fi.json @@ -3,6 +3,9 @@ "abort": { "already_configured": "Silta on jo m\u00e4\u00e4ritetty" }, + "error": { + "cannot_connect": "Yhdist\u00e4minen ep\u00e4onnistui" + }, "step": { "auth": { "data": { diff --git a/homeassistant/components/tradfri/translations/hu.json b/homeassistant/components/tradfri/translations/hu.json index 3bc4ec90e77..e5f749a83df 100644 --- a/homeassistant/components/tradfri/translations/hu.json +++ b/homeassistant/components/tradfri/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van." + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van." }, "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", @@ -12,11 +12,11 @@ "step": { "auth": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "security_code": "Biztons\u00e1gi K\u00f3d" }, "description": "A biztons\u00e1gi k\u00f3dot a Gatewayed h\u00e1toldal\u00e1n tal\u00e1lod.", - "title": "Add meg a biztons\u00e1gi k\u00f3dot" + "title": "Adja meg a biztons\u00e1gi k\u00f3dot" } } } diff --git a/homeassistant/components/transmission/translations/hu.json b/homeassistant/components/transmission/translations/hu.json index 5c968b21ed7..5e3dcfd2b6c 100644 --- a/homeassistant/components/transmission/translations/hu.json +++ b/homeassistant/components/transmission/translations/hu.json @@ -6,12 +6,12 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s", "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", - "name_exists": "A n\u00e9v m\u00e1r l\u00e9tezik" + "name_exists": "A n\u00e9v m\u00e1r foglalt" }, "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v", "password": "Jelsz\u00f3", "port": "Port", diff --git a/homeassistant/components/tuya/translations/af.json b/homeassistant/components/tuya/translations/af.json new file mode 100644 index 00000000000..71ac741b6b8 --- /dev/null +++ b/homeassistant/components/tuya/translations/af.json @@ -0,0 +1,8 @@ +{ + "options": { + "error": { + "dev_not_config": "Ger\u00e4tetyp nicht konfigurierbar", + "dev_not_found": "Ger\u00e4t nicht gefunden" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/ca.json b/homeassistant/components/tuya/translations/ca.json new file mode 100644 index 00000000000..6759d322484 --- /dev/null +++ b/homeassistant/components/tuya/translations/ca.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "Ha fallat la connexi\u00f3", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "single_instance_allowed": "Ja configurat. Nom\u00e9s \u00e9s possible una sola configuraci\u00f3." + }, + "error": { + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida" + }, + "flow_title": "Configuraci\u00f3 de Tuya", + "step": { + "login": { + "data": { + "access_id": "ID d'acc\u00e9s", + "access_secret": "Secret d'acc\u00e9s", + "country_code": "Codi de pa\u00eds", + "endpoint": "Zona de disponibilitat", + "password": "Contrasenya", + "tuya_app_type": "Aplicaci\u00f3 per a m\u00f2bil", + "username": "Compte" + }, + "description": "Introdueix la credencial de Tuya", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "El teu codi de pa\u00eds (per exemple, 1 per l'EUA o 86 per la Xina)", + "password": "Contrasenya", + "platform": "L'aplicaci\u00f3 on es registra el teu compte", + "tuya_project_type": "Tipus de projecte al n\u00favol de Tuya", + "username": "Nom d'usuari" + }, + "description": "Introdueix les teves credencial de Tuya.", + "title": "Integraci\u00f3 Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Ha fallat la connexi\u00f3" + }, + "error": { + "dev_multi_type": "Per configurar una selecci\u00f3 de m\u00faltiples dispositius, aquests han de ser del mateix tipus", + "dev_not_config": "El tipus d'aquest dispositiu no \u00e9s configurable", + "dev_not_found": "No s'ha trobat el dispositiu." + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Rang de brillantor utilitzat pel dispositiu", + "curr_temp_divider": "Divisor del valor de temperatura actual (0 = predeterminat)", + "max_kelvin": "Temperatura del color m\u00e0xima suportada, en Kelvin", + "max_temp": "Temperatura desitjada m\u00e0xima (utilitza min i max = 0 per defecte)", + "min_kelvin": "Temperatura del color m\u00ednima suportada, en Kelvin", + "min_temp": "Temperatura desitjada m\u00ednima (utilitza min i max = 0 per defecte)", + "set_temp_divided": "Utilitza el valor de temperatura dividit per a ordres de configuraci\u00f3 de temperatura", + "support_color": "For\u00e7a el suport de color", + "temp_divider": "Divisor del valor de temperatura (0 = predeterminat)", + "temp_step_override": "Pas de temperatura objectiu", + "tuya_max_coltemp": "Temperatura de color m\u00e0xima enviada pel dispositiu", + "unit_of_measurement": "Unitat de temperatura utilitzada pel dispositiu" + }, + "description": "Configura les opcions per ajustar la informaci\u00f3 mostrada pel dispositiu {device_type} `{device_name}`", + "title": "Configuraci\u00f3 de dispositiu Tuya" + }, + "init": { + "data": { + "discovery_interval": "Interval de sondeig del dispositiu de descoberta, en segons", + "list_devices": "Selecciona els dispositius a configurar o deixa-ho buit per desar la configuraci\u00f3", + "query_device": "Selecciona el dispositiu que utilitzar\u00e0 m\u00e8tode de consulta, per actualitzacions d'estat m\u00e9s freq\u00fcents", + "query_interval": "Interval de sondeig de consultes del dispositiu, en segons" + }, + "description": "No estableixis valors d'interval de sondeig massa baixos ja que les crides fallaran i generaran missatges d'error al registre", + "title": "Configuraci\u00f3 d'opcions de Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/cs.json b/homeassistant/components/tuya/translations/cs.json new file mode 100644 index 00000000000..1dda4ea6df7 --- /dev/null +++ b/homeassistant/components/tuya/translations/cs.json @@ -0,0 +1,60 @@ +{ + "config": { + "abort": { + "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit", + "invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed", + "single_instance_allowed": "Ji\u017e nastaveno. Je mo\u017en\u00e1 pouze jedin\u00e1 konfigurace." + }, + "error": { + "invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed" + }, + "flow_title": "Konfigurace Tuya", + "step": { + "user": { + "data": { + "country_code": "K\u00f3d zem\u011b va\u0161eho \u00fa\u010dtu (nap\u0159. 1 pro USA nebo 86 pro \u010c\u00ednu)", + "password": "Heslo", + "platform": "Aplikace, ve kter\u00e9 m\u00e1te zaregistrovan\u00fd \u00fa\u010det", + "username": "U\u017eivatelsk\u00e9 jm\u00e9no" + }, + "description": "Zadejte sv\u00e9 p\u0159ihla\u0161ovac\u00ed \u00fadaje k Tuya.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit" + }, + "error": { + "dev_multi_type": "V\u00edce vybran\u00fdch za\u0159\u00edzen\u00ed k nastaven\u00ed mus\u00ed b\u00fdt stejn\u00e9ho typu", + "dev_not_config": "Typ za\u0159\u00edzen\u00ed nelze nastavit", + "dev_not_found": "Za\u0159\u00edzen\u00ed nenalezeno" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Rozsah jasu pou\u017e\u00edvan\u00fd za\u0159\u00edzen\u00edm", + "max_kelvin": "Maxim\u00e1ln\u00ed podporovan\u00e1 teplota barev v kelvinech", + "max_temp": "Maxim\u00e1ln\u00ed c\u00edlov\u00e1 teplota (pou\u017eijte min a max = 0 jako v\u00fdchoz\u00ed)", + "min_kelvin": "Maxim\u00e1ln\u00ed podporovan\u00e1 teplota barev v kelvinech", + "min_temp": "Minim\u00e1ln\u00ed c\u00edlov\u00e1 teplota (pou\u017eijte min a max = 0 jako v\u00fdchoz\u00ed)", + "support_color": "Vynutit podporu barev", + "tuya_max_coltemp": "Maxim\u00e1ln\u00ed teplota barev nahl\u00e1\u0161en\u00e1 za\u0159\u00edzen\u00edm", + "unit_of_measurement": "Jednotka teploty pou\u017e\u00edvan\u00e1 za\u0159\u00edzen\u00edm" + }, + "title": "Nastavte za\u0159\u00edzen\u00ed Tuya" + }, + "init": { + "data": { + "discovery_interval": "Interval objevov\u00e1n\u00ed za\u0159\u00edzen\u00ed v sekund\u00e1ch", + "list_devices": "Vyberte za\u0159\u00edzen\u00ed, kter\u00e1 chcete nastavit, nebo ponechte pr\u00e1zdn\u00e9, abyste konfiguraci ulo\u017eili", + "query_device": "Vyberte za\u0159\u00edzen\u00ed, kter\u00e9 bude pou\u017e\u00edvat metodu dotaz\u016f pro rychlej\u0161\u00ed aktualizaci stavu", + "query_interval": "Interval dotazov\u00e1n\u00ed za\u0159\u00edzen\u00ed v sekund\u00e1ch" + }, + "description": "Nenastavujte intervalu dotazov\u00e1n\u00ed p\u0159\u00edli\u0161 n\u00edzk\u00e9 hodnoty, jinak se dotazov\u00e1n\u00ed nezda\u0159\u00ed a bude generovat chybov\u00e9 zpr\u00e1vy do logu", + "title": "Nastavte mo\u017enosti Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/de.json b/homeassistant/components/tuya/translations/de.json new file mode 100644 index 00000000000..57439e1fa76 --- /dev/null +++ b/homeassistant/components/tuya/translations/de.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "single_instance_allowed": "Bereits konfiguriert. Nur eine einzige Konfiguration m\u00f6glich." + }, + "error": { + "invalid_auth": "Ung\u00fcltige Authentifizierung" + }, + "flow_title": "Tuya Konfiguration", + "step": { + "login": { + "data": { + "access_id": "Zugangs-ID", + "access_secret": "Zugangsgeheimnis", + "country_code": "L\u00e4ndercode", + "endpoint": "Verf\u00fcgbarkeitszone", + "password": "Passwort", + "tuya_app_type": "Mobile App", + "username": "Konto" + }, + "description": "Gib deine Tuya-Anmeldedaten ein", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "L\u00e4ndercode deines Kontos (z. B. 1 f\u00fcr USA oder 86 f\u00fcr China)", + "password": "Passwort", + "platform": "Die App, in der dein Konto registriert ist", + "tuya_project_type": "Tuya Cloud Projekttyp", + "username": "Benutzername" + }, + "description": "Gib deine Tuya-Anmeldeinformationen ein.", + "title": "Tuya-Integration" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Verbindung fehlgeschlagen" + }, + "error": { + "dev_multi_type": "Mehrere ausgew\u00e4hlte Ger\u00e4te zur Konfiguration m\u00fcssen vom gleichen Typ sein", + "dev_not_config": "Ger\u00e4tetyp nicht konfigurierbar", + "dev_not_found": "Ger\u00e4t nicht gefunden" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Vom Ger\u00e4t genutzter Helligkeitsbereich", + "curr_temp_divider": "Aktueller Temperaturwert-Teiler (0 = Standard verwenden)", + "max_kelvin": "Maximal unterst\u00fctzte Farbtemperatur in Kelvin", + "max_temp": "Maximale Solltemperatur (f\u00fcr Voreinstellung min und max = 0 verwenden)", + "min_kelvin": "Minimale unterst\u00fctzte Farbtemperatur in Kelvin", + "min_temp": "Minimal Solltemperatur (f\u00fcr Voreinstellung min und max = 0 verwenden)", + "set_temp_divided": "Geteilten Temperaturwert f\u00fcr Solltemperaturbefehl verwenden", + "support_color": "Farbunterst\u00fctzung erzwingen", + "temp_divider": "Teiler f\u00fcr Temperaturwerte (0 = Standard verwenden)", + "temp_step_override": "Zieltemperaturschritt", + "tuya_max_coltemp": "Vom Ger\u00e4t gemeldete maximale Farbtemperatur", + "unit_of_measurement": "Vom Ger\u00e4t verwendete Temperatureinheit" + }, + "description": "Optionen zur Anpassung der angezeigten Informationen f\u00fcr das Ger\u00e4t `{device_name}` vom Typ: {device_type}konfigurieren", + "title": "Tuya-Ger\u00e4t konfigurieren" + }, + "init": { + "data": { + "discovery_interval": "Abfrageintervall f\u00fcr Ger\u00e4teabruf in Sekunden", + "list_devices": "W\u00e4hle die zu konfigurierenden Ger\u00e4te aus oder lasse sie leer, um die Konfiguration zu speichern", + "query_device": "W\u00e4hle ein Ger\u00e4t aus, das die Abfragemethode f\u00fcr eine schnellere Statusaktualisierung verwendet.", + "query_interval": "Ger\u00e4teabrufintervall in Sekunden" + }, + "description": "Stelle das Abfrageintervall nicht zu niedrig ein, sonst schlagen die Aufrufe fehl und erzeugen eine Fehlermeldung im Protokoll", + "title": "Tuya-Optionen konfigurieren" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/en.json b/homeassistant/components/tuya/translations/en.json index 631f0b7172f..c7aaee977ee 100644 --- a/homeassistant/components/tuya/translations/en.json +++ b/homeassistant/components/tuya/translations/en.json @@ -1,29 +1,79 @@ { "config": { + "abort": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "single_instance_allowed": "Already configured. Only a single configuration possible." + }, "error": { "invalid_auth": "Invalid authentication" }, "flow_title": "Tuya configuration", "step": { - "user":{ - "title":"Tuya Integration", - "data":{ - "tuya_project_type": "Tuya cloud project type" - } - }, "login": { "data": { - "endpoint": "Availability Zone", "access_id": "Access ID", "access_secret": "Access Secret", - "tuya_app_type": "Mobile App", "country_code": "Country Code", - "username": "Account", - "password": "Password" + "endpoint": "Availability Zone", + "password": "Password", + "tuya_app_type": "Mobile App", + "username": "Account" }, - "description": "Enter your Tuya credential.", + "description": "Enter your Tuya credential", "title": "Tuya" + }, + "user": { + "data": { + "country_code": "Your account country code (e.g., 1 for USA or 86 for China)", + "password": "Password", + "platform": "The app where your account is registered", + "tuya_project_type": "Tuya cloud project type", + "username": "Username" + }, + "description": "Enter your Tuya credentials.", + "title": "Tuya Integration" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Failed to connect" + }, + "error": { + "dev_multi_type": "Multiple selected devices to configure must be of the same type", + "dev_not_config": "Device type not configurable", + "dev_not_found": "Device not found" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Brightness range used by device", + "curr_temp_divider": "Current Temperature value divider (0 = use default)", + "max_kelvin": "Max color temperature supported in kelvin", + "max_temp": "Max target temperature (use min and max = 0 for default)", + "min_kelvin": "Min color temperature supported in kelvin", + "min_temp": "Min target temperature (use min and max = 0 for default)", + "set_temp_divided": "Use divided Temperature value for set temperature command", + "support_color": "Force color support", + "temp_divider": "Temperature values divider (0 = use default)", + "temp_step_override": "Target Temperature step", + "tuya_max_coltemp": "Max color temperature reported by device", + "unit_of_measurement": "Temperature unit used by device" + }, + "description": "Configure options to adjust displayed information for {device_type} device `{device_name}`", + "title": "Configure Tuya Device" + }, + "init": { + "data": { + "discovery_interval": "Discovery device polling interval in seconds", + "list_devices": "Select the devices to configure or leave empty to save configuration", + "query_device": "Select device that will use query method for faster status update", + "query_interval": "Query device polling interval in seconds" + }, + "description": "Do not set pollings interval values too low or the calls will fail generating error message in the log", + "title": "Configure Tuya Options" } } } -} +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/es.json b/homeassistant/components/tuya/translations/es.json new file mode 100644 index 00000000000..74649379a7c --- /dev/null +++ b/homeassistant/components/tuya/translations/es.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "single_instance_allowed": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n." + }, + "error": { + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida" + }, + "flow_title": "Configuraci\u00f3n Tuya", + "step": { + "login": { + "data": { + "access_id": "ID de acceso", + "access_secret": "Acceso secreto", + "country_code": "C\u00f3digo de pa\u00eds", + "endpoint": "Zona de disponibilidad", + "password": "Contrase\u00f1a", + "tuya_app_type": "Aplicaci\u00f3n m\u00f3vil", + "username": "Cuenta" + }, + "description": "Ingrese su credencial Tuya", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "C\u00f3digo de pais de tu cuenta (por ejemplo, 1 para USA o 86 para China)", + "password": "Contrase\u00f1a", + "platform": "La aplicaci\u00f3n en la cual registraste tu cuenta", + "tuya_project_type": "Tipo de proyecto en la nube de Tuya", + "username": "Usuario" + }, + "description": "Introduce tu credencial Tuya.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "No se pudo conectar" + }, + "error": { + "dev_multi_type": "Los m\u00faltiples dispositivos seleccionados para configurar deben ser del mismo tipo", + "dev_not_config": "Tipo de dispositivo no configurable", + "dev_not_found": "Dispositivo no encontrado" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Rango de brillo utilizado por el dispositivo", + "curr_temp_divider": "Divisor del valor de la temperatura actual (0 = usar valor por defecto)", + "max_kelvin": "Temperatura de color m\u00e1xima admitida en kelvin", + "max_temp": "Temperatura objetivo m\u00e1xima (usa m\u00edn. y m\u00e1x. = 0 por defecto)", + "min_kelvin": "Temperatura de color m\u00ednima soportada en kelvin", + "min_temp": "Temperatura objetivo m\u00ednima (usa m\u00edn. y m\u00e1x. = 0 por defecto)", + "set_temp_divided": "Use el valor de temperatura dividido para el comando de temperatura establecida", + "support_color": "Forzar soporte de color", + "temp_divider": "Divisor de los valores de temperatura (0 = usar valor por defecto)", + "temp_step_override": "Temperatura deseada", + "tuya_max_coltemp": "Temperatura de color m\u00e1xima notificada por dispositivo", + "unit_of_measurement": "Unidad de temperatura utilizada por el dispositivo" + }, + "description": "Configura las opciones para ajustar la informaci\u00f3n mostrada para {device_type} dispositivo `{device_name}`", + "title": "Configurar dispositivo Tuya" + }, + "init": { + "data": { + "discovery_interval": "Intervalo de sondeo del descubrimiento al dispositivo en segundos", + "list_devices": "Selecciona los dispositivos a configurar o d\u00e9jalos en blanco para guardar la configuraci\u00f3n", + "query_device": "Selecciona el dispositivo que utilizar\u00e1 el m\u00e9todo de consulta para una actualizaci\u00f3n de estado m\u00e1s r\u00e1pida", + "query_interval": "Intervalo de sondeo de la consulta al dispositivo en segundos" + }, + "description": "No establezcas valores de intervalo de sondeo demasiado bajos o las llamadas fallar\u00e1n generando un mensaje de error en el registro", + "title": "Configurar opciones de Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/et.json b/homeassistant/components/tuya/translations/et.json new file mode 100644 index 00000000000..45b4e4d2639 --- /dev/null +++ b/homeassistant/components/tuya/translations/et.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u00dchendamine nurjus", + "invalid_auth": "Tuvastamise viga", + "single_instance_allowed": "Juba seadistatud. V\u00f5imalik on ainult \u00fcks sidumine." + }, + "error": { + "invalid_auth": "Tuvastamise viga" + }, + "flow_title": "Tuya seaded", + "step": { + "login": { + "data": { + "access_id": "Juurdep\u00e4\u00e4su ID", + "access_secret": "API salas\u00f5na", + "country_code": "Riigi kood", + "endpoint": "Seadmete regioon", + "password": "Salas\u00f5na", + "tuya_app_type": "Mobiilirakendus", + "username": "Konto" + }, + "description": "Sisesta oma Tuya mandaat", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "Konto riigikood (nt 1 USA v\u00f5i 372 Eesti)", + "password": "Salas\u00f5na", + "platform": "\u00c4pp kus konto registreeriti", + "tuya_project_type": "Tuya pilveprojekti t\u00fc\u00fcp", + "username": "Kasutajanimi" + }, + "description": "Sisesta oma Tuya konto andmed.", + "title": "Tuya sidumine" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u00dchendamine nurjus" + }, + "error": { + "dev_multi_type": "Mitu h\u00e4\u00e4lestatavat seadet peavad olema sama t\u00fc\u00fcpi", + "dev_not_config": "Seda t\u00fc\u00fcpi seade pole seadistatav", + "dev_not_found": "Seadet ei leitud" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Seadme kasutatav heledusvahemik", + "curr_temp_divider": "Praeguse temperatuuri v\u00e4\u00e4rtuse eraldaja (0 = kasuta vaikev\u00e4\u00e4rtust)", + "max_kelvin": "Maksimaalne v\u00f5imalik v\u00e4rvitemperatuur (Kelvinites)", + "max_temp": "Maksimaalne sihttemperatuur (vaikimisi kasuta min ja max = 0)", + "min_kelvin": "Minimaalne v\u00f5imalik v\u00e4rvitemperatuur (Kelvinites)", + "min_temp": "Minimaalne sihttemperatuur (vaikimisi kasuta min ja max = 0)", + "set_temp_divided": "M\u00e4\u00e4ratud temperatuuri k\u00e4su jaoks kasuta jagatud temperatuuri v\u00e4\u00e4rtust", + "support_color": "Luba v\u00e4rvuse juhtimine", + "temp_divider": "Temperatuuri v\u00e4\u00e4rtuse eraldaja (0 = kasuta vaikev\u00e4\u00e4rtust)", + "temp_step_override": "Sihttemperatuuri samm", + "tuya_max_coltemp": "Seadme teatatud maksimaalne v\u00e4rvitemperatuur", + "unit_of_measurement": "Seadme temperatuuri\u00fchik" + }, + "description": "Suvandid \u00fcksuse {device_type} {device_name} kuvatava teabe muutmiseks", + "title": "H\u00e4\u00e4lesta Tuya seade" + }, + "init": { + "data": { + "discovery_interval": "Seadme leidmisp\u00e4ringute intervall (sekundites)", + "list_devices": "Vali seadistatavad seadmed v\u00f5i j\u00e4ta s\u00e4tete salvestamiseks t\u00fchjaks", + "query_device": "Vali seade, mis kasutab oleku kiiremaks v\u00e4rskendamiseks p\u00e4ringumeetodit", + "query_interval": "P\u00e4ringute intervall (sekundites)" + }, + "description": "\u00c4ra m\u00e4\u00e4ra k\u00fcsitlusintervalli v\u00e4\u00e4rtusi liiga madalaks, vastasel korral v\u00f5ivad p\u00e4ringud logis t\u00f5rketeate genereerida", + "title": "Tuya suvandite seadistamine" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/fi.json b/homeassistant/components/tuya/translations/fi.json new file mode 100644 index 00000000000..3c74a9b8eeb --- /dev/null +++ b/homeassistant/components/tuya/translations/fi.json @@ -0,0 +1,17 @@ +{ + "config": { + "flow_title": "Tuya-asetukset", + "step": { + "user": { + "data": { + "country_code": "Tilisi maakoodi (esim. 1 Yhdysvalloissa, 358 Suomessa)", + "password": "Salasana", + "platform": "Sovellus, johon tili rekister\u00f6id\u00e4\u00e4n", + "username": "K\u00e4ytt\u00e4j\u00e4tunnus" + }, + "description": "Anna Tuya-tunnistetietosi.", + "title": "Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/fr.json b/homeassistant/components/tuya/translations/fr.json new file mode 100644 index 00000000000..b741d3f9377 --- /dev/null +++ b/homeassistant/components/tuya/translations/fr.json @@ -0,0 +1,65 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u00c9chec de connexion", + "invalid_auth": "Authentification invalide", + "single_instance_allowed": "D\u00e9j\u00e0 configur\u00e9. Une seule configuration possible." + }, + "error": { + "invalid_auth": "Authentification invalide" + }, + "flow_title": "Configuration Tuya", + "step": { + "user": { + "data": { + "country_code": "Le code de pays de votre compte (par exemple, 1 pour les \u00c9tats-Unis ou 86 pour la Chine)", + "password": "Mot de passe", + "platform": "L'application dans laquelle votre compte est enregistr\u00e9", + "username": "Nom d'utilisateur" + }, + "description": "Saisissez vos informations d'identification Tuya.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u00c9chec de connexion" + }, + "error": { + "dev_multi_type": "Plusieurs p\u00e9riph\u00e9riques s\u00e9lectionn\u00e9s \u00e0 configurer doivent \u00eatre du m\u00eame type", + "dev_not_config": "Type d'appareil non configurable", + "dev_not_found": "Appareil non trouv\u00e9" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Plage de luminosit\u00e9 utilis\u00e9e par l'appareil", + "curr_temp_divider": "Diviseur de valeur de temp\u00e9rature actuelle (0 = utiliser la valeur par d\u00e9faut)", + "max_kelvin": "Temp\u00e9rature de couleur maximale prise en charge en Kelvin", + "max_temp": "Temp\u00e9rature cible maximale (utilisez min et max = 0 par d\u00e9faut)", + "min_kelvin": "Temp\u00e9rature de couleur minimale prise en charge en kelvin", + "min_temp": "Temp\u00e9rature cible minimale (utilisez min et max = 0 par d\u00e9faut)", + "set_temp_divided": "Utilisez la valeur de temp\u00e9rature divis\u00e9e pour la commande de temp\u00e9rature d\u00e9finie", + "support_color": "Forcer la prise en charge des couleurs", + "temp_divider": "Diviseur de valeurs de temp\u00e9rature (0 = utiliser la valeur par d\u00e9faut)", + "temp_step_override": "Pas de temp\u00e9rature cible", + "tuya_max_coltemp": "Temp\u00e9rature de couleur maximale rapport\u00e9e par l'appareil", + "unit_of_measurement": "Unit\u00e9 de temp\u00e9rature utilis\u00e9e par l'appareil" + }, + "description": "Configurer les options pour ajuster les informations affich\u00e9es pour l'appareil {device_type} ` {device_name} `", + "title": "Configurer l'appareil Tuya" + }, + "init": { + "data": { + "discovery_interval": "Intervalle de d\u00e9couverte de l'appareil en secondes", + "list_devices": "S\u00e9lectionnez les appareils \u00e0 configurer ou laissez vide pour enregistrer la configuration", + "query_device": "S\u00e9lectionnez l'appareil qui utilisera la m\u00e9thode de requ\u00eate pour une mise \u00e0 jour plus rapide de l'\u00e9tat", + "query_interval": "Intervalle d'interrogation de l'appareil en secondes" + }, + "description": "Ne d\u00e9finissez pas des valeurs d'intervalle d'interrogation trop faibles ou les appels \u00e9choueront \u00e0 g\u00e9n\u00e9rer un message d'erreur dans le journal", + "title": "Configurer les options de Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/he.json b/homeassistant/components/tuya/translations/he.json new file mode 100644 index 00000000000..44a7699e511 --- /dev/null +++ b/homeassistant/components/tuya/translations/he.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "single_instance_allowed": "\u05ea\u05e6\u05d5\u05e8\u05ea\u05d5 \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e8\u05e7 \u05ea\u05e6\u05d5\u05e8\u05d4 \u05d0\u05d7\u05ea \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea." + }, + "error": { + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9" + }, + "flow_title": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d8\u05d5\u05d9\u05d4", + "step": { + "user": { + "data": { + "country_code": "\u05e7\u05d5\u05d3 \u05de\u05d3\u05d9\u05e0\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da (\u05dc\u05de\u05e9\u05dc, 1 \u05dc\u05d0\u05e8\u05d4\"\u05d1 \u05d0\u05d5 972 \u05dc\u05d9\u05e9\u05e8\u05d0\u05dc)", + "password": "\u05e1\u05d9\u05e1\u05de\u05d4", + "platform": "\u05d4\u05d9\u05d9\u05e9\u05d5\u05dd \u05d1\u05d5 \u05e8\u05e9\u05d5\u05dd \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da", + "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" + }, + "description": "\u05d4\u05d6\u05df \u05d0\u05ea \u05d0\u05d9\u05e9\u05d5\u05e8\u05d9 \u05d8\u05d5\u05d9\u05d4 \u05e9\u05dc\u05da.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/hu.json b/homeassistant/components/tuya/translations/hu.json new file mode 100644 index 00000000000..b90d2a2ff81 --- /dev/null +++ b/homeassistant/components/tuya/translations/hu.json @@ -0,0 +1,65 @@ +{ + "config": { + "abort": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s", + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." + }, + "error": { + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s" + }, + "flow_title": "Tuya konfigur\u00e1ci\u00f3", + "step": { + "user": { + "data": { + "country_code": "A fi\u00f3k orsz\u00e1gk\u00f3dja (pl. 1 USA, 36 Magyarorsz\u00e1g, vagy 86 K\u00edna)", + "password": "Jelsz\u00f3", + "platform": "Az alkalmaz\u00e1s, ahol a fi\u00f3k regisztr\u00e1lt", + "username": "Felhaszn\u00e1l\u00f3n\u00e9v" + }, + "description": "Adja meg Tuya hiteles\u00edt\u0151 adatait.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "A kapcsol\u00f3d\u00e1s nem siker\u00fclt" + }, + "error": { + "dev_multi_type": "T\u00f6bb kiv\u00e1lasztott konfigur\u00e1land\u00f3 eszk\u00f6z eset\u00e9n, azonos t\u00edpus\u00fanak kell lennie", + "dev_not_config": "Ez az eszk\u00f6zt\u00edpus nem konfigur\u00e1lhat\u00f3", + "dev_not_found": "Eszk\u00f6z nem tal\u00e1lhat\u00f3" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Az eszk\u00f6z \u00e1ltal haszn\u00e1lt f\u00e9nyer\u0151 tartom\u00e1ny", + "curr_temp_divider": "Aktu\u00e1lis h\u0151m\u00e9rs\u00e9klet-\u00e9rt\u00e9k oszt\u00f3 (0 = alap\u00e9rtelmezetten)", + "max_kelvin": "Maxim\u00e1lis t\u00e1mogatott sz\u00ednh\u0151m\u00e9rs\u00e9klet kelvinben", + "max_temp": "Maxim\u00e1lis k\u00edv\u00e1nt h\u0151m\u00e9rs\u00e9klet (alap\u00e9rtelmezettnek min \u00e9s max 0)", + "min_kelvin": "Minimum t\u00e1mogatott sz\u00ednh\u0151m\u00e9rs\u00e9klet kelvinben", + "min_temp": "Minim\u00e1lis k\u00edv\u00e1nt h\u0151m\u00e9rs\u00e9klet (alap\u00e9rtelmezettnek min \u00e9s max 0)", + "set_temp_divided": "A h\u0151m\u00e9rs\u00e9klet be\u00e1ll\u00edt\u00e1s\u00e1hoz osztott h\u0151m\u00e9rs\u00e9kleti \u00e9rt\u00e9ket haszn\u00e1ljon", + "support_color": "Sz\u00ednt\u00e1mogat\u00e1s k\u00e9nyszer\u00edt\u00e9se", + "temp_divider": "Sz\u00ednh\u0151m\u00e9rs\u00e9klet-\u00e9rt\u00e9kek oszt\u00f3ja (0 = alap\u00e9rtelmezett)", + "temp_step_override": "C\u00e9lh\u0151m\u00e9rs\u00e9klet l\u00e9pcs\u0151", + "tuya_max_coltemp": "Az eszk\u00f6z \u00e1ltal megadott maxim\u00e1lis sz\u00ednh\u0151m\u00e9rs\u00e9klet", + "unit_of_measurement": "Az eszk\u00f6z \u00e1ltal haszn\u00e1lt h\u0151m\u00e9rs\u00e9kleti egys\u00e9g" + }, + "description": "Konfigur\u00e1l\u00e1si lehet\u0151s\u00e9gek a(z) {device_type} t\u00edpus\u00fa `{device_name}` eszk\u00f6z megjelen\u00edtett inform\u00e1ci\u00f3inak be\u00e1ll\u00edt\u00e1s\u00e1hoz", + "title": "Tuya eszk\u00f6z konfigur\u00e1l\u00e1sa" + }, + "init": { + "data": { + "discovery_interval": "Felfedez\u0151 eszk\u00f6z lek\u00e9rdez\u00e9si intervalluma m\u00e1sodpercben", + "list_devices": "V\u00e1lassza ki a konfigur\u00e1lni k\u00edv\u00e1nt eszk\u00f6z\u00f6ket, vagy hagyja \u00fcresen a konfigur\u00e1ci\u00f3 ment\u00e9s\u00e9hez", + "query_device": "V\u00e1lassza ki azt az eszk\u00f6zt, amely a lek\u00e9rdez\u00e9si m\u00f3dszert haszn\u00e1lja a gyorsabb \u00e1llapotfriss\u00edt\u00e9shez", + "query_interval": "Eszk\u00f6z lek\u00e9rdez\u00e9si id\u0151k\u00f6ze m\u00e1sodpercben" + }, + "description": "Ne \u00e1ll\u00edtsd t\u00fal alacsonyra a lek\u00e9rdez\u00e9si intervallum \u00e9rt\u00e9keit, k\u00fcl\u00f6nben a h\u00edv\u00e1sok nem fognak hiba\u00fczenetet gener\u00e1lni a napl\u00f3ban", + "title": "Tuya be\u00e1ll\u00edt\u00e1sok konfigur\u00e1l\u00e1sa" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/id.json b/homeassistant/components/tuya/translations/id.json new file mode 100644 index 00000000000..8b7f196b5a2 --- /dev/null +++ b/homeassistant/components/tuya/translations/id.json @@ -0,0 +1,65 @@ +{ + "config": { + "abort": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." + }, + "error": { + "invalid_auth": "Autentikasi tidak valid" + }, + "flow_title": "Konfigurasi Tuya", + "step": { + "user": { + "data": { + "country_code": "Kode negara akun Anda (mis., 1 untuk AS atau 86 untuk China)", + "password": "Kata Sandi", + "platform": "Aplikasi tempat akun Anda terdaftar", + "username": "Nama Pengguna" + }, + "description": "Masukkan kredensial Tuya Anda.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Gagal terhubung" + }, + "error": { + "dev_multi_type": "Untuk konfigurasi sekaligus, beberapa perangkat yang dipilih harus berjenis sama", + "dev_not_config": "Jenis perangkat tidak dapat dikonfigurasi", + "dev_not_found": "Perangkat tidak ditemukan" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Rentang kecerahan yang digunakan oleh perangkat", + "curr_temp_divider": "Pembagi nilai suhu saat ini (0 = gunakan bawaan)", + "max_kelvin": "Suhu warna maksimal yang didukung dalam Kelvin", + "max_temp": "Suhu target maksimal (gunakan min dan maks = 0 untuk bawaan)", + "min_kelvin": "Suhu warna minimal yang didukung dalam Kelvin", + "min_temp": "Suhu target minimal (gunakan min dan maks = 0 untuk bawaan)", + "set_temp_divided": "Gunakan nilai suhu terbagi untuk mengirimkan perintah mengatur suhu", + "support_color": "Paksa dukungan warna", + "temp_divider": "Pembagi nilai suhu (0 = gunakan bawaan)", + "temp_step_override": "Langkah Suhu Target", + "tuya_max_coltemp": "Suhu warna maksimal yang dilaporkan oleh perangkat", + "unit_of_measurement": "Satuan suhu yang digunakan oleh perangkat" + }, + "description": "Konfigurasikan opsi untuk menyesuaikan informasi yang ditampilkan untuk perangkat {device_type} `{device_name}`", + "title": "Konfigurasi Perangkat Tuya" + }, + "init": { + "data": { + "discovery_interval": "Interval polling penemuan perangkat dalam detik", + "list_devices": "Pilih perangkat yang akan dikonfigurasi atau biarkan kosong untuk menyimpan konfigurasi", + "query_device": "Pilih perangkat yang akan menggunakan metode kueri untuk pembaruan status lebih cepat", + "query_interval": "Interval polling perangkat kueri dalam detik" + }, + "description": "Jangan atur nilai interval polling terlalu rendah karena panggilan akan gagal menghasilkan pesan kesalahan dalam log", + "title": "Konfigurasikan Opsi Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/it.json b/homeassistant/components/tuya/translations/it.json new file mode 100644 index 00000000000..3baed47661c --- /dev/null +++ b/homeassistant/components/tuya/translations/it.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "Impossibile connettersi", + "invalid_auth": "Autenticazione non valida", + "single_instance_allowed": "Gi\u00e0 configurato. \u00c8 possibile una sola configurazione." + }, + "error": { + "invalid_auth": "Autenticazione non valida" + }, + "flow_title": "Configurazione di Tuya", + "step": { + "login": { + "data": { + "access_id": "ID di accesso", + "access_secret": "Accesso segreto", + "country_code": "Prefisso internazionale", + "endpoint": "Zona di disponibilit\u00e0", + "password": "Password", + "tuya_app_type": "App per dispositivi mobili", + "username": "Account" + }, + "description": "Inserisci le tue credenziali Tuya", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "Prefisso internazionale del tuo account (ad es. 1 per gli Stati Uniti o 86 per la Cina)", + "password": "Password", + "platform": "L'app in cui \u00e8 registrato il tuo account", + "tuya_project_type": "Tipo di progetto Tuya cloud", + "username": "Nome utente" + }, + "description": "Inserisci le tue credenziali Tuya.", + "title": "Integrazione Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Impossibile connettersi" + }, + "error": { + "dev_multi_type": "Pi\u00f9 dispositivi selezionati da configurare devono essere dello stesso tipo", + "dev_not_config": "Tipo di dispositivo non configurabile", + "dev_not_found": "Dispositivo non trovato" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Intervallo di luminosit\u00e0 utilizzato dal dispositivo", + "curr_temp_divider": "Divisore del valore della temperatura corrente (0 = usa il valore predefinito)", + "max_kelvin": "Temperatura colore massima supportata in kelvin", + "max_temp": "Temperatura di destinazione massima (utilizzare min e max = 0 per impostazione predefinita)", + "min_kelvin": "Temperatura colore minima supportata in kelvin", + "min_temp": "Temperatura di destinazione minima (utilizzare min e max = 0 per impostazione predefinita)", + "set_temp_divided": "Utilizzare il valore temperatura diviso per impostare il comando temperatura", + "support_color": "Forza il supporto del colore", + "temp_divider": "Divisore dei valori di temperatura (0 = utilizzare il valore predefinito)", + "temp_step_override": "Passo della temperatura da raggiungere", + "tuya_max_coltemp": "Temperatura di colore massima riportata dal dispositivo", + "unit_of_measurement": "Unit\u00e0 di temperatura utilizzata dal dispositivo" + }, + "description": "Configura le opzioni per regolare le informazioni visualizzate per il dispositivo {device_type} `{device_name}`", + "title": "Configura il dispositivo Tuya" + }, + "init": { + "data": { + "discovery_interval": "Intervallo di scansione di rilevamento dispositivo in secondi", + "list_devices": "Selezionare i dispositivi da configurare o lasciare vuoto per salvare la configurazione", + "query_device": "Selezionare il dispositivo che utilizzer\u00e0 il metodo di interrogazione per un pi\u00f9 rapido aggiornamento dello stato", + "query_interval": "Intervallo di scansione di interrogazione dispositivo in secondi" + }, + "description": "Non impostare valori dell'intervallo di scansione troppo bassi o le chiamate non riusciranno a generare un messaggio di errore nel registro", + "title": "Configura le opzioni Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/ka.json b/homeassistant/components/tuya/translations/ka.json new file mode 100644 index 00000000000..7c80ef1ffba --- /dev/null +++ b/homeassistant/components/tuya/translations/ka.json @@ -0,0 +1,37 @@ +{ + "options": { + "error": { + "dev_multi_type": "\u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d0\u10ea\u10d8\u10d8\u10e1\u10d7\u10d5\u10d8\u10e1 \u10e8\u10d4\u10e0\u10e9\u10d4\u10e3\u10da\u10d8 \u10db\u10e0\u10d0\u10d5\u10da\u10dd\u10d1\u10d8\u10d7\u10d8 \u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d0 \u10e3\u10dc\u10d3\u10d0 \u10d8\u10e7\u10dd\u10e1 \u10d4\u10e0\u10d7\u10dc\u10d0\u10d8\u10e0\u10d8 \u10e2\u10d8\u10de\u10d8\u10e1", + "dev_not_config": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10e2\u10d8\u10de\u10d8 \u10d0\u10e0 \u10d0\u10e0\u10d8\u10e1 \u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d8\u10e0\u10d4\u10d1\u10d0\u10d3\u10d8", + "dev_not_found": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d0 \u10d5\u10d4\u10e0 \u10db\u10dd\u10d8\u10eb\u10d4\u10d1\u10dc\u10d0" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10db\u10d8\u10d4\u10e0 \u10d2\u10d0\u10db\u10dd\u10e7\u10d4\u10dc\u10d4\u10d1\u10e3\u10da\u10d8 \u10e1\u10d8\u10d9\u10d0\u10e8\u10d9\u10d0\u10e8\u10d8\u10e1 \u10d3\u10d8\u10d0\u10de\u10d0\u10d6\u10dd\u10dc\u10d8", + "curr_temp_divider": "\u10db\u10d8\u10db\u10d3\u10d8\u10dc\u10d0\u10e0\u10d4 \u10e2\u10d4\u10db\u10d4\u10de\u10e0\u10d0\u10e2\u10e3\u10e0\u10d8\u10e1 \u10db\u10dc\u10d8\u10e8\u10d5\u10dc\u10d4\u10da\u10d8\u10e1 \u10d2\u10d0\u10db\u10e7\u10dd\u10e4\u10d8 (0 - \u10dc\u10d0\u10d2\u10e3\u10da\u10d8\u10e1\u10ee\u10db\u10d4\u10d5\u10d8)", + "max_kelvin": "\u10db\u10ee\u10d0\u10e0\u10d3\u10d0\u10ed\u10d4\u10e0\u10d8\u10da\u10d8 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10d8\u10e1 \u10e4\u10d4\u10e0\u10d8 \u10d9\u10d4\u10da\u10d5\u10d8\u10dc\u10d4\u10d1\u10e8\u10d8", + "max_temp": "\u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10db\u10d8\u10d6\u10dc\u10dd\u10d1\u10e0\u10d8\u10d5\u10d8 \u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10d0 (\u10db\u10d8\u10dc\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10d3\u10d0 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8\u10e1\u10d0\u10d7\u10d5\u10d8\u10e1 \u10dc\u10d0\u10d2\u10e3\u10da\u10d8\u10e1\u10ee\u10db\u10d4\u10d5\u10d8\u10d0 0)", + "min_kelvin": "\u10db\u10ee\u10d0\u10e0\u10d3\u10d0\u10ed\u10d4\u10e0\u10d8\u10da\u10d8 \u10db\u10d8\u10dc\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10d8\u10e1 \u10e4\u10d4\u10e0\u10d8 \u10d9\u10d4\u10da\u10d5\u10d8\u10dc\u10d4\u10d1\u10e8\u10d8", + "min_temp": "\u10db\u10d8\u10dc\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10db\u10d8\u10d6\u10dc\u10dd\u10d1\u10e0\u10d8\u10d5\u10d8 \u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10d0 (\u10db\u10d8\u10dc\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10d3\u10d0 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8\u10e1\u10d0\u10d7\u10d5\u10d8\u10e1 \u10dc\u10d0\u10d2\u10e3\u10da\u10d8\u10e1\u10ee\u10db\u10d4\u10d5\u10d8\u10d0 0)", + "support_color": "\u10e4\u10d4\u10e0\u10d8\u10e1 \u10db\u10ee\u10d0\u10e0\u10d3\u10d0\u10ed\u10d4\u10e0\u10d0 \u10d8\u10eb\u10e3\u10da\u10d4\u10d1\u10d8\u10d7", + "temp_divider": "\u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10e3\u10da\u10d8 \u10db\u10dc\u10d8\u10e8\u10d5\u10dc\u10d4\u10da\u10d8\u10e1 \u10d2\u10d0\u10db\u10e7\u10dd\u10e4\u10d8 (0 = \u10dc\u10d0\u10d2\u10e3\u10da\u10d8\u10e1\u10ee\u10db\u10d4\u10d5\u10d8)", + "tuya_max_coltemp": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10db\u10d8\u10d4\u10e0 \u10db\u10dd\u10ec\u10dd\u10d3\u10d4\u10d1\u10e3\u10da\u10d8 \u10e4\u10d4\u10e0\u10d8\u10e1 \u10db\u10d0\u10e5\u10e1\u10d8\u10db\u10d0\u10da\u10e3\u10e0\u10d8 \u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10d0", + "unit_of_measurement": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10db\u10d8\u10d4\u10e0 \u10d2\u10d0\u10db\u10dd\u10e7\u10d4\u10dc\u10d4\u10d1\u10e3\u10da\u10d8 \u10e2\u10d4\u10db\u10de\u10d4\u10e0\u10d0\u10e2\u10e3\u10e0\u10e3\u10da\u10d8 \u10d4\u10e0\u10d7\u10d4\u10e3\u10da\u10d8" + }, + "description": "\u10d3\u10d0\u10d0\u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d8\u10e0\u10d4\u10d3 {device_type} `{device_name}` \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10d4\u10e0\u10d1\u10d8 \u10d8\u10dc\u10e4\u10dd\u10e0\u10db\u10d0\u10ea\u10d8\u10d8\u10e1 \u10e9\u10d5\u10d4\u10dc\u10d4\u10d1\u10d8\u10e1 \u10db\u10dd\u10e1\u10d0\u10e0\u10d2\u10d4\u10d1\u10d0\u10d3", + "title": "Tuya-\u10e1 \u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d8\u10e0\u10d4\u10d1\u10d0" + }, + "init": { + "data": { + "discovery_interval": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10d0\u10e6\u10db\u10dd\u10e9\u10d4\u10dc\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10d9\u10d8\u10d7\u10ee\u10d5\u10d8\u10e1 \u10d8\u10dc\u10e2\u10d4\u10e0\u10d5\u10d0\u10da\u10d8 \u10ec\u10d0\u10db\u10d4\u10d1\u10e8\u10d8", + "list_devices": "\u10d0\u10d8\u10e0\u10e9\u10d8\u10d4\u10d7 \u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d0 \u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d0\u10ea\u10d8\u10d8\u10e1\u10d7\u10d5\u10d8\u10e1 \u10d0\u10dc \u10d3\u10d0\u10e2\u10dd\u10d5\u10d4\u10d7 \u10ea\u10d0\u10e0\u10d8\u10d4\u10da\u10d8 \u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d0\u10ea\u10d8\u10d8\u10e1 \u10e8\u10d4\u10e1\u10d0\u10dc\u10d0\u10ee\u10d0\u10d3", + "query_device": "\u10d0\u10d8\u10e0\u10e9\u10d8\u10d4\u10d7 \u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d0, \u10e0\u10dd\u10db\u10d4\u10da\u10d8\u10ea \u10d2\u10d0\u10db\u10dd\u10d8\u10e7\u10d4\u10dc\u10d4\u10d1\u10e1 \u10db\u10dd\u10d7\u10ee\u10dd\u10d5\u10dc\u10d8\u10e1 \u10db\u10d4\u10d7\u10dd\u10d3\u10e1 \u10e1\u10e2\u10d0\u10e2\u10e3\u10e1\u10d8\u10e1 \u10e1\u10ec\u10e0\u10d0\u10e4\u10d8 \u10d2\u10d0\u10dc\u10d0\u10ee\u10da\u10d4\u10d1\u10d8\u10e1\u10d7\u10d5\u10d8\u10e1", + "query_interval": "\u10db\u10dd\u10ec\u10e7\u10dd\u10d1\u10d8\u10da\u10dd\u10d1\u10d8\u10e1 \u10d2\u10d0\u10db\u10dd\u10d9\u10d8\u10d7\u10ee\u10d5\u10d8\u10e1 \u10db\u10dd\u10d7\u10ee\u10dd\u10d5\u10dc\u10d8\u10e1 \u10d8\u10dc\u10e2\u10d4\u10e0\u10d5\u10d0\u10da\u10d8 \u10ec\u10d0\u10db\u10d4\u10d1\u10e8\u10d8" + }, + "description": "\u10d0\u10e0 \u10d3\u10d0\u10d0\u10e7\u10d4\u10dc\u10dd\u10d7 \u10d2\u10d0\u10db\u10dd\u10d9\u10d8\u10d7\u10ee\u10d5\u10d8\u10e1 \u10d8\u10dc\u10e2\u10d4\u10e0\u10d5\u10d0\u10da\u10d8\u10e1 \u10db\u10dc\u10d8\u10e8\u10d5\u10dc\u10d4\u10da\u10dd\u10d1\u10d4\u10d1\u10d8 \u10eb\u10d0\u10da\u10d8\u10d0\u10dc \u10db\u10ea\u10d8\u10e0\u10d4 \u10d7\u10dd\u10e0\u10d4\u10d1 \u10d2\u10d0\u10db\u10dd\u10eb\u10d0\u10ee\u10d4\u10d1\u10d4\u10d1\u10d8 \u10d3\u10d0\u10d0\u10d2\u10d4\u10dc\u10d4\u10e0\u10d8\u10e0\u10d4\u10d1\u10d4\u10dc \u10e8\u10d4\u10ea\u10d3\u10dd\u10db\u10d4\u10d1\u10e1 \u10da\u10dd\u10d2\u10e8\u10d8", + "title": "Tuya-\u10e1 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8\u10e1 \u10d9\u10dd\u10dc\u10e4\u10d8\u10d2\u10e3\u10e0\u10d8\u10e0\u10d4\u10d1\u10d0" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/ko.json b/homeassistant/components/tuya/translations/ko.json new file mode 100644 index 00000000000..afa2541e7b9 --- /dev/null +++ b/homeassistant/components/tuya/translations/ko.json @@ -0,0 +1,65 @@ +{ + "config": { + "abort": { + "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4", + "invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4", + "single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4." + }, + "error": { + "invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4" + }, + "flow_title": "Tuya \uad6c\uc131\ud558\uae30", + "step": { + "user": { + "data": { + "country_code": "\uacc4\uc815 \uad6d\uac00 \ucf54\ub4dc (\uc608 : \ubbf8\uad6d\uc758 \uacbd\uc6b0 1, \uc911\uad6d\uc758 \uacbd\uc6b0 86)", + "password": "\ube44\ubc00\ubc88\ud638", + "platform": "\uacc4\uc815\uc774 \ub4f1\ub85d\ub41c \uc571", + "username": "\uc0ac\uc6a9\uc790 \uc774\ub984" + }, + "description": "Tuya \uc790\uaca9 \uc99d\uba85\uc744 \uc785\ub825\ud574\uc8fc\uc138\uc694.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4" + }, + "error": { + "dev_multi_type": "\uc120\ud0dd\ud55c \uc5ec\ub7ec \uae30\uae30\ub97c \uad6c\uc131\ud558\ub824\uba74 \uc720\ud615\uc774 \ub3d9\uc77c\ud574\uc57c \ud569\ub2c8\ub2e4", + "dev_not_config": "\uae30\uae30 \uc720\ud615\uc744 \uad6c\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4", + "dev_not_found": "\uae30\uae30\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\uae30\uae30\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ubc1d\uae30 \ubc94\uc704", + "curr_temp_divider": "\ud604\uc7ac \uc628\ub3c4 \uac12 \ubd84\ud560 (0 = \uae30\ubcf8\uac12 \uc0ac\uc6a9)", + "max_kelvin": "\uce98\ube48 \ub2e8\uc704\uc758 \ucd5c\ub300 \uc0c9\uc628\ub3c4", + "max_temp": "\ucd5c\ub300 \ubaa9\ud45c \uc628\ub3c4 (\uae30\ubcf8\uac12\uc758 \uacbd\uc6b0 \ucd5c\uc19f\uac12 \ubc0f \ucd5c\ub313\uac12 = 0)", + "min_kelvin": "\uce98\ube48 \ub2e8\uc704\uc758 \ucd5c\uc18c \uc0c9\uc628\ub3c4", + "min_temp": "\ucd5c\uc18c \ubaa9\ud45c \uc628\ub3c4 (\uae30\ubcf8\uac12\uc758 \uacbd\uc6b0 \ucd5c\uc19f\uac12 \ubc0f \ucd5c\ub313\uac12 = 0)", + "set_temp_divided": "\uc124\uc815 \uc628\ub3c4 \uba85\ub839\uc5d0 \ubd84\ud560\ub41c \uc628\ub3c4 \uac12 \uc0ac\uc6a9\ud558\uae30", + "support_color": "\uc0c9\uc0c1 \uc9c0\uc6d0 \uac15\uc81c \uc801\uc6a9\ud558\uae30", + "temp_divider": "\uc628\ub3c4 \uac12 \ubd84\ud560 (0 = \uae30\ubcf8\uac12 \uc0ac\uc6a9)", + "temp_step_override": "\ud76c\ub9dd \uc628\ub3c4 \ub2e8\uacc4", + "tuya_max_coltemp": "\uae30\uae30\uc5d0\uc11c \ubcf4\uace0\ud55c \ucd5c\ub300 \uc0c9\uc628\ub3c4", + "unit_of_measurement": "\uae30\uae30\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc628\ub3c4 \ub2e8\uc704" + }, + "description": "{device_type} `{device_name}` \uae30\uae30\uc5d0 \ub300\ud574 \ud45c\uc2dc\ub418\ub294 \uc815\ubcf4\ub97c \uc870\uc815\ud558\ub294 \uc635\uc158 \uad6c\uc131\ud558\uae30", + "title": "Tuya \uae30\uae30 \uad6c\uc131\ud558\uae30" + }, + "init": { + "data": { + "discovery_interval": "\uae30\uae30 \uac80\uc0c9 \ud3f4\ub9c1 \uac04\uaca9 (\ucd08)", + "list_devices": "\uad6c\uc131\uc744 \uc800\uc7a5\ud558\ub824\uba74 \uad6c\uc131\ud560 \uae30\uae30\ub97c \uc120\ud0dd\ud558\uac70\ub098 \ube44\uc6cc \ub450\uc138\uc694", + "query_device": "\ube60\ub978 \uc0c1\ud0dc \uc5c5\ub370\uc774\ud2b8\ub97c \uc704\ud574 \ucffc\ub9ac \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud560 \uae30\uae30\ub97c \uc120\ud0dd\ud574\uc8fc\uc138\uc694", + "query_interval": "\uae30\uae30 \ucffc\ub9ac \ud3f4\ub9c1 \uac04\uaca9 (\ucd08)" + }, + "description": "\ud3f4\ub9c1 \uac04\uaca9 \uac12\uc744 \ub108\ubb34 \ub0ae\uac8c \uc124\uc815\ud558\uc9c0 \ub9d0\uc544 \uc8fc\uc138\uc694. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \ud638\ucd9c\uc5d0 \uc2e4\ud328\ud558\uace0 \ub85c\uadf8\uc5d0 \uc624\ub958 \uba54\uc2dc\uc9c0\uac00 \uc0dd\uc131\ub429\ub2c8\ub2e4.", + "title": "Tuya \uc635\uc158 \uad6c\uc131\ud558\uae30" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/lb.json b/homeassistant/components/tuya/translations/lb.json new file mode 100644 index 00000000000..0000f9ef6e6 --- /dev/null +++ b/homeassistant/components/tuya/translations/lb.json @@ -0,0 +1,59 @@ +{ + "config": { + "abort": { + "cannot_connect": "Feeler beim verbannen", + "invalid_auth": "Ong\u00eblteg Authentifikatioun", + "single_instance_allowed": "Scho konfigur\u00e9iert. N\u00ebmmen eng eenzeg Konfiguratioun ass m\u00e9iglech." + }, + "error": { + "invalid_auth": "Ong\u00eblteg Authentifikatioun" + }, + "flow_title": "Tuya Konfiguratioun", + "step": { + "user": { + "data": { + "country_code": "De L\u00e4nner Code fir d\u00e4i Kont (beispill 1 fir USA oder 86 fir China)", + "password": "Passwuert", + "platform": "d'App wou den Kont registr\u00e9iert ass", + "username": "Benotzernumm" + }, + "description": "F\u00ebll deng Tuya Umeldungs Informatiounen aus.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Feeler beim verbannen" + }, + "error": { + "dev_multi_type": "Multiple ausgewielte Ger\u00e4ter fir ze konfigur\u00e9ieren musse vum selwechten Typ sinn", + "dev_not_config": "Typ vun Apparat net konfigur\u00e9ierbar", + "dev_not_found": "Apparat net fonnt" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Hellegkeetsber\u00e4ich vum Apparat", + "curr_temp_divider": "Aktuell Temperatur W\u00e4erter Deeler (0= benotz Standard)", + "max_kelvin": "Maximal Faarftemperatur \u00ebnnerst\u00ebtzt a Kelvin", + "max_temp": "Maximal Zil Temperatur (benotz min a max = 0 fir standard)", + "min_kelvin": "Minimal Faarftemperatur \u00ebnnerst\u00ebtzt a Kelvin", + "min_temp": "Minimal Zil Temperatur (benotz min a max = 0 fir standard)", + "support_color": "Forc\u00e9ier Faarf \u00cbnnerst\u00ebtzung", + "temp_divider": "Temperatur W\u00e4erter Deeler (0= benotz Standard)", + "tuya_max_coltemp": "Max Faarftemperatur vum Apparat gemellt", + "unit_of_measurement": "Temperatur Eenheet vum Apparat" + }, + "description": "Konfigur\u00e9ier Optioune fir ugewisen Informatioune fir {device_type} Apparat `{device_name}` unzepassen", + "title": "Tuya Apparat ariichten" + }, + "init": { + "data": { + "list_devices": "Wiel d'Apparater fir ze konfigur\u00e9ieren aus oder loss se eidel fir d'Konfiguratioun ze sp\u00e4icheren" + }, + "title": "Tuya Optioune konfigur\u00e9ieren" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/nl.json b/homeassistant/components/tuya/translations/nl.json new file mode 100644 index 00000000000..be405db1a08 --- /dev/null +++ b/homeassistant/components/tuya/translations/nl.json @@ -0,0 +1,78 @@ +{ + "config": { + "abort": { + "cannot_connect": "Kan geen verbinding maken", + "invalid_auth": "Ongeldige authenticatie", + "single_instance_allowed": "Al geconfigureerd. Er is maar een configuratie mogelijk." + }, + "error": { + "invalid_auth": "Ongeldige authenticatie" + }, + "flow_title": "Tuya-configuratie", + "step": { + "login": { + "data": { + "access_id": "Toegangs-ID", + "country_code": "Landcode", + "endpoint": "Beschikbaarheidszone", + "password": "Wachtwoord", + "tuya_app_type": "Mobiele app", + "username": "Account" + }, + "description": "Voer uw Tuya-inloggegevens in", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "De landcode van uw account (bijvoorbeeld 1 voor de VS of 86 voor China)", + "password": "Wachtwoord", + "platform": "De app waar uw account is geregistreerd", + "tuya_project_type": "Tuya cloud project type", + "username": "Gebruikersnaam" + }, + "description": "Voer uw Tuya-inloggegevens in.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Kan geen verbinding maken" + }, + "error": { + "dev_multi_type": "Meerdere geselecteerde apparaten om te configureren moeten van hetzelfde type zijn", + "dev_not_config": "Apparaattype kan niet worden geconfigureerd", + "dev_not_found": "Apparaat niet gevonden" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Helderheidsbereik gebruikt door apparaat", + "curr_temp_divider": "Huidige temperatuurwaarde deler (0 = standaardwaarde)", + "max_kelvin": "Max kleurtemperatuur in kelvin", + "max_temp": "Maximale doeltemperatuur (gebruik min en max = 0 voor standaardwaarde)", + "min_kelvin": "Minimaal ondersteunde kleurtemperatuur in kelvin", + "min_temp": "Min. gewenste temperatuur (gebruik min en max = 0 voor standaard)", + "set_temp_divided": "Gedeelde temperatuurwaarde gebruiken voor ingestelde temperatuuropdracht", + "support_color": "Forceer kleurenondersteuning", + "temp_divider": "Temperatuurwaarde deler (0 = standaardwaarde)", + "temp_step_override": "Doeltemperatuur stap", + "tuya_max_coltemp": "Max. kleurtemperatuur gerapporteerd door apparaat", + "unit_of_measurement": "Temperatuureenheid gebruikt door apparaat" + }, + "description": "Configureer opties om weergegeven informatie aan te passen voor {device_type} apparaat `{device_name}`", + "title": "Configureer Tuya Apparaat" + }, + "init": { + "data": { + "discovery_interval": "Polling-interval van nieuwe apparaten in seconden", + "list_devices": "Selecteer de te configureren apparaten of laat leeg om de configuratie op te slaan", + "query_device": "Selecteer apparaat dat query-methode zal gebruiken voor snellere statusupdate", + "query_interval": "Peilinginterval van het apparaat in seconden" + }, + "description": "Stel de waarden voor het pollinginterval niet te laag in, anders zullen de oproepen geen foutmelding in het logboek genereren", + "title": "Configureer Tuya opties" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/no.json b/homeassistant/components/tuya/translations/no.json new file mode 100644 index 00000000000..eedf24be696 --- /dev/null +++ b/homeassistant/components/tuya/translations/no.json @@ -0,0 +1,65 @@ +{ + "config": { + "abort": { + "cannot_connect": "Tilkobling mislyktes", + "invalid_auth": "Ugyldig godkjenning", + "single_instance_allowed": "Allerede konfigurert. Bare \u00e9n enkelt konfigurasjon er mulig." + }, + "error": { + "invalid_auth": "Ugyldig godkjenning" + }, + "flow_title": "Tuya konfigurasjon", + "step": { + "user": { + "data": { + "country_code": "Din landskode for kontoen din (f.eks. 1 for USA eller 86 for Kina)", + "password": "Passord", + "platform": "Appen der kontoen din er registrert", + "username": "Brukernavn" + }, + "description": "Angi Tuya-legitimasjonen din.", + "title": "" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Tilkobling mislyktes" + }, + "error": { + "dev_multi_type": "Flere valgte enheter som skal konfigureres, m\u00e5 v\u00e6re av samme type", + "dev_not_config": "Enhetstype kan ikke konfigureres", + "dev_not_found": "Finner ikke enheten" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Lysstyrkeomr\u00e5de som brukes av enheten", + "curr_temp_divider": "N\u00e5v\u00e6rende temperaturverdi (0 = bruk standard)", + "max_kelvin": "Maks fargetemperatur st\u00f8ttet i kelvin", + "max_temp": "Maks m\u00e5ltemperatur (bruk min og maks = 0 for standard)", + "min_kelvin": "Min fargetemperatur st\u00f8ttet i kelvin", + "min_temp": "Min m\u00e5ltemperatur (bruk min og maks = 0 for standard)", + "set_temp_divided": "Bruk delt temperaturverdi for innstilt temperaturkommando", + "support_color": "Tving fargest\u00f8tte", + "temp_divider": "Deler temperaturverdier (0 = bruk standard)", + "temp_step_override": "Trinn for m\u00e5ltemperatur", + "tuya_max_coltemp": "Maks fargetemperatur rapportert av enheten", + "unit_of_measurement": "Temperaturenhet som brukes av enheten" + }, + "description": "Konfigurer alternativer for \u00e5 justere vist informasjon for {device_type} device ` {device_name} `", + "title": "Konfigurere Tuya-enhet" + }, + "init": { + "data": { + "discovery_interval": "Avsp\u00f8rringsintervall for discovery-enheten i l\u00f8pet av sekunder", + "list_devices": "Velg enhetene du vil konfigurere, eller la de v\u00e6re tomme for \u00e5 lagre konfigurasjonen", + "query_device": "Velg enhet som skal bruke sp\u00f8rringsmetode for raskere statusoppdatering", + "query_interval": "Sp\u00f8rringsintervall for intervall i sekunder" + }, + "description": "Ikke angi pollingsintervallverdiene for lave, ellers vil ikke anropene generere feilmelding i loggen", + "title": "Konfigurer Tuya-alternativer" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/pl.json b/homeassistant/components/tuya/translations/pl.json new file mode 100644 index 00000000000..92ced00e733 --- /dev/null +++ b/homeassistant/components/tuya/translations/pl.json @@ -0,0 +1,65 @@ +{ + "config": { + "abort": { + "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia", + "invalid_auth": "Niepoprawne uwierzytelnienie", + "single_instance_allowed": "Ju\u017c skonfigurowano. Mo\u017cliwa jest tylko jedna konfiguracja." + }, + "error": { + "invalid_auth": "Niepoprawne uwierzytelnienie" + }, + "flow_title": "Konfiguracja integracji Tuya", + "step": { + "user": { + "data": { + "country_code": "Kod kraju twojego konta (np. 1 dla USA lub 86 dla Chin)", + "password": "Has\u0142o", + "platform": "Aplikacja, w kt\u00f3rej zarejestrowane jest Twoje konto", + "username": "Nazwa u\u017cytkownika" + }, + "description": "Wprowad\u017a dane uwierzytelniaj\u0105ce", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia" + }, + "error": { + "dev_multi_type": "Wybrane urz\u0105dzenia do skonfigurowania musz\u0105 by\u0107 tego samego typu", + "dev_not_config": "Typ urz\u0105dzenia nie jest konfigurowalny", + "dev_not_found": "Nie znaleziono urz\u0105dzenia" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Zakres jasno\u015bci u\u017cywany przez urz\u0105dzenie", + "curr_temp_divider": "Dzielnik aktualnej warto\u015bci temperatury (0 = u\u017cyj warto\u015bci domy\u015blnej)", + "max_kelvin": "Maksymalna obs\u0142ugiwana temperatura barwy w kelwinach", + "max_temp": "Maksymalna temperatura docelowa (u\u017cyj min i max = 0 dla warto\u015bci domy\u015blnej)", + "min_kelvin": "Minimalna obs\u0142ugiwana temperatura barwy w kelwinach", + "min_temp": "Minimalna temperatura docelowa (u\u017cyj min i max = 0 dla warto\u015bci domy\u015blnej)", + "set_temp_divided": "U\u017cyj podzielonej warto\u015bci temperatury dla polecenia ustawienia temperatury", + "support_color": "Wymu\u015b obs\u0142ug\u0119 kolor\u00f3w", + "temp_divider": "Dzielnik warto\u015bci temperatury (0 = u\u017cyj warto\u015bci domy\u015blnej)", + "temp_step_override": "Krok docelowej temperatury", + "tuya_max_coltemp": "Maksymalna temperatura barwy raportowana przez urz\u0105dzenie", + "unit_of_measurement": "Jednostka temperatury u\u017cywana przez urz\u0105dzenie" + }, + "description": "Skonfiguruj opcje, aby dostosowa\u0107 wy\u015bwietlane informacje dla urz\u0105dzenia {device_type} `{device_name}'", + "title": "Konfiguracja urz\u0105dzenia Tuya" + }, + "init": { + "data": { + "discovery_interval": "Cz\u0119stotliwo\u015b\u0107 skanowania nowych urz\u0105dze\u0144 (w sekundach)", + "list_devices": "Wybierz urz\u0105dzenia do skonfigurowania lub pozostaw puste, aby zapisa\u0107 konfiguracj\u0119", + "query_device": "Wybierz urz\u0105dzenie, kt\u00f3re b\u0119dzie u\u017cywa\u0107 metody odpytywania w celu szybszej aktualizacji statusu", + "query_interval": "Cz\u0119stotliwo\u015b\u0107 skanowania odpytywanego urz\u0105dzenia w sekundach" + }, + "description": "Nie ustawiaj zbyt niskich warto\u015bci skanowania, bo zako\u0144cz\u0105 si\u0119 niepowodzeniem, generuj\u0105c komunikat o b\u0142\u0119dzie w logu", + "title": "Konfiguracja opcji Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/pt-BR.json b/homeassistant/components/tuya/translations/pt-BR.json new file mode 100644 index 00000000000..8dc537e7549 --- /dev/null +++ b/homeassistant/components/tuya/translations/pt-BR.json @@ -0,0 +1,17 @@ +{ + "config": { + "flow_title": "Configura\u00e7\u00e3o Tuya", + "step": { + "user": { + "data": { + "country_code": "O c\u00f3digo do pa\u00eds da sua conta (por exemplo, 1 para os EUA ou 86 para a China)", + "password": "Senha", + "platform": "O aplicativo onde sua conta \u00e9 registrada", + "username": "Nome de usu\u00e1rio" + }, + "description": "Digite sua credencial Tuya.", + "title": "Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/pt.json b/homeassistant/components/tuya/translations/pt.json new file mode 100644 index 00000000000..566746538c0 --- /dev/null +++ b/homeassistant/components/tuya/translations/pt.json @@ -0,0 +1,25 @@ +{ + "config": { + "abort": { + "cannot_connect": "Falha na liga\u00e7\u00e3o", + "invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida", + "single_instance_allowed": "J\u00e1 configurado. Apenas uma \u00fanica configura\u00e7\u00e3o \u00e9 poss\u00edvel." + }, + "error": { + "invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida" + }, + "step": { + "user": { + "data": { + "password": "Palavra-passe", + "username": "Nome de Utilizador" + } + } + } + }, + "options": { + "abort": { + "cannot_connect": "Falha na liga\u00e7\u00e3o" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/ru.json b/homeassistant/components/tuya/translations/ru.json new file mode 100644 index 00000000000..8e00eee568c --- /dev/null +++ b/homeassistant/components/tuya/translations/ru.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e." + }, + "error": { + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438." + }, + "flow_title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Tuya", + "step": { + "login": { + "data": { + "access_id": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0430", + "access_secret": "\u0421\u0435\u043a\u0440\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430", + "country_code": "\u041a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u044b", + "endpoint": "\u0417\u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "tuya_app_type": "\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435", + "username": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c" + }, + "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 Home Assistant \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Tuya.", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "\u041a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u044b \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 (1 \u0434\u043b\u044f \u0421\u0428\u0410 \u0438\u043b\u0438 86 \u0434\u043b\u044f \u041a\u0438\u0442\u0430\u044f)", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "platform": "\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c", + "tuya_project_type": "\u0422\u0438\u043f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Tuya", + "username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" + }, + "description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 Home Assistant \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Tuya.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f." + }, + "error": { + "dev_multi_type": "\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.", + "dev_not_config": "\u0422\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f.", + "dev_not_found": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e." + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u044f\u0440\u043a\u043e\u0441\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c", + "curr_temp_divider": "\u0414\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b (0 = \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)", + "max_kelvin": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u0432 \u043a\u0435\u043b\u044c\u0432\u0438\u043d\u0430\u0445)", + "max_temp": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 min \u0438 max = 0)", + "min_kelvin": "\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u0432 \u043a\u0435\u043b\u044c\u0432\u0438\u043d\u0430\u0445)", + "min_temp": "\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 min \u0438 max = 0)", + "set_temp_divided": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b", + "support_color": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0446\u0432\u0435\u0442\u0430", + "temp_divider": "\u0414\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b (0 = \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e)", + "temp_step_override": "\u0428\u0430\u0433 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b", + "tuya_max_coltemp": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430, \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c\u0430\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c", + "unit_of_measurement": "\u0415\u0434\u0438\u043d\u0438\u0446\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c" + }, + "description": "\u041e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f {device_type} \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 `{device_name}`", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 Tuya" + }, + "init": { + "data": { + "discovery_interval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0440\u043e\u0441\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)", + "list_devices": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", + "query_device": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430", + "query_interval": "\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0440\u043e\u0441\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)" + }, + "description": "\u041d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0438\u0437\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043e\u043f\u0440\u043e\u0441\u0430, \u0438\u043d\u0430\u0447\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435.", + "title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/sl.json b/homeassistant/components/tuya/translations/sl.json new file mode 100644 index 00000000000..b07ad70adac --- /dev/null +++ b/homeassistant/components/tuya/translations/sl.json @@ -0,0 +1,11 @@ +{ + "options": { + "abort": { + "cannot_connect": "Povezovanje ni uspelo." + }, + "error": { + "dev_not_config": "Vrsta naprave ni nastavljiva", + "dev_not_found": "Naprave ni mogo\u010de najti" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/sv.json b/homeassistant/components/tuya/translations/sv.json new file mode 100644 index 00000000000..85cc9c57fd3 --- /dev/null +++ b/homeassistant/components/tuya/translations/sv.json @@ -0,0 +1,17 @@ +{ + "config": { + "flow_title": "Tuya-konfiguration", + "step": { + "user": { + "data": { + "country_code": "Landskod f\u00f6r ditt konto (t.ex. 1 f\u00f6r USA eller 86 f\u00f6r Kina)", + "password": "L\u00f6senord", + "platform": "Appen d\u00e4r ditt konto registreras", + "username": "Anv\u00e4ndarnamn" + }, + "description": "Ange dina Tuya anv\u00e4ndaruppgifter.", + "title": "Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/tr.json b/homeassistant/components/tuya/translations/tr.json new file mode 100644 index 00000000000..2edf3276b6c --- /dev/null +++ b/homeassistant/components/tuya/translations/tr.json @@ -0,0 +1,60 @@ +{ + "config": { + "abort": { + "cannot_connect": "Ba\u011flanma hatas\u0131", + "invalid_auth": "Ge\u00e7ersiz kimlik do\u011frulama", + "single_instance_allowed": "Zaten yap\u0131land\u0131r\u0131lm\u0131\u015f. Yaln\u0131zca tek bir konfig\u00fcrasyon m\u00fcmk\u00fcnd\u00fcr." + }, + "error": { + "invalid_auth": "Ge\u00e7ersiz kimlik do\u011frulama" + }, + "flow_title": "Tuya yap\u0131land\u0131rmas\u0131", + "step": { + "user": { + "data": { + "country_code": "Hesap \u00fclke kodunuz (\u00f6r. ABD i\u00e7in 1 veya \u00c7in i\u00e7in 86)", + "password": "Parola", + "platform": "Hesab\u0131n\u0131z\u0131n kay\u0131tl\u0131 oldu\u011fu uygulama", + "username": "Kullan\u0131c\u0131 Ad\u0131" + }, + "description": "Tuya kimlik bilgilerinizi girin.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Ba\u011flanma hatas\u0131" + }, + "error": { + "dev_not_config": "Cihaz t\u00fcr\u00fc yap\u0131land\u0131r\u0131lamaz", + "dev_not_found": "Cihaz bulunamad\u0131" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Cihaz\u0131n kulland\u0131\u011f\u0131 parlakl\u0131k aral\u0131\u011f\u0131", + "max_temp": "Maksimum hedef s\u0131cakl\u0131k (varsay\u0131lan olarak min ve maks = 0 kullan\u0131n)", + "min_kelvin": "Kelvin destekli min renk s\u0131cakl\u0131\u011f\u0131", + "min_temp": "Minimum hedef s\u0131cakl\u0131k (varsay\u0131lan i\u00e7in min ve maks = 0 kullan\u0131n)", + "support_color": "Vurgu rengi", + "temp_divider": "S\u0131cakl\u0131k de\u011ferleri ay\u0131r\u0131c\u0131 (0 = varsay\u0131lan\u0131 kullan)", + "tuya_max_coltemp": "Cihaz taraf\u0131ndan bildirilen maksimum renk s\u0131cakl\u0131\u011f\u0131", + "unit_of_measurement": "Cihaz\u0131n kulland\u0131\u011f\u0131 s\u0131cakl\u0131k birimi" + }, + "description": "{device_type} ayg\u0131t\u0131 '{device_name}' i\u00e7in g\u00f6r\u00fcnt\u00fclenen bilgileri ayarlamak i\u00e7in se\u00e7enekleri yap\u0131land\u0131r\u0131n", + "title": "Tuya Cihaz\u0131n\u0131 Yap\u0131land\u0131r\u0131n" + }, + "init": { + "data": { + "discovery_interval": "Cihaz\u0131 yoklama aral\u0131\u011f\u0131 saniye cinsinden", + "list_devices": "Yap\u0131land\u0131rmay\u0131 kaydetmek i\u00e7in yap\u0131land\u0131r\u0131lacak veya bo\u015f b\u0131rak\u0131lacak cihazlar\u0131 se\u00e7in", + "query_device": "Daha h\u0131zl\u0131 durum g\u00fcncellemesi i\u00e7in sorgu y\u00f6ntemini kullanacak cihaz\u0131 se\u00e7in", + "query_interval": "Ayg\u0131t yoklama aral\u0131\u011f\u0131 saniye cinsinden" + }, + "description": "Yoklama aral\u0131\u011f\u0131 de\u011ferlerini \u00e7ok d\u00fc\u015f\u00fck ayarlamay\u0131n, aksi takdirde \u00e7a\u011fr\u0131lar g\u00fcnl\u00fckte hata mesaj\u0131 olu\u015fturarak ba\u015far\u0131s\u0131z olur", + "title": "Tuya Se\u00e7eneklerini Konfig\u00fcre Et" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/uk.json b/homeassistant/components/tuya/translations/uk.json new file mode 100644 index 00000000000..1d2709d260a --- /dev/null +++ b/homeassistant/components/tuya/translations/uk.json @@ -0,0 +1,63 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f", + "invalid_auth": "\u041d\u0435\u0432\u0456\u0440\u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u044f.", + "single_instance_allowed": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u041c\u043e\u0436\u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044e." + }, + "error": { + "invalid_auth": "\u041d\u0435\u0432\u0456\u0440\u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u044f." + }, + "flow_title": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f Tuya", + "step": { + "user": { + "data": { + "country_code": "\u041a\u043e\u0434 \u043a\u0440\u0430\u0457\u043d\u0438 \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0443 (1 \u0434\u043b\u044f \u0421\u0428\u0410 \u0430\u0431\u043e 86 \u0434\u043b\u044f \u041a\u0438\u0442\u0430\u044e)", + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "platform": "\u0414\u043e\u0434\u0430\u0442\u043e\u043a, \u0432 \u044f\u043a\u043e\u043c\u0443 \u0437\u0430\u0440\u0435\u0454\u0441\u0442\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u0439 \u0437\u0430\u043f\u0438\u0441", + "username": "\u0406\u043c'\u044f \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430" + }, + "description": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0439\u0442\u0435 Home Assistant \u0434\u043b\u044f \u0456\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 Tuya.", + "title": "Tuya" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f" + }, + "error": { + "dev_multi_type": "\u041a\u0456\u043b\u044c\u043a\u0430 \u043e\u0431\u0440\u0430\u043d\u0438\u0445 \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0457\u0432 \u0434\u043b\u044f \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043f\u043e\u0432\u0438\u043d\u043d\u0456 \u0431\u0443\u0442\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0443.", + "dev_not_config": "\u0422\u0438\u043f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044e \u043d\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f.", + "dev_not_found": "\u041f\u0440\u0438\u0441\u0442\u0440\u0456\u0439 \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e." + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\u0414\u0456\u0430\u043f\u0430\u0437\u043e\u043d \u044f\u0441\u043a\u0440\u0430\u0432\u043e\u0441\u0442\u0456, \u044f\u043a\u0438\u0439 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0454\u043c", + "curr_temp_divider": "\u0414\u0456\u043b\u044c\u043d\u0438\u043a \u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 (0 = \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c)", + "max_kelvin": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0432\u0430\u043d\u0430 \u043a\u043e\u043b\u0456\u0440\u043d\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u0432 \u043a\u0435\u043b\u044c\u0432\u0456\u043d\u0430\u0445)", + "max_temp": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0439\u0442\u0435 min \u0456 max = 0)", + "min_kelvin": "\u041c\u0456\u043d\u0456\u043c\u0430\u043b\u044c\u043d\u0430 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u0443\u0432\u0430\u043d\u0430 \u043a\u043e\u043b\u0456\u0440\u043d\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u0432 \u043a\u0435\u043b\u044c\u0432\u0456\u043d\u0430\u0445)", + "min_temp": "\u041c\u0456\u043d\u0456\u043c\u0430\u043b\u044c\u043d\u0430 \u0446\u0456\u043b\u044c\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 (\u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0439\u0442\u0435 min \u0456 max = 0)", + "support_color": "\u041f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0430 \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0430 \u043a\u043e\u043b\u044c\u043e\u0440\u0443", + "temp_divider": "\u0414\u0456\u043b\u044c\u043d\u0438\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u044c \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438 (0 = \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u0437\u0430 \u0437\u0430\u043c\u043e\u0432\u0447\u0443\u0432\u0430\u043d\u043d\u044f\u043c)", + "tuya_max_coltemp": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u043a\u043e\u043b\u0456\u0440\u043d\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430, \u044f\u043a\u0430 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u044f\u0454\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0454\u043c", + "unit_of_measurement": "\u041e\u0434\u0438\u043d\u0438\u0446\u044f \u0432\u0438\u043c\u0456\u0440\u0443 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0438, \u044f\u043a\u0430 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0454\u043c" + }, + "description": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 \u0434\u043b\u044f \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0457 \u0456\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0456\u0457 \u0434\u043b\u044f {device_type} \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044e '{device_name}'", + "title": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044e Tuya" + }, + "init": { + "data": { + "discovery_interval": "\u0406\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0438\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0438\u044f\u0432\u043b\u0435\u043d\u043d\u044f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044e (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)", + "list_devices": "\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0457 \u0434\u043b\u044f \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0430\u0431\u043e \u0437\u0430\u043b\u0438\u0448\u0442\u0435 \u043f\u043e\u0440\u043e\u0436\u043d\u0456\u043c \u0434\u043b\u044f \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u043d\u044f \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0457", + "query_device": "\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044c \u043f\u0440\u0438\u0441\u0442\u0440\u0456\u0439, \u044f\u043a\u0438\u0439 \u0431\u0443\u0434\u0435 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0438\u0442\u0443 \u0434\u043b\u044f \u0431\u0456\u043b\u044c\u0448 \u0448\u0432\u0438\u0434\u043a\u043e\u0433\u043e \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0443", + "query_interval": "\u0406\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u043f\u0438\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u044e (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)" + }, + "description": "\u041d\u0435 \u0432\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0439\u0442\u0435 \u0437\u0430\u043d\u0430\u0434\u0442\u043e \u043d\u0438\u0437\u044c\u043a\u0456 \u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0456\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 \u043e\u043f\u0438\u0442\u0443\u0432\u0430\u043d\u043d\u044f, \u0456\u043d\u0430\u043a\u0448\u0435 \u0432\u0438\u043a\u043b\u0438\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f \u043f\u0440\u043e \u043f\u043e\u043c\u0438\u043b\u043a\u0443 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0456.", + "title": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f Tuya" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/zh-Hans.json b/homeassistant/components/tuya/translations/zh-Hans.json index e1acb5453aa..ff3887c840d 100644 --- a/homeassistant/components/tuya/translations/zh-Hans.json +++ b/homeassistant/components/tuya/translations/zh-Hans.json @@ -1,29 +1,60 @@ { "config": { - "error": { - "invalid_auth": "身份认证无效" + "abort": { + "cannot_connect": "\u8fde\u63a5\u5931\u8d25", + "invalid_auth": "\u8eab\u4efd\u8ba4\u8bc1\u65e0\u6548", + "single_instance_allowed": "\u5df2\u7ecf\u914d\u7f6e\u8fc7\u4e86\uff0c\u4e14\u53ea\u80fd\u914d\u7f6e\u4e00\u6b21\u3002" }, - "flow_title": "涂鸦配置", + "error": { + "invalid_auth": "\u8eab\u4efd\u8ba4\u8bc1\u65e0\u6548" + }, + "flow_title": "\u6d82\u9e26\u914d\u7f6e", "step": { - "user":{ - "title":"Tuya插件", - "data":{ - "tuya_project_type": "涂鸦云项目类型" - } - }, - "login": { + "user": { "data": { - "endpoint": "可用区域", - "access_id": "Access ID", - "access_secret": "Access Secret", - "tuya_app_type": "移动应用", - "country_code": "国家码", - "username": "账号", - "password": "密码" + "country_code": "\u60a8\u7684\u5e10\u6237\u56fd\u5bb6(\u5730\u533a)\u4ee3\u7801\uff08\u4f8b\u5982\u4e2d\u56fd\u4e3a 86\uff0c\u7f8e\u56fd\u4e3a 1\uff09", + "password": "\u5bc6\u7801", + "platform": "\u60a8\u6ce8\u518c\u5e10\u6237\u7684\u5e94\u7528", + "username": "\u7528\u6237\u540d" }, - "description": "请输入涂鸦账户信息。", - "title": "涂鸦" + "description": "\u8bf7\u8f93\u5165\u6d82\u9e26\u8d26\u6237\u4fe1\u606f\u3002", + "title": "\u6d82\u9e26" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u8fde\u63a5\u5931\u8d25" + }, + "error": { + "dev_multi_type": "\u591a\u4e2a\u8981\u914d\u7f6e\u7684\u8bbe\u5907\u5fc5\u987b\u5177\u6709\u76f8\u540c\u7684\u7c7b\u578b", + "dev_not_config": "\u8bbe\u5907\u7c7b\u578b\u4e0d\u53ef\u914d\u7f6e", + "dev_not_found": "\u672a\u627e\u5230\u8bbe\u5907" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\u8bbe\u5907\u4f7f\u7528\u7684\u4eae\u5ea6\u8303\u56f4", + "max_kelvin": "\u6700\u9ad8\u652f\u6301\u8272\u6e29\uff08\u5f00\u6c0f\uff09", + "max_temp": "\u6700\u9ad8\u76ee\u6807\u6e29\u5ea6\uff08min \u548c max \u4e3a 0 \u65f6\u4f7f\u7528\u9ed8\u8ba4\uff09", + "min_kelvin": "\u6700\u4f4e\u652f\u6301\u8272\u6e29\uff08\u5f00\u6c0f\uff09", + "min_temp": "\u6700\u4f4e\u76ee\u6807\u6e29\u5ea6\uff08min \u548c max \u4e3a 0 \u65f6\u4f7f\u7528\u9ed8\u8ba4\uff09", + "support_color": "\u5f3a\u5236\u652f\u6301\u8c03\u8272", + "tuya_max_coltemp": "\u8bbe\u5907\u62a5\u544a\u7684\u6700\u9ad8\u8272\u6e29", + "unit_of_measurement": "\u8bbe\u5907\u4f7f\u7528\u7684\u6e29\u5ea6\u5355\u4f4d" + }, + "title": "\u914d\u7f6e\u6d82\u9e26\u8bbe\u5907" + }, + "init": { + "data": { + "discovery_interval": "\u53d1\u73b0\u8bbe\u5907\u8f6e\u8be2\u95f4\u9694\uff08\u4ee5\u79d2\u4e3a\u5355\u4f4d\uff09", + "list_devices": "\u8bf7\u9009\u62e9\u8981\u914d\u7f6e\u7684\u8bbe\u5907\uff0c\u6216\u7559\u7a7a\u4ee5\u4fdd\u5b58\u914d\u7f6e", + "query_device": "\u8bf7\u9009\u62e9\u4f7f\u7528\u67e5\u8be2\u65b9\u6cd5\u7684\u8bbe\u5907\uff0c\u4ee5\u4fbf\u66f4\u5feb\u5730\u66f4\u65b0\u72b6\u6001", + "query_interval": "\u67e5\u8be2\u8bbe\u5907\u8f6e\u8be2\u95f4\u9694\uff08\u4ee5\u79d2\u4e3a\u5355\u4f4d\uff09" + }, + "description": "\u8bf7\u4e0d\u8981\u5c06\u8f6e\u8be2\u95f4\u9694\u8bbe\u7f6e\u5f97\u592a\u4f4e\uff0c\u5426\u5219\u5c06\u8c03\u7528\u5931\u8d25\u5e76\u5728\u65e5\u5fd7\u751f\u6210\u9519\u8bef\u6d88\u606f", + "title": "\u914d\u7f6e\u6d82\u9e26\u9009\u9879" } } } -} +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/zh-Hant.json b/homeassistant/components/tuya/translations/zh-Hant.json new file mode 100644 index 00000000000..e747e50d2c7 --- /dev/null +++ b/homeassistant/components/tuya/translations/zh-Hant.json @@ -0,0 +1,79 @@ +{ + "config": { + "abort": { + "cannot_connect": "\u9023\u7dda\u5931\u6557", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "single_instance_allowed": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002" + }, + "error": { + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548" + }, + "flow_title": "Tuya \u8a2d\u5b9a", + "step": { + "login": { + "data": { + "access_id": "Access ID", + "access_secret": "Access Secret", + "country_code": "\u570b\u78bc", + "endpoint": "\u53ef\u7528\u5340\u57df", + "password": "\u5bc6\u78bc", + "tuya_app_type": "\u624b\u6a5f App", + "username": "\u5e33\u865f" + }, + "description": "\u8f38\u5165 Tuya \u6191\u8b49", + "title": "Tuya" + }, + "user": { + "data": { + "country_code": "\u5e33\u865f\u570b\u5bb6\u4ee3\u78bc\uff08\u4f8b\u5982\uff1a\u7f8e\u570b 1 \u6216\u4e2d\u570b 86\uff09", + "password": "\u5bc6\u78bc", + "platform": "\u5e33\u6236\u8a3b\u518a\u6240\u5728\u4f4d\u7f6e", + "tuya_project_type": "Tuya \u96f2\u5c08\u6848\u985e\u578b", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "description": "\u8f38\u5165 Tuya \u6191\u8b49\u3002", + "title": "Tuya \u6574\u5408" + } + } + }, + "options": { + "abort": { + "cannot_connect": "\u9023\u7dda\u5931\u6557" + }, + "error": { + "dev_multi_type": "\u591a\u91cd\u9078\u64c7\u8a2d\u88dd\u7f6e\u4ee5\u8a2d\u5b9a\u4f7f\u7528\u76f8\u540c\u985e\u578b", + "dev_not_config": "\u88dd\u7f6e\u985e\u578b\u7121\u6cd5\u8a2d\u5b9a", + "dev_not_found": "\u627e\u4e0d\u5230\u88dd\u7f6e" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\u88dd\u7f6e\u6240\u4f7f\u7528\u4e4b\u4eae\u5ea6\u7bc4\u570d", + "curr_temp_divider": "\u76ee\u524d\u8272\u6eab\u503c\u5206\u914d\u5668\uff080 = \u4f7f\u7528\u9810\u8a2d\uff09", + "max_kelvin": "Kelvin \u652f\u63f4\u6700\u9ad8\u8272\u6eab", + "max_temp": "\u6700\u9ad8\u76ee\u6a19\u8272\u6eab\uff08\u4f7f\u7528\u6700\u4f4e\u8207\u6700\u9ad8 = 0 \u4f7f\u7528\u9810\u8a2d\uff09", + "min_kelvin": "Kelvin \u652f\u63f4\u6700\u4f4e\u8272\u6eab", + "min_temp": "\u6700\u4f4e\u76ee\u6a19\u8272\u6eab\uff08\u4f7f\u7528\u6700\u4f4e\u8207\u6700\u9ad8 = 0 \u4f7f\u7528\u9810\u8a2d\uff09", + "set_temp_divided": "\u4f7f\u7528\u5206\u9694\u865f\u6eab\u5ea6\u503c\u4ee5\u57f7\u884c\u8a2d\u5b9a\u6eab\u5ea6\u6307\u4ee4", + "support_color": "\u5f37\u5236\u8272\u6eab\u652f\u63f4", + "temp_divider": "\u8272\u6eab\u503c\u5206\u914d\u5668\uff080 = \u4f7f\u7528\u9810\u8a2d\uff09", + "temp_step_override": "\u76ee\u6a19\u6eab\u5ea6\u8a2d\u5b9a", + "tuya_max_coltemp": "\u88dd\u7f6e\u56de\u5831\u6700\u9ad8\u8272\u6eab", + "unit_of_measurement": "\u88dd\u7f6e\u6240\u4f7f\u7528\u4e4b\u6eab\u5ea6\u55ae\u4f4d" + }, + "description": "\u8a2d\u5b9a\u9078\u9805\u4ee5\u8abf\u6574 {device_type} \u88dd\u7f6e `{device_name}` \u986f\u793a\u8cc7\u8a0a", + "title": "\u8a2d\u5b9a Tuya \u88dd\u7f6e" + }, + "init": { + "data": { + "discovery_interval": "\u63a2\u7d22\u88dd\u7f6e\u66f4\u65b0\u79d2\u9593\u8ddd", + "list_devices": "\u9078\u64c7\u88dd\u7f6e\u4ee5\u8a2d\u5b9a\u3001\u6216\u4fdd\u6301\u7a7a\u767d\u4ee5\u5132\u5b58\u8a2d\u5b9a", + "query_device": "\u9078\u64c7\u88dd\u7f6e\u5c07\u4f7f\u7528\u67e5\u8a62\u65b9\u5f0f\u4ee5\u7372\u5f97\u66f4\u5feb\u7684\u72c0\u614b\u66f4\u65b0", + "query_interval": "\u67e5\u8a62\u88dd\u7f6e\u66f4\u65b0\u79d2\u9593\u8ddd" + }, + "description": "\u66f4\u65b0\u9593\u8ddd\u4e0d\u8981\u8a2d\u5b9a\u7684\u904e\u4f4e\u3001\u53ef\u80fd\u6703\u5c0e\u81f4\u65bc\u65e5\u8a8c\u4e2d\u7522\u751f\u932f\u8aa4\u8a0a\u606f", + "title": "\u8a2d\u5b9a Tuya \u9078\u9805" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/twilio/translations/hu.json b/homeassistant/components/twilio/translations/hu.json index cd60890dab3..512296463e4 100644 --- a/homeassistant/components/twilio/translations/hu.json +++ b/homeassistant/components/twilio/translations/hu.json @@ -2,14 +2,14 @@ "config": { "abort": { "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges.", - "webhook_not_internet_accessible": "A Home Assistant rendszerednek el\u00e9rhet\u0151nek kell lennie az internetr\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." + "webhook_not_internet_accessible": "A Home Assistant p\u00e9ld\u00e1ny\u00e1nak el\u00e9rhet\u0151nek kell lennie az internet fel\u0151l a webhook \u00fczenetek fogad\u00e1s\u00e1hoz." }, "create_entry": { - "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a [Webhooks Twilio-val]({twilio_url}) alkalmaz\u00e1st. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/x-www-form-urlencoded \n\n L\u00e1sd [a dokument\u00e1ci\u00f3]({docs_url}), hogyan konfigur\u00e1lhatja az automatiz\u00e1l\u00e1sokat a bej\u00f6v\u0151 adatok kezel\u00e9s\u00e9re." + "default": "Ha esem\u00e9nyeket szeretne k\u00fcldeni a Home Assistant alkalmaz\u00e1snak, be kell \u00e1ll\u00edtania a [Webhooks Twilio-val]({twilio_url}) alkalmaz\u00e1st. \n\n T\u00f6ltse ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat: \n\n - URL: `{webhook_url}`\n - M\u00f3dszer: POST\n - Tartalom t\u00edpusa: application/x-www-form-urlencoded \n\n L\u00e1sd [a dokument\u00e1ci\u00f3]({docs_url}), hogyan konfigur\u00e1lhatja az automatizmusokat a bej\u00f6v\u0151 adatok kezel\u00e9s\u00e9re." }, "step": { "user": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?", + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?", "title": "A Twilio Webhook be\u00e1ll\u00edt\u00e1sa" } } diff --git a/homeassistant/components/twilio/translations/nl.json b/homeassistant/components/twilio/translations/nl.json index 0d5d33a727e..3d31175d2de 100644 --- a/homeassistant/components/twilio/translations/nl.json +++ b/homeassistant/components/twilio/translations/nl.json @@ -9,7 +9,7 @@ }, "step": { "user": { - "description": "Wil je beginnen met instellen?", + "description": "Wilt u beginnen met instellen?", "title": "Stel de Twilio Webhook in" } } diff --git a/homeassistant/components/twinkly/translations/hu.json b/homeassistant/components/twinkly/translations/hu.json index d5cd872bbd0..9c5137c30a4 100644 --- a/homeassistant/components/twinkly/translations/hu.json +++ b/homeassistant/components/twinkly/translations/hu.json @@ -9,7 +9,7 @@ "step": { "user": { "data": { - "host": "A Twinkly eszk\u00f6z gazdag\u00e9pe (vagy IP-c\u00edme)" + "host": "A Twinkly eszk\u00f6z c\u00edme" }, "description": "\u00c1ll\u00edtsa be a Twinkly led-karakterl\u00e1nc\u00e1t", "title": "Twinkly" diff --git a/homeassistant/components/unifi/translations/hu.json b/homeassistant/components/unifi/translations/hu.json index 22904c8ec7b..9564b211043 100644 --- a/homeassistant/components/unifi/translations/hu.json +++ b/homeassistant/components/unifi/translations/hu.json @@ -14,10 +14,10 @@ "step": { "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "password": "Jelsz\u00f3", "port": "Port", - "site": "Site azonos\u00edt\u00f3", + "site": "Hely azonos\u00edt\u00f3", "username": "Felhaszn\u00e1l\u00f3n\u00e9v", "verify_ssl": "SSL-tan\u00fas\u00edtv\u00e1ny ellen\u0151rz\u00e9se" }, @@ -31,10 +31,10 @@ "data": { "block_client": "H\u00e1l\u00f3zathozz\u00e1f\u00e9r\u00e9s vez\u00e9relt \u00fcgyfelek", "dpi_restrictions": "Enged\u00e9lyezze a DPI restrikci\u00f3s csoportok vez\u00e9rl\u00e9s\u00e9t", - "poe_clients": "Enged\u00e9lyezze az \u00fcgyfelek POE-vez\u00e9rl\u00e9s\u00e9t" + "poe_clients": "Enged\u00e9lyezze a POE-vez\u00e9rl\u00e9s\u00e9t" }, "description": "Konfigur\u00e1lja a klienseket\n\n Hozzon l\u00e9tre kapcsol\u00f3kat azokhoz a sorsz\u00e1mokhoz, amelyeknek vez\u00e9relni k\u00edv\u00e1nja a h\u00e1l\u00f3zati hozz\u00e1f\u00e9r\u00e9st.", - "title": "UniFi lehet\u0151s\u00e9gek 2/3" + "title": "UniFi be\u00e1ll\u00edt\u00e1sok 2/3" }, "device_tracker": { "data": { @@ -46,7 +46,7 @@ "track_wired_clients": "Vegyen fel vezet\u00e9kes h\u00e1l\u00f3zati \u00fcgyfeleket" }, "description": "Eszk\u00f6zk\u00f6vet\u00e9s konfigur\u00e1l\u00e1sa", - "title": "UniFi lehet\u0151s\u00e9gek 1/3" + "title": "UniFi be\u00e1ll\u00edt\u00e1sok 1/3" }, "init": { "data": { @@ -64,11 +64,11 @@ }, "statistics_sensors": { "data": { - "allow_bandwidth_sensors": "S\u00e1vsz\u00e9less\u00e9g-haszn\u00e1lati \u00e9rz\u00e9kel\u0151k l\u00e9trehoz\u00e1sa a h\u00e1l\u00f3zati \u00fcgyfelek sz\u00e1m\u00e1ra", + "allow_bandwidth_sensors": "Kliensenk\u00e9nti s\u00e1vsz\u00e9less\u00e9g-haszn\u00e1lati \u00e9rz\u00e9kel\u0151k l\u00e9trehoz\u00e1sa", "allow_uptime_sensors": "\u00dczemid\u0151-\u00e9rz\u00e9kel\u0151k h\u00e1l\u00f3zati \u00fcgyfelek sz\u00e1m\u00e1ra" }, "description": "Statisztikai \u00e9rz\u00e9kel\u0151k konfigur\u00e1l\u00e1sa", - "title": "UniFi lehet\u0151s\u00e9gek 3/3" + "title": "UniFi be\u00e1ll\u00edt\u00e1sok 3/3" } } } diff --git a/homeassistant/components/unifi/translations/id.json b/homeassistant/components/unifi/translations/id.json index 7a707b28aa0..ec023fa7363 100644 --- a/homeassistant/components/unifi/translations/id.json +++ b/homeassistant/components/unifi/translations/id.json @@ -10,7 +10,7 @@ "service_unavailable": "Gagal terhubung", "unknown_client_mac": "Tidak ada klien yang tersedia di alamat MAC tersebut" }, - "flow_title": "UniFi Network {site} ({host})", + "flow_title": "{site} ({host})", "step": { "user": { "data": { diff --git a/homeassistant/components/unifi/translations/ru.json b/homeassistant/components/unifi/translations/ru.json index 8a34f9fc17e..a2c9bfe8061 100644 --- a/homeassistant/components/unifi/translations/ru.json +++ b/homeassistant/components/unifi/translations/ru.json @@ -38,7 +38,7 @@ }, "device_tracker": { "data": { - "detection_time": "\u0412\u0440\u0435\u043c\u044f \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c (\u0441\u0435\u043a.), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \"\u041d\u0435 \u0434\u043e\u043c\u0430\".", + "detection_time": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445), \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0434\u043e\u043c\u0430", "ignore_wired_bug": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f \u043d\u0435 \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 UniFi", "ssid_filter": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 SSID \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0441\u043f\u0440\u043e\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432", "track_clients": "\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0441\u0435\u0442\u0438", diff --git a/homeassistant/components/updater/translations/hu.json b/homeassistant/components/updater/translations/hu.json index 52b2c972559..e862dcb360c 100644 --- a/homeassistant/components/updater/translations/hu.json +++ b/homeassistant/components/updater/translations/hu.json @@ -1,3 +1,3 @@ { - "title": "Friss\u00edt\u00e9sek" + "title": "Friss\u00edt\u0151" } \ No newline at end of file diff --git a/homeassistant/components/upnp/translations/fi.json b/homeassistant/components/upnp/translations/fi.json index dcd927ffd24..aaf44e6c730 100644 --- a/homeassistant/components/upnp/translations/fi.json +++ b/homeassistant/components/upnp/translations/fi.json @@ -1,5 +1,8 @@ { "config": { + "abort": { + "already_configured": "Laite on jo m\u00e4\u00e4ritetty" + }, "step": { "user": { "data": { diff --git a/homeassistant/components/upnp/translations/hu.json b/homeassistant/components/upnp/translations/hu.json index 8ef3ff8dcc0..46c6bd2de1f 100644 --- a/homeassistant/components/upnp/translations/hu.json +++ b/homeassistant/components/upnp/translations/hu.json @@ -13,7 +13,7 @@ "step": { "init": { "one": "\u00dcres", - "other": "" + "other": "\u00dcres" }, "ssdp_confirm": { "description": "Szeretn\u00e9 be\u00e1ll\u00edtani ezt az UPnP/IGD eszk\u00f6zt?" diff --git a/homeassistant/components/upnp/translations/id.json b/homeassistant/components/upnp/translations/id.json index 3a953ba62a9..f70fca145e8 100644 --- a/homeassistant/components/upnp/translations/id.json +++ b/homeassistant/components/upnp/translations/id.json @@ -5,7 +5,7 @@ "incomplete_discovery": "Proses penemuan tidak selesai", "no_devices_found": "Tidak ada perangkat yang ditemukan di jaringan" }, - "flow_title": "UPnP/IGD: {name}", + "flow_title": "{name}", "step": { "ssdp_confirm": { "description": "Ingin menyiapkan perangkat UPnP/IGD ini?" diff --git a/homeassistant/components/uptimerobot/translations/ca.json b/homeassistant/components/uptimerobot/translations/ca.json index a3bccb98295..b845e271666 100644 --- a/homeassistant/components/uptimerobot/translations/ca.json +++ b/homeassistant/components/uptimerobot/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_failed_existing": "No s'ha pogut actualitzar l'entrada de configuraci\u00f3, elimina la integraci\u00f3 i torna-la a instal\u00b7lar.", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament", "unknown": "Error inesperat" diff --git a/homeassistant/components/uptimerobot/translations/es.json b/homeassistant/components/uptimerobot/translations/es.json index 1f04109611f..455c96cd644 100644 --- a/homeassistant/components/uptimerobot/translations/es.json +++ b/homeassistant/components/uptimerobot/translations/es.json @@ -1,16 +1,16 @@ { "config": { "abort": { - "already_configured": "La cuenta ya est\u00e1 configurada", + "already_configured": "La cuenta ya ha sido configurada", "reauth_failed_existing": "No se pudo actualizar la entrada de configuraci\u00f3n, elimine la integraci\u00f3n y config\u00farela nuevamente.", - "reauth_successful": "La reautenticaci\u00f3n fue exitosa", - "unknown": "Error desconocido" + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente", + "unknown": "Error inesperado" }, "error": { "cannot_connect": "No se pudo conectar", - "invalid_api_key": "Clave de la API err\u00f3nea", + "invalid_api_key": "Clave API no v\u00e1lida", "reauth_failed_matching_account": "La clave de API que has proporcionado no coincide con el ID de cuenta para la configuraci\u00f3n existente.", - "unknown": "Error desconocido" + "unknown": "Error inesperado" }, "step": { "reauth_confirm": { @@ -22,7 +22,7 @@ }, "user": { "data": { - "api_key": "Clave de la API" + "api_key": "Clave API" }, "description": "Debes proporcionar una clave API de solo lectura de robot de tiempo de actividad/funcionamiento" } diff --git a/homeassistant/components/uptimerobot/translations/id.json b/homeassistant/components/uptimerobot/translations/id.json new file mode 100644 index 00000000000..e107b1fcac6 --- /dev/null +++ b/homeassistant/components/uptimerobot/translations/id.json @@ -0,0 +1,26 @@ +{ + "config": { + "abort": { + "reauth_successful": "Autentikasi ulang berhasil", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_api_key": "Kunci API tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "reauth_confirm": { + "data": { + "api_key": "Kunci API" + }, + "title": "Autentikasi Ulang Integrasi" + }, + "user": { + "data": { + "api_key": "Kunci API" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/vera/translations/hu.json b/homeassistant/components/vera/translations/hu.json index 1f1e22b9ed8..4e9639b0258 100644 --- a/homeassistant/components/vera/translations/hu.json +++ b/homeassistant/components/vera/translations/hu.json @@ -1,16 +1,16 @@ { "config": { "abort": { - "cannot_connect": "Nem siker\u00fclt csatlakozni a {base_url}" + "cannot_connect": "Nem siker\u00fclt csatlakozni: {base_url}" }, "step": { "user": { "data": { - "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa a HomeAssistantb\u00f3l.", - "lights": "A Vera kapcsol\u00f3eszk\u00f6z-azonos\u00edt\u00f3k f\u00e9nyk\u00e9nt kezelhet\u0151k a HomeAssistant alkalmaz\u00e1sban.", + "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa Home Assistant-b\u00f3l.", + "lights": "A Vera kapcsol\u00f3eszk\u00f6z-azonos\u00edt\u00f3k f\u00e9nyk\u00e9nt kezelhet\u0151k a Home Assistant alkalmaz\u00e1sban.", "vera_controller_url": "Vez\u00e9rl\u0151 URL" }, - "description": "Adja meg a Vera vez\u00e9rl\u0151 URL-j\u00e9t al\u00e1bb. Ennek \u00edgy kell kin\u00e9znie: http://192.168.1.161:3480.", + "description": "Adja meg a Vera vez\u00e9rl\u0151 URL-j\u00e9t al\u00e1bb. Hasonl\u00f3k\u00e9ppen kell kin\u00e9znie: http://192.168.1.161:3480.", "title": "Vera vez\u00e9rl\u0151 be\u00e1ll\u00edt\u00e1sa" } } @@ -19,8 +19,8 @@ "step": { "init": { "data": { - "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa a HomeAssistantb\u00f3l.", - "lights": "A Vera kapcsol\u00f3eszk\u00f6z-azonos\u00edt\u00f3k f\u00e9nyk\u00e9nt kezelhet\u0151k a HomeAssistant alkalmaz\u00e1sban." + "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa Home Assistant-b\u00f3l.", + "lights": "A Vera kapcsol\u00f3eszk\u00f6z-azonos\u00edt\u00f3k f\u00e9nyk\u00e9nt kezelhet\u0151k a Home Assistant alkalmaz\u00e1sban." }, "description": "Az opcion\u00e1lis param\u00e9terekr\u0151l a vera dokument\u00e1ci\u00f3j\u00e1ban olvashat: https://www.home-assistant.io/integrations/vera/. Megjegyz\u00e9s: Az itt v\u00e9grehajtott v\u00e1ltoztat\u00e1sokhoz \u00fajra kell ind\u00edtani a h\u00e1zi asszisztens szervert. Az \u00e9rt\u00e9kek t\u00f6rl\u00e9s\u00e9hez adjon meg egy sz\u00f3k\u00f6zt.", "title": "Vera vez\u00e9rl\u0151 opci\u00f3k" diff --git a/homeassistant/components/verisure/translations/ca.json b/homeassistant/components/verisure/translations/ca.json index 0ddcf9513f4..c27943b35f3 100644 --- a/homeassistant/components/verisure/translations/ca.json +++ b/homeassistant/components/verisure/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat", + "already_configured": "El compte ja est\u00e0 configurat", "reauth_successful": "Re-autenticaci\u00f3 realitzada correctament" }, "error": { diff --git a/homeassistant/components/verisure/translations/hu.json b/homeassistant/components/verisure/translations/hu.json index f071872b81c..89ff19bd1fe 100644 --- a/homeassistant/components/verisure/translations/hu.json +++ b/homeassistant/components/verisure/translations/hu.json @@ -13,7 +13,7 @@ "data": { "giid": "Telep\u00edt\u00e9s" }, - "description": "A Home Assistant t\u00f6bb Verisure telep\u00edt\u00e9st tal\u00e1lt a Saj\u00e1t oldalak fi\u00f3kodban. K\u00e9rj\u00fck, v\u00e1lassza ki azt a telep\u00edt\u00e9st, amelyet hozz\u00e1 k\u00edv\u00e1n adni a Home Assistant programhoz." + "description": "Home Assistant t\u00f6bb Verisure telep\u00edt\u00e9st tal\u00e1lt a Saj\u00e1t oldalak fi\u00f3kj\u00e1ban. K\u00e9rj\u00fck, v\u00e1lassza ki azt a telep\u00edt\u00e9st, amelyet hozz\u00e1 k\u00edv\u00e1nja adni a Home Assistant p\u00e9ld\u00e1ny\u00e1hoz." }, "reauth_confirm": { "data": { diff --git a/homeassistant/components/vilfo/translations/hu.json b/homeassistant/components/vilfo/translations/hu.json index 4e2ab47a476..157a6cdbabd 100644 --- a/homeassistant/components/vilfo/translations/hu.json +++ b/homeassistant/components/vilfo/translations/hu.json @@ -12,7 +12,7 @@ "user": { "data": { "access_token": "Hozz\u00e1f\u00e9r\u00e9si token", - "host": "Hoszt" + "host": "C\u00edm" }, "description": "\u00c1ll\u00edtsa be a Vilfo Router integr\u00e1ci\u00f3t. Sz\u00fcks\u00e9ge van a Vilfo Router gazdag\u00e9pnev\u00e9re/IP -c\u00edm\u00e9re \u00e9s egy API hozz\u00e1f\u00e9r\u00e9si jogkivonatra. Ha tov\u00e1bbi inform\u00e1ci\u00f3ra van sz\u00fcks\u00e9ge az integr\u00e1ci\u00f3r\u00f3l \u00e9s a r\u00e9szletekr\u0151l, l\u00e1togasson el a k\u00f6vetkez\u0151 webhelyre: https://www.home-assistant.io/integrations/vilfo", "title": "Csatlakoz\u00e1s a Vilfo routerhez" diff --git a/homeassistant/components/vizio/translations/hu.json b/homeassistant/components/vizio/translations/hu.json index edc91cdb31c..3708bfbc379 100644 --- a/homeassistant/components/vizio/translations/hu.json +++ b/homeassistant/components/vizio/translations/hu.json @@ -19,18 +19,18 @@ "title": "V\u00e9gezze el a p\u00e1ros\u00edt\u00e1si folyamatot" }, "pairing_complete": { - "description": "A VIZIO SmartCast Eszk\u00f6z mostant\u00f3l csatlakozik a Home Assistant-hoz.", + "description": "A VIZIO SmartCast Eszk\u00f6z mostant\u00f3l csatlakozik Home Assistant-hoz.", "title": "P\u00e1ros\u00edt\u00e1s k\u00e9sz" }, "pairing_complete_import": { - "description": "A VIZIO SmartCast Eszk\u00f6z mostant\u00f3l csatlakozik a Home Assistant szolg\u00e1ltat\u00e1shoz. \n\n A Hozz\u00e1f\u00e9r\u00e9si token a \u201e** {access_token} **\u201d.", + "description": "A VIZIO SmartCast Eszk\u00f6z mostant\u00f3l csatlakozik a Home Assistant szolg\u00e1ltat\u00e1shoz. \n\nA Hozz\u00e1f\u00e9r\u00e9si token a `**{access_token}**`.", "title": "P\u00e1ros\u00edt\u00e1s k\u00e9sz" }, "user": { "data": { "access_token": "Hozz\u00e1f\u00e9r\u00e9si token", "device_class": "Eszk\u00f6zt\u00edpus", - "host": "Hoszt", + "host": "C\u00edm", "name": "N\u00e9v" }, "description": "A Hozz\u00e1f\u00e9r\u00e9si token csak t\u00e9v\u00e9khez sz\u00fcks\u00e9ges. Ha TV -t konfigur\u00e1l, \u00e9s m\u00e9g nincs Hozz\u00e1f\u00e9r\u00e9si token , hagyja \u00fcresen a p\u00e1ros\u00edt\u00e1si folyamathoz.", diff --git a/homeassistant/components/volumio/translations/hu.json b/homeassistant/components/volumio/translations/hu.json index e58f0666039..209a892af3d 100644 --- a/homeassistant/components/volumio/translations/hu.json +++ b/homeassistant/components/volumio/translations/hu.json @@ -10,12 +10,12 @@ }, "step": { "discovery_confirm": { - "description": "Szeretn\u00e9d hozz\u00e1adni a Volumio (`{name}`)-t a Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni a Volumio (`{name}`)-t a Home Assistant-hoz?", "title": "Felfedezett Volumio" }, "user": { "data": { - "host": "Hoszt", + "host": "C\u00edm", "port": "Port" } } diff --git a/homeassistant/components/wallbox/translations/es.json b/homeassistant/components/wallbox/translations/es.json index 2b22ece4860..1252e5eaca1 100644 --- a/homeassistant/components/wallbox/translations/es.json +++ b/homeassistant/components/wallbox/translations/es.json @@ -1,13 +1,19 @@ { "config": { + "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado" + }, "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", "unknown": "Error inesperado" }, "step": { "user": { "data": { "password": "Contrase\u00f1a", - "station": "N\u00famero de serie de la estaci\u00f3n" + "station": "N\u00famero de serie de la estaci\u00f3n", + "username": "Usuario" } } } diff --git a/homeassistant/components/wallbox/translations/id.json b/homeassistant/components/wallbox/translations/id.json index 8fa55e63051..becbcbe817f 100644 --- a/homeassistant/components/wallbox/translations/id.json +++ b/homeassistant/components/wallbox/translations/id.json @@ -11,9 +11,11 @@ "step": { "user": { "data": { - "password": "Kata Sandi" + "password": "Kata Sandi", + "username": "Nama Pengguna" } } } - } + }, + "title": "Wallbox" } \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/ca.json b/homeassistant/components/watttime/translations/ca.json new file mode 100644 index 00000000000..09a0360fab3 --- /dev/null +++ b/homeassistant/components/watttime/translations/ca.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat" + }, + "error": { + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat", + "unknown_coordinates": "No hi ha dades de latitud/longitud" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Latitud", + "longitude": "Longitud" + }, + "description": "Introdueix la latitud i la longitud a monitoritzar:" + }, + "location": { + "data": { + "location_type": "Ubicaci\u00f3" + }, + "description": "Tria una ubicaci\u00f3 a monitoritzar:" + }, + "user": { + "data": { + "password": "Contrasenya", + "username": "Nom d'usuari" + }, + "description": "Introdueix el nom d'usuari i contrasenya:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/cs.json b/homeassistant/components/watttime/translations/cs.json new file mode 100644 index 00000000000..b4df21bd3a1 --- /dev/null +++ b/homeassistant/components/watttime/translations/cs.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "Za\u0159\u00edzen\u00ed je ji\u017e nastaveno" + }, + "error": { + "invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed", + "unknown": "Neo\u010dek\u00e1van\u00e1 chyba" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Zem\u011bpisn\u00e1 \u0161\u00ed\u0159ka", + "longitude": "Zem\u011bpisn\u00e1 d\u00e9lka" + } + }, + "location": { + "data": { + "location_type": "Um\u00edst\u011bn\u00ed" + } + }, + "user": { + "data": { + "password": "Heslo", + "username": "U\u017eivatelsk\u00e9 jm\u00e9no" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/de.json b/homeassistant/components/watttime/translations/de.json new file mode 100644 index 00000000000..c6bf9641c13 --- /dev/null +++ b/homeassistant/components/watttime/translations/de.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert" + }, + "error": { + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler", + "unknown_coordinates": "Keine Daten f\u00fcr Breitengrad/L\u00e4ngengrad" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Breitengrad", + "longitude": "L\u00e4ngengrad" + }, + "description": "Gib den zu \u00fcberwachenden Breitengrad und L\u00e4ngengrad ein:" + }, + "location": { + "data": { + "location_type": "Standort" + }, + "description": "W\u00e4hle einen Standort f\u00fcr die \u00dcberwachung:" + }, + "user": { + "data": { + "password": "Passwort", + "username": "Benutzername" + }, + "description": "Gib deinen Benutzernamen und dein Passwort ein:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/es.json b/homeassistant/components/watttime/translations/es.json new file mode 100644 index 00000000000..922aed60d97 --- /dev/null +++ b/homeassistant/components/watttime/translations/es.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositivo ya se ha configurado" + }, + "error": { + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado", + "unknown_coordinates": "No hay datos para esa latitud/longitud" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Latitud", + "longitude": "Longitud" + }, + "description": "Introduzca la latitud y longitud a monitorizar:" + }, + "location": { + "data": { + "location_type": "Ubicaci\u00f3n" + }, + "description": "Escoja una ubicaci\u00f3n para monitorizar:" + }, + "user": { + "data": { + "password": "Contrase\u00f1a", + "username": "Nombre de usuario" + }, + "description": "Introduzca su nombre de usuario y contrase\u00f1a:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/et.json b/homeassistant/components/watttime/translations/et.json new file mode 100644 index 00000000000..c9f47756021 --- /dev/null +++ b/homeassistant/components/watttime/translations/et.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud" + }, + "error": { + "invalid_auth": "Tuvastamine nurjus", + "unknown": "Ootamatu t\u00f5rge", + "unknown_coordinates": "Laius- ja/v\u00f5i pikkuskraadi andmed puuduvad" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Laiuskraad", + "longitude": "Pikkuskraad" + }, + "description": "Sisesta j\u00e4lgitav laius- ja pikkuskraad:" + }, + "location": { + "data": { + "location_type": "Asukoht" + }, + "description": "Vali j\u00e4lgiv asukoht:" + }, + "user": { + "data": { + "password": "Salas\u00f5na", + "username": "Kasutajanimi" + }, + "description": "Sisesta oma kasutajanimi ja salas\u00f5na:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/he.json b/homeassistant/components/watttime/translations/he.json new file mode 100644 index 00000000000..bbc82f5fa86 --- /dev/null +++ b/homeassistant/components/watttime/translations/he.json @@ -0,0 +1,30 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "error": { + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "step": { + "coordinates": { + "data": { + "latitude": "\u05e7\u05d5 \u05e8\u05d5\u05d7\u05d1", + "longitude": "\u05e7\u05d5 \u05d0\u05d5\u05e8\u05da" + } + }, + "location": { + "data": { + "location_type": "\u05de\u05d9\u05e7\u05d5\u05dd" + } + }, + "user": { + "data": { + "password": "\u05e1\u05d9\u05e1\u05de\u05d4", + "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/hu.json b/homeassistant/components/watttime/translations/hu.json new file mode 100644 index 00000000000..a106416f4b9 --- /dev/null +++ b/homeassistant/components/watttime/translations/hu.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van" + }, + "error": { + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt", + "unknown_coordinates": "Nincs adat a megadott sz\u00e9less\u00e9g/hossz\u00fas\u00e1g vonatkoz\u00e1s\u00e1ban" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Sz\u00e9less\u00e9g", + "longitude": "Hossz\u00fas\u00e1g" + }, + "description": "Adja meg a sz\u00e9less\u00e9gi \u00e9s a hossz\u00fas\u00e1gi fokot a monitoroz\u00e1shoz:" + }, + "location": { + "data": { + "location_type": "Elhelyezked\u00e9s" + }, + "description": "V\u00e1lasszon egy helyet a monitoroz\u00e1shoz:" + }, + "user": { + "data": { + "password": "Jelsz\u00f3", + "username": "Felhaszn\u00e1l\u00f3n\u00e9v" + }, + "description": "Adja meg felhaszn\u00e1l\u00f3nev\u00e9t \u00e9s jelszav\u00e1t:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/id.json b/homeassistant/components/watttime/translations/id.json new file mode 100644 index 00000000000..2549bd6f4ff --- /dev/null +++ b/homeassistant/components/watttime/translations/id.json @@ -0,0 +1,26 @@ +{ + "config": { + "step": { + "coordinates": { + "data": { + "latitude": "Lintang", + "longitude": "Bujur" + }, + "description": "Masukkan lintang dan bujur untuk dipantau:" + }, + "location": { + "data": { + "location_type": "Lokasi" + }, + "description": "Pilih lokasi untuk dipantau:" + }, + "user": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + }, + "description": "Masukkan nama pengguna dan kata sandi Anda:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/it.json b/homeassistant/components/watttime/translations/it.json new file mode 100644 index 00000000000..40f41c1d046 --- /dev/null +++ b/homeassistant/components/watttime/translations/it.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato" + }, + "error": { + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto", + "unknown_coordinates": "Nessun dato per latitudine/longitudine" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Latitudine", + "longitude": "Logitudine" + }, + "description": "Immettere la latitudine e la longitudine da monitorare:" + }, + "location": { + "data": { + "location_type": "Posizione" + }, + "description": "Scegli una posizione da monitorare:" + }, + "user": { + "data": { + "password": "Password", + "username": "Nome utente" + }, + "description": "Inserisci il tuo nome utente e password:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/nl.json b/homeassistant/components/watttime/translations/nl.json new file mode 100644 index 00000000000..f6776744cbb --- /dev/null +++ b/homeassistant/components/watttime/translations/nl.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Apparaat is al geconfigureerd" + }, + "error": { + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout", + "unknown_coordinates": "Geen gegevens voor lengte-/breedtegraad" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Breedtegraad", + "longitude": "Lengtegraad" + }, + "description": "Voer de breedtegraad en de lengtegraad in die u wilt monitoren:" + }, + "location": { + "data": { + "location_type": "Locatie" + }, + "description": "Kies een locatie om te monitoren:" + }, + "user": { + "data": { + "password": "Wachtwoord", + "username": "Gebruikersnaam" + }, + "description": "Voer uw gebruikersnaam en wachtwoord in:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/no.json b/homeassistant/components/watttime/translations/no.json new file mode 100644 index 00000000000..a58a29ff052 --- /dev/null +++ b/homeassistant/components/watttime/translations/no.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert" + }, + "error": { + "invalid_auth": "Ugyldig godkjenning", + "unknown": "Uventet feil", + "unknown_coordinates": "Ingen data for breddegrad/lengdegrad" + }, + "step": { + "coordinates": { + "data": { + "latitude": "Breddegrad", + "longitude": "Lengdegrad" + }, + "description": "Skriv inn breddegrad og lengdegrad som skal overv\u00e5kes:" + }, + "location": { + "data": { + "location_type": "Plassering" + }, + "description": "Velg et sted \u00e5 overv\u00e5ke:" + }, + "user": { + "data": { + "password": "Passord", + "username": "Brukernavn" + }, + "description": "Skriv inn brukernavn og passord:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/ru.json b/homeassistant/components/watttime/translations/ru.json new file mode 100644 index 00000000000..d7e67187d9d --- /dev/null +++ b/homeassistant/components/watttime/translations/ru.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant." + }, + "error": { + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430.", + "unknown_coordinates": "\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0448\u0438\u0440\u043e\u0442\u0435 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0435." + }, + "step": { + "coordinates": { + "data": { + "latitude": "\u0428\u0438\u0440\u043e\u0442\u0430", + "longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0448\u0438\u0440\u043e\u0442\u0443 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0443 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430:" + }, + "location": { + "data": { + "location_type": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435" + }, + "description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430:" + }, + "user": { + "data": { + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" + }, + "description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c:" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/watttime/translations/zh-Hant.json b/homeassistant/components/watttime/translations/zh-Hant.json new file mode 100644 index 00000000000..898dfc05dd7 --- /dev/null +++ b/homeassistant/components/watttime/translations/zh-Hant.json @@ -0,0 +1,34 @@ +{ + "config": { + "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210" + }, + "error": { + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4", + "unknown_coordinates": "\u6c92\u6709\u7d93\u5ea6/\u7def\u5ea6\u8cc7\u6599" + }, + "step": { + "coordinates": { + "data": { + "latitude": "\u7def\u5ea6", + "longitude": "\u7d93\u5ea6" + }, + "description": "\u8f38\u5165\u6240\u8981\u76e3\u63a7\u7684\u7d93\u5ea6\u8207\u7def\u5ea6\uff1a" + }, + "location": { + "data": { + "location_type": "\u5ea7\u6a19" + }, + "description": "\u9078\u64c7\u6240\u8981\u76e3\u63a7\u7684\u4f4d\u7f6e\uff1a" + }, + "user": { + "data": { + "password": "\u5bc6\u78bc", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + }, + "description": "\u8f38\u5165\u4f7f\u7528\u8005\u540d\u7a31\u8207\u5bc6\u78bc\uff1a" + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/waze_travel_time/translations/id.json b/homeassistant/components/waze_travel_time/translations/id.json index 587e959fe7e..3f3cd02aaf6 100644 --- a/homeassistant/components/waze_travel_time/translations/id.json +++ b/homeassistant/components/waze_travel_time/translations/id.json @@ -10,6 +10,7 @@ "user": { "data": { "destination": "Tujuan", + "name": "Nama", "origin": "Asal", "region": "Wilayah" }, diff --git a/homeassistant/components/wemo/translations/hu.json b/homeassistant/components/wemo/translations/hu.json index ff9f4dc5f75..f27d566ceb9 100644 --- a/homeassistant/components/wemo/translations/hu.json +++ b/homeassistant/components/wemo/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Wemo-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Wemo-t?" } } }, diff --git a/homeassistant/components/wemo/translations/id.json b/homeassistant/components/wemo/translations/id.json index af0b3128cb9..831b0822f64 100644 --- a/homeassistant/components/wemo/translations/id.json +++ b/homeassistant/components/wemo/translations/id.json @@ -9,5 +9,10 @@ "description": "Ingin menyiapkan Wemo?" } } + }, + "device_automation": { + "trigger_type": { + "long_press": "Tombol Wemo ditekan selama 2 detik" + } } } \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/ca.json b/homeassistant/components/whirlpool/translations/ca.json new file mode 100644 index 00000000000..f844476e4c6 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/ca.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3", + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "unknown": "Error inesperat" + }, + "step": { + "user": { + "data": { + "password": "Contrasenya", + "username": "Nom d'usuari" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/cs.json b/homeassistant/components/whirlpool/translations/cs.json new file mode 100644 index 00000000000..c0841233cb7 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/cs.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit", + "invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed", + "unknown": "Neo\u010dek\u00e1van\u00e1 chyba" + }, + "step": { + "user": { + "data": { + "password": "Heslo", + "username": "U\u017eivatelsk\u00e9 jm\u00e9no" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/de.json b/homeassistant/components/whirlpool/translations/de.json new file mode 100644 index 00000000000..57f62e0da32 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/de.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "unknown": "Unerwarteter Fehler" + }, + "step": { + "user": { + "data": { + "password": "Passwort", + "username": "Benutzername" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/en.json b/homeassistant/components/whirlpool/translations/en.json index 407d41d6736..74817db9ba7 100644 --- a/homeassistant/components/whirlpool/translations/en.json +++ b/homeassistant/components/whirlpool/translations/en.json @@ -1,8 +1,5 @@ { "config": { - "abort": { - "already_configured": "Device is already configured" - }, "error": { "cannot_connect": "Failed to connect", "invalid_auth": "Invalid authentication", @@ -11,12 +8,10 @@ "step": { "user": { "data": { - "host": "Host", "password": "Password", "username": "Username" } } } - }, - "title": "Whirlpool Sixth Sense" + } } \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/es.json b/homeassistant/components/whirlpool/translations/es.json new file mode 100644 index 00000000000..d26c25c3548 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/es.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "No se pudo conectar", + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida", + "unknown": "Error inesperado" + }, + "step": { + "user": { + "data": { + "password": "Contrase\u00f1a", + "username": "Usuario" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/et.json b/homeassistant/components/whirlpool/translations/et.json new file mode 100644 index 00000000000..983f599c870 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/et.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "\u00dchendamine nurjus", + "invalid_auth": "Tuvastamine nurjus", + "unknown": "Ootamatu t\u00f5rge" + }, + "step": { + "user": { + "data": { + "password": "Salas\u00f5na", + "username": "Kasutajanimi" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/he.json b/homeassistant/components/whirlpool/translations/he.json new file mode 100644 index 00000000000..96803e13b33 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/he.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "step": { + "user": { + "data": { + "password": "\u05e1\u05d9\u05e1\u05de\u05d4", + "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/hu.json b/homeassistant/components/whirlpool/translations/hu.json new file mode 100644 index 00000000000..e1cc19c9c30 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/hu.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s", + "invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s", + "unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt" + }, + "step": { + "user": { + "data": { + "password": "Jelsz\u00f3", + "username": "Felhaszn\u00e1l\u00f3n\u00e9v" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/id.json b/homeassistant/components/whirlpool/translations/id.json new file mode 100644 index 00000000000..7244ccf8912 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/id.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Gagal terhubung", + "invalid_auth": "Autentikasi tidak valid", + "unknown": "Kesalahan yang tidak diharapkan" + }, + "step": { + "user": { + "data": { + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/it.json b/homeassistant/components/whirlpool/translations/it.json new file mode 100644 index 00000000000..eb5545ca85a --- /dev/null +++ b/homeassistant/components/whirlpool/translations/it.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Impossibile connettersi", + "invalid_auth": "Autenticazione non valida", + "unknown": "Errore imprevisto" + }, + "step": { + "user": { + "data": { + "password": "Password", + "username": "Nome utente" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/nl.json b/homeassistant/components/whirlpool/translations/nl.json new file mode 100644 index 00000000000..a4954b83866 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/nl.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Kan geen verbinding maken", + "invalid_auth": "Ongeldige authenticatie", + "unknown": "Onverwachte fout" + }, + "step": { + "user": { + "data": { + "password": "Wachtwoord", + "username": "Gebruikersnaam" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/no.json b/homeassistant/components/whirlpool/translations/no.json new file mode 100644 index 00000000000..4bcac3aada8 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/no.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Tilkobling mislyktes", + "invalid_auth": "Ugyldig godkjenning", + "unknown": "Uventet feil" + }, + "step": { + "user": { + "data": { + "password": "Passord", + "username": "Brukernavn" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/pt-BR.json b/homeassistant/components/whirlpool/translations/pt-BR.json new file mode 100644 index 00000000000..efdc82ab438 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/pt-BR.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "Falha ao conectar", + "invalid_auth": "Autentica\u00e7\u00e3o inv\u00e1lida", + "unknown": "Erro inesperado" + }, + "step": { + "user": { + "data": { + "password": "Senha", + "username": "Usu\u00e1rio" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/ru.json b/homeassistant/components/whirlpool/translations/ru.json new file mode 100644 index 00000000000..994a287efd7 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/ru.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.", + "invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430." + }, + "step": { + "user": { + "data": { + "password": "\u041f\u0430\u0440\u043e\u043b\u044c", + "username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/whirlpool/translations/zh-Hant.json b/homeassistant/components/whirlpool/translations/zh-Hant.json new file mode 100644 index 00000000000..a3784595b65 --- /dev/null +++ b/homeassistant/components/whirlpool/translations/zh-Hant.json @@ -0,0 +1,17 @@ +{ + "config": { + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557", + "invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548", + "unknown": "\u672a\u9810\u671f\u932f\u8aa4" + }, + "step": { + "user": { + "data": { + "password": "\u5bc6\u78bc", + "username": "\u4f7f\u7528\u8005\u540d\u7a31" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/wilight/translations/hu.json b/homeassistant/components/wilight/translations/hu.json index 3b769a88b8f..9ef669f1ed3 100644 --- a/homeassistant/components/wilight/translations/hu.json +++ b/homeassistant/components/wilight/translations/hu.json @@ -8,7 +8,7 @@ "flow_title": "{name}", "step": { "confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a WiLight {name} ? \n\n T\u00e1mogatja: {components}", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a WiLight {name}-t ? \n\nT\u00e1mogatja: {components}", "title": "WiLight" } } diff --git a/homeassistant/components/wilight/translations/id.json b/homeassistant/components/wilight/translations/id.json index dae7b0bd16a..06616b29e35 100644 --- a/homeassistant/components/wilight/translations/id.json +++ b/homeassistant/components/wilight/translations/id.json @@ -5,7 +5,7 @@ "not_supported_device": "Perangkat WiLight ini saat ini tidak didukung.", "not_wilight_device": "Perangkat ini bukan perangkat WiLight" }, - "flow_title": "WiLight: {name}", + "flow_title": "{name}", "step": { "confirm": { "description": "Apakah Anda ingin menyiapkan WiLight {name}?\n\nIni mendukung: {components}", diff --git a/homeassistant/components/withings/translations/ca.json b/homeassistant/components/withings/translations/ca.json index b548735d426..c75e08e0234 100644 --- a/homeassistant/components/withings/translations/ca.json +++ b/homeassistant/components/withings/translations/ca.json @@ -10,7 +10,7 @@ "default": "Autenticaci\u00f3 exitosa amb Withings." }, "error": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "flow_title": "{profile}", "step": { diff --git a/homeassistant/components/withings/translations/hu.json b/homeassistant/components/withings/translations/hu.json index e26cff027fc..1a64a95de5e 100644 --- a/homeassistant/components/withings/translations/hu.json +++ b/homeassistant/components/withings/translations/hu.json @@ -3,7 +3,7 @@ "abort": { "already_configured": "A profil konfigur\u00e1ci\u00f3ja friss\u00edtve.", "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz." }, "create_entry": { @@ -19,9 +19,9 @@ }, "profile": { "data": { - "profile": "Profil" + "profile": "Profil n\u00e9v" }, - "description": "Melyik profilt v\u00e1lasztottad ki a Withings weboldalon? Fontos, hogy a profilok egyeznek, k\u00fcl\u00f6nben az adatok helytelen c\u00edmk\u00e9vel lesznek ell\u00e1tva.", + "description": "K\u00e9rem, adjon meg egy egyedi profilnevet. Ez \u00e1ltal\u00e1ban az el\u0151z\u0151 l\u00e9p\u00e9sben kiv\u00e1lasztott profil neve.", "title": "Felhaszn\u00e1l\u00f3i profil." }, "reauth": { diff --git a/homeassistant/components/withings/translations/id.json b/homeassistant/components/withings/translations/id.json index e254e61d91e..eb21a0d3352 100644 --- a/homeassistant/components/withings/translations/id.json +++ b/homeassistant/components/withings/translations/id.json @@ -12,7 +12,7 @@ "error": { "already_configured": "Akun sudah dikonfigurasi" }, - "flow_title": "Withings: {profile}", + "flow_title": "{profile}", "step": { "pick_implementation": { "title": "Pilih Metode Autentikasi" diff --git a/homeassistant/components/wled/translations/hu.json b/homeassistant/components/wled/translations/hu.json index 769573bfc89..2e0ac08d3cb 100644 --- a/homeassistant/components/wled/translations/hu.json +++ b/homeassistant/components/wled/translations/hu.json @@ -7,16 +7,16 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, - "flow_title": "WLED: {name}", + "flow_title": "{name}", "step": { "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "\u00c1ll\u00edtsd be a WLED-et a Home Assistant-ba val\u00f3 integr\u00e1l\u00e1shoz." + "description": "\u00c1ll\u00edtsa be a WLED-et Home Assistant-ba val\u00f3 integr\u00e1l\u00e1shoz." }, "zeroconf_confirm": { - "description": "Szeretn\u00e9d hozz\u00e1adni a(z) `{name}` WLED-et a Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni a(z) `{name}` WLED-et Home Assistant-hoz?", "title": "Felfedezett WLED eszk\u00f6z" } } diff --git a/homeassistant/components/wled/translations/id.json b/homeassistant/components/wled/translations/id.json index 6437dfaf83e..122cfd9da0b 100644 --- a/homeassistant/components/wled/translations/id.json +++ b/homeassistant/components/wled/translations/id.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "WLED: {name}", + "flow_title": "{name}", "step": { "user": { "data": { diff --git a/homeassistant/components/xbox/translations/hu.json b/homeassistant/components/xbox/translations/hu.json index b35b1b8e2fc..24c46bb8ab0 100644 --- a/homeassistant/components/xbox/translations/hu.json +++ b/homeassistant/components/xbox/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "authorize_url_timeout": "Id\u0151t\u00fall\u00e9p\u00e9s a hiteles\u00edt\u00e9si URL gener\u00e1l\u00e1sa sor\u00e1n.", - "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.", + "missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.", "single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges." }, "create_entry": { diff --git a/homeassistant/components/xiaomi_aqara/translations/hu.json b/homeassistant/components/xiaomi_aqara/translations/hu.json index 675ef24af3b..a6139c8851b 100644 --- a/homeassistant/components/xiaomi_aqara/translations/hu.json +++ b/homeassistant/components/xiaomi_aqara/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "not_xiaomi_aqara": "Nem egy Xiaomi Aqara Gateway, a felfedezett eszk\u00f6z nem egyezett az ismert \u00e1tj\u00e1r\u00f3kkal" }, "error": { diff --git a/homeassistant/components/xiaomi_aqara/translations/id.json b/homeassistant/components/xiaomi_aqara/translations/id.json index 5a2acfa330a..eeab548f681 100644 --- a/homeassistant/components/xiaomi_aqara/translations/id.json +++ b/homeassistant/components/xiaomi_aqara/translations/id.json @@ -12,7 +12,7 @@ "invalid_key": "Kunci gateway tidak valid", "invalid_mac": "Alamat MAC Tidak Valid" }, - "flow_title": "Xiaomi Aqara Gateway: {name}", + "flow_title": "{name}", "step": { "select": { "data": { diff --git a/homeassistant/components/xiaomi_miio/translations/es.json b/homeassistant/components/xiaomi_miio/translations/es.json index 5403e98f25f..d70445d2aa5 100644 --- a/homeassistant/components/xiaomi_miio/translations/es.json +++ b/homeassistant/components/xiaomi_miio/translations/es.json @@ -4,7 +4,8 @@ "already_configured": "El dispositivo ya est\u00e1 configurado", "already_in_progress": "El flujo de configuraci\u00f3n para este dispositivo Xiaomi Miio ya est\u00e1 en marcha.", "incomplete_info": "Informaci\u00f3n incompleta para configurar el dispositivo, no se ha suministrado ning\u00fan host o token.", - "not_xiaomi_miio": "El dispositivo no es (todav\u00eda) compatible con Xiaomi Miio." + "not_xiaomi_miio": "El dispositivo no es (todav\u00eda) compatible con Xiaomi Miio.", + "reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente" }, "error": { "cannot_connect": "No se pudo conectar", @@ -53,6 +54,10 @@ "title": "Conectar con un Xiaomi Gateway" }, "manual": { + "data": { + "host": "Direcci\u00f3n IP", + "token": "Token API" + }, "description": "Necesitar\u00e1s la clave de 32 caracteres Token API, consulta https://www.home-assistant.io/integrations/xiaomi_miio#retrieving-the-access-token para obtener instrucciones. Ten en cuenta que esta Token API es diferente de la clave utilizada por la integraci\u00f3n de Xiaomi Aqara.", "title": "Con\u00e9ctate a un dispositivo Xiaomi Miio o una puerta de enlace Xiaomi" }, diff --git a/homeassistant/components/xiaomi_miio/translations/hu.json b/homeassistant/components/xiaomi_miio/translations/hu.json index 1747b51c61a..6d53aad6f56 100644 --- a/homeassistant/components/xiaomi_miio/translations/hu.json +++ b/homeassistant/components/xiaomi_miio/translations/hu.json @@ -2,7 +2,7 @@ "config": { "abort": { "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "incomplete_info": "Az eszk\u00f6z be\u00e1ll\u00edt\u00e1s\u00e1hoz sz\u00fcks\u00e9ges inform\u00e1ci\u00f3k hi\u00e1nyosak, nincs megadva \u00e1llom\u00e1s vagy token.", "not_xiaomi_miio": "Az eszk\u00f6zt (m\u00e9g) nem t\u00e1mogatja a Xiaomi Miio integr\u00e1ci\u00f3.", "reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt" @@ -41,7 +41,7 @@ "name": "Eszk\u00f6z neve", "token": "API Token" }, - "description": "Sz\u00fcks\u00e9ged lesz a 32 karakteres API Tokenre, k\u00f6vesd a https://www.home-assistant.io/integrations/xiaomi_miio#retrieving-the-access-token oldal instrukci\u00f3it. Vedd figyelembe, hogy ez az API Token k\u00fcl\u00f6nb\u00f6zik a Xiaomi Aqara integr\u00e1ci\u00f3 \u00e1ltal haszn\u00e1lt kulcst\u00f3l.", + "description": "Sz\u00fcks\u00e9ge lesz a 32 karakteres API Tokenre, k\u00f6vesse a https://www.home-assistant.io/integrations/xiaomi_miio#retrieving-the-access-token oldal instrukci\u00f3it. Vegye figyelembe, hogy ez az API Token k\u00fcl\u00f6nb\u00f6zik a Xiaomi Aqara integr\u00e1ci\u00f3 \u00e1ltal haszn\u00e1lt kulcst\u00f3l.", "title": "Csatlakoz\u00e1s Xiaomi Miio eszk\u00f6zh\u00f6z vagy Xiaomi Gateway-hez" }, "gateway": { diff --git a/homeassistant/components/xiaomi_miio/translations/id.json b/homeassistant/components/xiaomi_miio/translations/id.json index f893f7b06aa..a6217b52eb1 100644 --- a/homeassistant/components/xiaomi_miio/translations/id.json +++ b/homeassistant/components/xiaomi_miio/translations/id.json @@ -2,14 +2,15 @@ "config": { "abort": { "already_configured": "Perangkat sudah dikonfigurasi", - "already_in_progress": "Alur konfigurasi sedang berlangsung" + "already_in_progress": "Alur konfigurasi sedang berlangsung", + "reauth_successful": "Autentikasi ulang berhasil" }, "error": { "cannot_connect": "Gagal terhubung", "no_device_selected": "Tidak ada perangkat yang dipilih, pilih satu perangkat.", "unknown_device": "Model perangkat tidak diketahui, tidak dapat menyiapkan perangkat menggunakan alur konfigurasi." }, - "flow_title": "Xiaomi Miio: {name}", + "flow_title": "{name}", "step": { "cloud": { "data": { diff --git a/homeassistant/components/xiaomi_miio/translations/select.id.json b/homeassistant/components/xiaomi_miio/translations/select.id.json new file mode 100644 index 00000000000..178bc06301c --- /dev/null +++ b/homeassistant/components/xiaomi_miio/translations/select.id.json @@ -0,0 +1,9 @@ +{ + "state": { + "xiaomi_miio__led_brightness": { + "bright": "Terang", + "dim": "Redup", + "off": "Mati" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/yale_smart_alarm/translations/ca.json b/homeassistant/components/yale_smart_alarm/translations/ca.json index ab77170999b..04e894afe1b 100644 --- a/homeassistant/components/yale_smart_alarm/translations/ca.json +++ b/homeassistant/components/yale_smart_alarm/translations/ca.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "already_configured": "El compte ja ha estat configurat" + "already_configured": "El compte ja est\u00e0 configurat" }, "error": { "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida" diff --git a/homeassistant/components/yale_smart_alarm/translations/el.json b/homeassistant/components/yale_smart_alarm/translations/el.json new file mode 100644 index 00000000000..676d0889008 --- /dev/null +++ b/homeassistant/components/yale_smart_alarm/translations/el.json @@ -0,0 +1,11 @@ +{ + "config": { + "step": { + "user": { + "data": { + "area_id": "\u0391\u03bd\u03b1\u03b3\u03bd\u03c9\u03c1\u03b9\u03c3\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03c1\u03b9\u03bf\u03c7\u03ae\u03c2" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/yale_smart_alarm/translations/es.json b/homeassistant/components/yale_smart_alarm/translations/es.json index 367454a7d21..178b8209af7 100644 --- a/homeassistant/components/yale_smart_alarm/translations/es.json +++ b/homeassistant/components/yale_smart_alarm/translations/es.json @@ -1,18 +1,18 @@ { "config": { "abort": { - "already_configured": "La cuenta ya est\u00e1 configurada" + "already_configured": "La cuenta ya ha sido configurada" }, "error": { - "invalid_auth": "Autenticaci\u00f3n err\u00f3nea" + "invalid_auth": "Autenticaci\u00f3n no v\u00e1lida" }, "step": { "reauth_confirm": { "data": { - "area_id": "ID de \u00c1rea", + "area_id": "ID de \u00e1rea", "name": "Nombre", - "password": "Clave", - "username": "Nombre de usuario" + "password": "Contrase\u00f1a", + "username": "Usuario" } }, "user": { @@ -20,7 +20,7 @@ "area_id": "ID de \u00e1rea", "name": "Nombre", "password": "Contrase\u00f1a", - "username": "Nombre de usuario" + "username": "Usuario" } } } diff --git a/homeassistant/components/yale_smart_alarm/translations/id.json b/homeassistant/components/yale_smart_alarm/translations/id.json new file mode 100644 index 00000000000..ee24f03a33c --- /dev/null +++ b/homeassistant/components/yale_smart_alarm/translations/id.json @@ -0,0 +1,28 @@ +{ + "config": { + "abort": { + "already_configured": "Akun sudah dikonfigurasi" + }, + "error": { + "invalid_auth": "Autentikasi tidak valid" + }, + "step": { + "reauth_confirm": { + "data": { + "area_id": "ID Area", + "name": "Nama", + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + }, + "user": { + "data": { + "area_id": "ID Area", + "name": "Nama", + "password": "Kata Sandi", + "username": "Nama Pengguna" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/yamaha_musiccast/translations/es.json b/homeassistant/components/yamaha_musiccast/translations/es.json index 185176e7b39..46f8a02f33d 100644 --- a/homeassistant/components/yamaha_musiccast/translations/es.json +++ b/homeassistant/components/yamaha_musiccast/translations/es.json @@ -1,6 +1,7 @@ { "config": { "abort": { + "already_configured": "El dispositivo ya est\u00e1 configurado", "yxc_control_url_missing": "La URL de control no se proporciona en la descripci\u00f3n del ssdp." }, "error": { @@ -8,6 +9,9 @@ }, "flow_title": "MusicCast: {name}", "step": { + "confirm": { + "description": "\u00bfQuieres iniciar la configuraci\u00f3n?" + }, "user": { "data": { "host": "Anfitri\u00f3n" diff --git a/homeassistant/components/yamaha_musiccast/translations/hu.json b/homeassistant/components/yamaha_musiccast/translations/hu.json index 9ddf75ca732..fc2672f5839 100644 --- a/homeassistant/components/yamaha_musiccast/translations/hu.json +++ b/homeassistant/components/yamaha_musiccast/translations/hu.json @@ -10,11 +10,11 @@ "flow_title": "MusicCast: {name}", "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, "description": "\u00c1ll\u00edtsa be a MusicCast-ot a Homeassistanttal val\u00f3 integr\u00e1ci\u00f3hoz." } diff --git a/homeassistant/components/yamaha_musiccast/translations/nl.json b/homeassistant/components/yamaha_musiccast/translations/nl.json index e1e31149c06..8cb8265a1f0 100644 --- a/homeassistant/components/yamaha_musiccast/translations/nl.json +++ b/homeassistant/components/yamaha_musiccast/translations/nl.json @@ -10,7 +10,7 @@ "flow_title": "MusicCast: {name}", "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" }, "user": { "data": { diff --git a/homeassistant/components/yeelight/translations/es.json b/homeassistant/components/yeelight/translations/es.json index 044a10c695d..c58d863fa13 100644 --- a/homeassistant/components/yeelight/translations/es.json +++ b/homeassistant/components/yeelight/translations/es.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "No se pudo conectar" }, - "flow_title": "{model} {host}", + "flow_title": "{model} {id} ({host})", "step": { "discovery_confirm": { "description": "\u00bfQuieres configurar {model} ({host})?" diff --git a/homeassistant/components/yeelight/translations/hu.json b/homeassistant/components/yeelight/translations/hu.json index 26dc6cb5ba1..6cf10422c28 100644 --- a/homeassistant/components/yeelight/translations/hu.json +++ b/homeassistant/components/yeelight/translations/hu.json @@ -7,10 +7,10 @@ "error": { "cannot_connect": "Sikertelen csatlakoz\u00e1s" }, - "flow_title": "{model} {host}", + "flow_title": "{model} {id} ({host})", "step": { "discovery_confirm": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a {model} ( {host} ) szolg\u00e1ltat\u00e1st?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a {model} ({host}) szolg\u00e1ltat\u00e1st?" }, "pick_device": { "data": { @@ -19,9 +19,9 @@ }, "user": { "data": { - "host": "Hoszt" + "host": "C\u00edm" }, - "description": "Ha a gazdag\u00e9pet \u00fcresen hagyja, felder\u00edt\u00e9sre ker\u00fcl automatikusan." + "description": "Ha nem ad meg c\u00edmet, akkor az eszk\u00f6z\u00f6k keres\u00e9se a felder\u00edt\u00e9ssel t\u00f6rt\u00e9nik." } } }, diff --git a/homeassistant/components/yeelight/translations/id.json b/homeassistant/components/yeelight/translations/id.json index 3b2f0273ae3..d9795662689 100644 --- a/homeassistant/components/yeelight/translations/id.json +++ b/homeassistant/components/yeelight/translations/id.json @@ -7,7 +7,7 @@ "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "{model} {host}", + "flow_title": "{model} {id} ({host})", "step": { "discovery_confirm": { "description": "Ingin menyiapkan {model} ({host})?" @@ -29,7 +29,7 @@ "step": { "init": { "data": { - "model": "Model (Opsional)", + "model": "Model (opsional)", "nightlight_switch": "Gunakan Sakelar Lampu Malam", "save_on_change": "Simpan Status Saat Berubah", "transition": "Waktu Transisi (milidetik)", diff --git a/homeassistant/components/youless/translations/es.json b/homeassistant/components/youless/translations/es.json index 72a56cc5608..77837bb25ce 100644 --- a/homeassistant/components/youless/translations/es.json +++ b/homeassistant/components/youless/translations/es.json @@ -6,7 +6,7 @@ "step": { "user": { "data": { - "host": "Anfitri\u00f3n", + "host": "Host", "name": "Nombre" } } diff --git a/homeassistant/components/youless/translations/hu.json b/homeassistant/components/youless/translations/hu.json index 21c7a7ebe4b..31913b7fa6f 100644 --- a/homeassistant/components/youless/translations/hu.json +++ b/homeassistant/components/youless/translations/hu.json @@ -6,7 +6,7 @@ "step": { "user": { "data": { - "host": "H\u00e1zigazda", + "host": "C\u00edm", "name": "N\u00e9v" } } diff --git a/homeassistant/components/youless/translations/id.json b/homeassistant/components/youless/translations/id.json new file mode 100644 index 00000000000..fd6c2bc2491 --- /dev/null +++ b/homeassistant/components/youless/translations/id.json @@ -0,0 +1,15 @@ +{ + "config": { + "error": { + "cannot_connect": "Gagal terhubung" + }, + "step": { + "user": { + "data": { + "host": "Host", + "name": "Nama" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/zerproc/translations/hu.json b/homeassistant/components/zerproc/translations/hu.json index 6c61530acbe..a56ebbfc906 100644 --- a/homeassistant/components/zerproc/translations/hu.json +++ b/homeassistant/components/zerproc/translations/hu.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "El szeretn\u00e9d kezdeni a be\u00e1ll\u00edt\u00e1st?" + "description": "El szeretn\u00e9 kezdeni a be\u00e1ll\u00edt\u00e1st?" } } } diff --git a/homeassistant/components/zerproc/translations/nl.json b/homeassistant/components/zerproc/translations/nl.json index d11896014fd..0671f0b3674 100644 --- a/homeassistant/components/zerproc/translations/nl.json +++ b/homeassistant/components/zerproc/translations/nl.json @@ -6,7 +6,7 @@ }, "step": { "confirm": { - "description": "Wil je beginnen met instellen?" + "description": "Wilt u beginnen met instellen?" } } } diff --git a/homeassistant/components/zha/translations/es.json b/homeassistant/components/zha/translations/es.json index 4753834a493..f04614f1f72 100644 --- a/homeassistant/components/zha/translations/es.json +++ b/homeassistant/components/zha/translations/es.json @@ -1,7 +1,8 @@ { "config": { "abort": { - "single_instance_allowed": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n." + "single_instance_allowed": "Ya est\u00e1 configurado. Solo es posible una \u00fanica configuraci\u00f3n.", + "usb_probe_failed": "No se ha podido sondear el dispositivo usb" }, "error": { "cannot_connect": "No se pudo conectar" diff --git a/homeassistant/components/zha/translations/hu.json b/homeassistant/components/zha/translations/hu.json index c65eaea4325..cc480bb413e 100644 --- a/homeassistant/components/zha/translations/hu.json +++ b/homeassistant/components/zha/translations/hu.json @@ -11,7 +11,7 @@ "flow_title": "{name}", "step": { "confirm": { - "description": "Be szeretn\u00e9 \u00e1ll\u00edtani a {name}-t?" + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani: {name}?" }, "pick_radio": { "data": { diff --git a/homeassistant/components/zha/translations/id.json b/homeassistant/components/zha/translations/id.json index 4198352aae8..5a10e3d01af 100644 --- a/homeassistant/components/zha/translations/id.json +++ b/homeassistant/components/zha/translations/id.json @@ -1,13 +1,18 @@ { "config": { "abort": { - "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan." + "not_zha_device": "Perangkat ini bukan perangkat zha", + "single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan.", + "usb_probe_failed": "Gagal mendeteksi perangkat usb" }, "error": { "cannot_connect": "Gagal terhubung" }, - "flow_title": "ZHA: {name}", + "flow_title": "{name}", "step": { + "confirm": { + "description": "Ingin menyiapkan {name}?" + }, "pick_radio": { "data": { "radio_type": "Jenis Radio" @@ -43,6 +48,7 @@ "zha_options": { "consider_unavailable_battery": "Anggap perangkat bertenaga baterai sebagai tidak tersedia setelah (detik)", "consider_unavailable_mains": "Anggap perangkat bertenaga listrik sebagai tidak tersedia setelah (detik)", + "default_light_transition": "Waktu transisi lampu default (detik)", "enable_identify_on_join": "Aktifkan efek identifikasi saat perangkat bergabung dengan jaringan", "title": "Opsi Global" } diff --git a/homeassistant/components/zoneminder/translations/hu.json b/homeassistant/components/zoneminder/translations/hu.json index a449464e27f..e01f032925d 100644 --- a/homeassistant/components/zoneminder/translations/hu.json +++ b/homeassistant/components/zoneminder/translations/hu.json @@ -19,7 +19,7 @@ "step": { "user": { "data": { - "host": "Host \u00e9s Port (pl. 10.10.0.4:8010)", + "host": "C\u00edm \u00e9s Port (pl. 10.10.0.4:8010)", "password": "Jelsz\u00f3", "path": "ZM \u00fatvonal", "path_zms": "ZMS el\u00e9r\u00e9si \u00fat", diff --git a/homeassistant/components/zwave/translations/ca.json b/homeassistant/components/zwave/translations/ca.json index 9a5ef2b5010..4b9e8953b8a 100644 --- a/homeassistant/components/zwave/translations/ca.json +++ b/homeassistant/components/zwave/translations/ca.json @@ -11,7 +11,7 @@ "user": { "data": { "network_key": "Clau de xarxa (deixa-ho en blanc per generar-la autom\u00e0ticament)", - "usb_path": "Ruta del port USB del dispositiu" + "usb_path": "Ruta del dispositiu USB" }, "description": "Aquesta integraci\u00f3 ja no s'actualitzar\u00e0. Utilitza Z-Wave JS per a instal\u00b7lacions noves.\n\nConsulta https://www.home-assistant.io/docs/z-wave/installation/ per a m\u00e9s informaci\u00f3 sobre les variables de configuraci\u00f3" } diff --git a/homeassistant/components/zwave/translations/hu.json b/homeassistant/components/zwave/translations/hu.json index 7269ee32daf..4d0c6adff59 100644 --- a/homeassistant/components/zwave/translations/hu.json +++ b/homeassistant/components/zwave/translations/hu.json @@ -13,19 +13,19 @@ "network_key": "H\u00e1l\u00f3zati kulcs (hagyja \u00fcresen az automatikus gener\u00e1l\u00e1shoz)", "usb_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" }, - "description": "A konfigur\u00e1ci\u00f3s v\u00e1ltoz\u00f3kr\u00f3l az inform\u00e1ci\u00f3kat l\u00e1sd a https://www.home-assistant.io/docs/z-wave/installation/ oldalon." + "description": "Ezt az integr\u00e1ci\u00f3t m\u00e1r nem tartj\u00e1k fenn. \u00daj telep\u00edt\u00e9sek eset\u00e9n haszn\u00e1lja helyette a Z-Wave JS-t.\n\nA konfigur\u00e1ci\u00f3s v\u00e1ltoz\u00f3kkal kapcsolatos inform\u00e1ci\u00f3k\u00e9rt l\u00e1sd https://www.home-assistant.io/docs/z-wave/installation/." } } }, "state": { "_": { - "dead": "Halott", + "dead": "Nem ad \u00e9letjelet", "initializing": "Inicializ\u00e1l\u00e1s", "ready": "K\u00e9sz", "sleeping": "Alv\u00e1s" }, "query_stage": { - "dead": "Halott", + "dead": "Nem ad \u00e9letjelet", "initializing": "Inicializ\u00e1l\u00e1s" } } diff --git a/homeassistant/components/zwave_js/translations/ca.json b/homeassistant/components/zwave_js/translations/ca.json index ac18c44b489..d0861d44f89 100644 --- a/homeassistant/components/zwave_js/translations/ca.json +++ b/homeassistant/components/zwave_js/translations/ca.json @@ -27,7 +27,11 @@ "configure_addon": { "data": { "network_key": "Clau de xarxa", - "usb_path": "Ruta del port USB del dispositiu" + "s0_legacy_key": "Clau d'S0 (est\u00e0ndard)", + "s2_access_control_key": "Clau de control d'acc\u00e9s d'S2", + "s2_authenticated_key": "Clau d'S2 autenticat", + "s2_unauthenticated_key": "Clau d'S2 no autenticat", + "usb_path": "Ruta del dispositiu USB" }, "title": "Introdueix la configuraci\u00f3 del complement Z-Wave JS" }, @@ -58,6 +62,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "Esborra codi d'usuari de {entity_name}", + "ping": "Sondeja dispositiu", + "refresh_value": "Actualitza el/s valor/s de {entity_name}", + "reset_meter": "Reinicialitza comptadors de {subtype}", + "set_config_parameter": "Estableix el valor del par\u00e0metre de configuraci\u00f3 {subtype}", + "set_lock_usercode": "Estableix codi d'usuari a {entity_name}", + "set_value": "Estableix el valor d'un valor Z-Wave" + }, "condition_type": { "config_parameter": "Configura el valor del par\u00e0metre {subtype}", "node_status": "Estat del node", @@ -100,7 +113,11 @@ "emulate_hardware": "Emula maquinari", "log_level": "Nivell dels registres", "network_key": "Clau de xarxa", - "usb_path": "Ruta del port USB del dispositiu" + "s0_legacy_key": "Clau d'S0 (est\u00e0ndard)", + "s2_access_control_key": "Clau de control d'acc\u00e9s d'S2", + "s2_authenticated_key": "Clau d'S2 autenticat", + "s2_unauthenticated_key": "Clau d'S2 no autenticat", + "usb_path": "Ruta del dispositiu USB" }, "title": "Introdueix la configuraci\u00f3 del complement Z-Wave JS" }, diff --git a/homeassistant/components/zwave_js/translations/de.json b/homeassistant/components/zwave_js/translations/de.json index 8d9634c3f46..8bdf7a78237 100644 --- a/homeassistant/components/zwave_js/translations/de.json +++ b/homeassistant/components/zwave_js/translations/de.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "Netzwerk-Schl\u00fcssel", + "s0_legacy_key": "S0 Schl\u00fcssel (Legacy)", + "s2_access_control_key": "S2 Zugangskontrollschl\u00fcssel", + "s2_authenticated_key": "S2 Authentifizierter Schl\u00fcssel", + "s2_unauthenticated_key": "S2 Nicht authentifizierter Schl\u00fcssel", "usb_path": "USB-Ger\u00e4te-Pfad" }, "title": "Gib die Konfiguration des Z-Wave JS Add-ons ein" @@ -58,6 +62,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "Nutzercode f\u00fcr {entity_name} l\u00f6schen", + "ping": "Ger\u00e4t anpingen", + "refresh_value": "Aktualisieren der Wert(e) f\u00fcr {entity_name}", + "reset_meter": "Z\u00e4hler von {subtype} zur\u00fccksetzen", + "set_config_parameter": "Wert des Konfigurationsparameters {subtype} festlegen", + "set_lock_usercode": "Einen Nutzercode f\u00fcr {entity_name} festlegen", + "set_value": "Wert eines Z-Wave-Werts einstellen" + }, "condition_type": { "config_parameter": "Wert des Konfigurationsparameters {subtype}", "node_status": "Status des Knotens", @@ -100,6 +113,10 @@ "emulate_hardware": "Hardware emulieren", "log_level": "Protokollstufe", "network_key": "Netzwerkschl\u00fcssel", + "s0_legacy_key": "S0 Schl\u00fcssel (Legacy)", + "s2_access_control_key": "S2 Zugangskontrollschl\u00fcssel", + "s2_authenticated_key": "S2 Authentifizierter Schl\u00fcssel", + "s2_unauthenticated_key": "S2 Nicht authentifizierter Schl\u00fcssel", "usb_path": "USB-Ger\u00e4te-Pfad" }, "title": "Gib die Konfiguration des Z-Wave JS-Add-ons ein" diff --git a/homeassistant/components/zwave_js/translations/el.json b/homeassistant/components/zwave_js/translations/el.json index 00149f5a0d0..21ba61a6af1 100644 --- a/homeassistant/components/zwave_js/translations/el.json +++ b/homeassistant/components/zwave_js/translations/el.json @@ -4,6 +4,7 @@ "discovery_requires_supervisor": "\u0397 \u03b1\u03bd\u03b1\u03ba\u03ac\u03bb\u03c5\u03c8\u03b7 \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03c4\u03bf\u03bd \u03b5\u03c0\u03cc\u03c0\u03c4\u03b7.", "not_zwave_device": "\u0397 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03c0\u03bf\u03c5 \u03b1\u03bd\u03b1\u03ba\u03b1\u03bb\u03cd\u03c6\u03b8\u03b7\u03ba\u03b5 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae Z-Wave." }, + "flow_title": "{name}", "step": { "usb_confirm": { "description": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf {name} \u03bc\u03b5 \u03c4\u03bf \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03bf Z-Wave JS;" diff --git a/homeassistant/components/zwave_js/translations/en.json b/homeassistant/components/zwave_js/translations/en.json index b24d4f31b06..46650ca5439 100644 --- a/homeassistant/components/zwave_js/translations/en.json +++ b/homeassistant/components/zwave_js/translations/en.json @@ -26,6 +26,7 @@ "step": { "configure_addon": { "data": { + "network_key": "Network Key", "s0_legacy_key": "S0 Key (Legacy)", "s2_access_control_key": "S2 Access Control Key", "s2_authenticated_key": "S2 Authenticated Key", @@ -111,6 +112,7 @@ "data": { "emulate_hardware": "Emulate Hardware", "log_level": "Log level", + "network_key": "Network Key", "s0_legacy_key": "S0 Key (Legacy)", "s2_access_control_key": "S2 Access Control Key", "s2_authenticated_key": "S2 Authenticated Key", @@ -138,5 +140,6 @@ "title": "The Z-Wave JS add-on is starting." } } - } + }, + "title": "Z-Wave JS" } \ No newline at end of file diff --git a/homeassistant/components/zwave_js/translations/es.json b/homeassistant/components/zwave_js/translations/es.json index caebf4f4ecb..e1a9cd081ba 100644 --- a/homeassistant/components/zwave_js/translations/es.json +++ b/homeassistant/components/zwave_js/translations/es.json @@ -16,6 +16,7 @@ "invalid_ws_url": "URL de websocket no v\u00e1lida", "unknown": "Error inesperado" }, + "flow_title": "{name}", "progress": { "install_addon": "Espera mientras termina la instalaci\u00f3n del complemento Z-Wave JS. Puede tardar varios minutos.", "start_addon": "Espere mientras se completa el inicio del complemento Z-Wave JS. Esto puede tardar unos segundos." @@ -99,6 +100,11 @@ "install_addon": { "title": "La instalaci\u00f3n del complemento Z-Wave JS ha comenzado" }, + "manual": { + "data": { + "url": "URL" + } + }, "on_supervisor": { "title": "Selecciona el m\u00e9todo de conexi\u00f3n" } diff --git a/homeassistant/components/zwave_js/translations/et.json b/homeassistant/components/zwave_js/translations/et.json index efed557fe73..10a813aad85 100644 --- a/homeassistant/components/zwave_js/translations/et.json +++ b/homeassistant/components/zwave_js/translations/et.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "V\u00f5rgu v\u00f5ti", + "s0_legacy_key": "S0 vana t\u00fc\u00fcpi v\u00f5ti", + "s2_access_control_key": "S2 juurdep\u00e4\u00e4suv\u00f5ti", + "s2_authenticated_key": "Autenditud S2 v\u00f5ti", + "s2_unauthenticated_key": "Autentimata S2 v\u00f5ti", "usb_path": "USB-seadme asukoha rada" }, "title": "Sisesta Z-Wave JS lisandmooduli seaded" @@ -58,6 +62,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "Kustutaolemi {entity_name} kasutajakood", + "ping": "K\u00fcsitle seadet", + "refresh_value": "Olemi {entity_name} v\u00e4\u00e4rtuste v\u00e4rskendamine", + "reset_meter": "L\u00e4htesta arvesti {subtype}", + "set_config_parameter": "Seadeparameetri {subtype} v\u00e4\u00e4rtuse omistamine", + "set_lock_usercode": "Olemi {entity_name} kasutaja koodi m\u00e4\u00e4ramine", + "set_value": "Z-Wave v\u00e4\u00e4rtuse m\u00e4\u00e4ramine" + }, "condition_type": { "config_parameter": "Seadeparameeteri {subtype} v\u00e4\u00e4rtus", "node_status": "S\u00f5lme olek", @@ -100,6 +113,10 @@ "emulate_hardware": "Riistvara emuleerimine", "log_level": "Logimise tase", "network_key": "V\u00f5rgu v\u00f5ti", + "s0_legacy_key": "S0 vana t\u00fc\u00fcpi v\u00f5ti", + "s2_access_control_key": "S2 juurdep\u00e4\u00e4suv\u00f5ti", + "s2_authenticated_key": "Autenditud S2 v\u00f5ti", + "s2_unauthenticated_key": "Autentimata S2 v\u00f5ti", "usb_path": "USB-seadme asukoha rada" }, "title": "Sisesta Z-Wave JS lisandmooduli seaded" diff --git a/homeassistant/components/zwave_js/translations/hu.json b/homeassistant/components/zwave_js/translations/hu.json index cf5521f3e04..bf541fce26a 100644 --- a/homeassistant/components/zwave_js/translations/hu.json +++ b/homeassistant/components/zwave_js/translations/hu.json @@ -7,7 +7,7 @@ "addon_set_config_failed": "Nem siker\u00fclt be\u00e1ll\u00edtani a Z-Wave JS konfigur\u00e1ci\u00f3t.", "addon_start_failed": "Nem siker\u00fclt elind\u00edtani a Z-Wave JS b\u0151v\u00edtm\u00e9nyt.", "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", - "already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "cannot_connect": "Sikertelen csatlakoz\u00e1s", "discovery_requires_supervisor": "A felfedez\u00e9shez a fel\u00fcgyel\u0151re van sz\u00fcks\u00e9g.", "not_zwave_device": "A felfedezett eszk\u00f6z nem Z-Wave eszk\u00f6z." @@ -46,8 +46,8 @@ "data": { "use_addon": "Haszn\u00e1ld a Z-Wave JS Supervisor b\u0151v\u00edtm\u00e9nyt" }, - "description": "Szeretn\u00e9d haszn\u00e1lni az Z-Wave JS Supervisor b\u0151v\u00edtm\u00e9nyt?", - "title": "V\u00e1laszd ki a csatlakoz\u00e1si m\u00f3dot" + "description": "Szeretn\u00e9 haszn\u00e1lni az Z-Wave JS Supervisor b\u0151v\u00edtm\u00e9nyt?", + "title": "V\u00e1lassza ki a csatlakoz\u00e1si m\u00f3dot" }, "start_addon": { "title": "Indul a Z-Wave JS b\u0151v\u00edtm\u00e9ny." @@ -58,6 +58,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "{entity_name} felhaszn\u00e1l\u00f3i k\u00f3dj\u00e1nak t\u00f6rl\u00e9se", + "ping": "Eszk\u00f6z pinget\u00e9se", + "refresh_value": "{entity_name} \u00e9rt\u00e9keinek friss\u00edt\u00e9se", + "reset_meter": "{subtype} m\u00e9r\u00e9sek alaphelyzetbe \u00e1ll\u00edt\u00e1sa", + "set_config_parameter": "{subtype} konfigur\u00e1ci\u00f3s param\u00e9ter \u00e9rt\u00e9k\u00e9nek be\u00e1ll\u00edt\u00e1sa", + "set_lock_usercode": "{entity_name} felhaszn\u00e1l\u00f3i k\u00f3dj\u00e1nak be\u00e1ll\u00edt\u00e1sa", + "set_value": "Z-Wave \u00e9rt\u00e9k be\u00e1ll\u00edt\u00e1sa" + }, "condition_type": { "config_parameter": "Konfigur\u00e1lja a(z) {subtype} param\u00e9ter \u00e9rt\u00e9k\u00e9t", "node_status": "Csom\u00f3pont \u00e1llapota", @@ -117,7 +126,7 @@ "use_addon": "Haszn\u00e1lja a Z-Wave JS Supervisor b\u0151v\u00edtm\u00e9nyt" }, "description": "Szeretn\u00e9 haszn\u00e1lni a Z-Wave JS Supervisor b\u0151v\u00edtm\u00e9nyt?", - "title": "V\u00e1laszd ki a csatlakoz\u00e1si m\u00f3dot" + "title": "V\u00e1lassza ki a csatlakoz\u00e1si m\u00f3dot" }, "start_addon": { "title": "Indul a Z-Wave JS b\u0151v\u00edtm\u00e9ny." diff --git a/homeassistant/components/zwave_js/translations/id.json b/homeassistant/components/zwave_js/translations/id.json index 61ea6762c7d..2004be7238f 100644 --- a/homeassistant/components/zwave_js/translations/id.json +++ b/homeassistant/components/zwave_js/translations/id.json @@ -8,7 +8,9 @@ "addon_start_failed": "Gagal memulai add-on Z-Wave JS.", "already_configured": "Perangkat sudah dikonfigurasi", "already_in_progress": "Alur konfigurasi sedang berlangsung", - "cannot_connect": "Gagal terhubung" + "cannot_connect": "Gagal terhubung", + "discovery_requires_supervisor": "Fitur penemuan membutuhkan supervisor.", + "not_zwave_device": "Perangkat yang ditemukan bukanperangkat Z-Wave." }, "error": { "addon_start_failed": "Gagal memulai add-on Z-Wave JS. Periksa konfigurasi.", @@ -16,6 +18,7 @@ "invalid_ws_url": "URL websocket tidak valid", "unknown": "Kesalahan yang tidak diharapkan" }, + "flow_title": "{name}", "progress": { "install_addon": "Harap tunggu hingga penginstalan add-on Z-Wave JS selesai. Ini bisa memakan waktu beberapa saat.", "start_addon": "Harap tunggu hingga add-on Z-Wave JS selesai. Ini mungkin perlu waktu beberapa saat." @@ -51,6 +54,16 @@ } } }, + "device_automation": { + "condition_type": { + "config_parameter": "Nilai parameter konfigurasi {subtype}", + "node_status": "Status node", + "value": "Nilai saat ini dari Nilai Z-Wave" + }, + "trigger_type": { + "state.node_status": "Status node berubah" + } + }, "options": { "abort": { "addon_get_discovery_info_failed": "Gagal mendapatkan info penemuan add-on Z-Wave JS.", diff --git a/homeassistant/components/zwave_js/translations/it.json b/homeassistant/components/zwave_js/translations/it.json index 165849e9387..af3416ed9a9 100644 --- a/homeassistant/components/zwave_js/translations/it.json +++ b/homeassistant/components/zwave_js/translations/it.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "Chiave di rete", + "s0_legacy_key": "Chiave S0 (Obsoleta)", + "s2_access_control_key": "Chiave di controllo di accesso S2", + "s2_authenticated_key": "Chiave S2 autenticata", + "s2_unauthenticated_key": "Chiave S2 non autenticata", "usb_path": "Percorso del dispositivo USB" }, "title": "Accedi alla configurazione del componente aggiuntivo Z-Wave JS" @@ -58,6 +62,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "Cancella codice utente su {entity_name}", + "ping": "Dispositivo ping", + "refresh_value": "Aggiorna il/i valore/i per {entity_name}", + "reset_meter": "Azzerare i contatori su {subtype}", + "set_config_parameter": "Imposta il valore del parametro di configurazione {subtype}", + "set_lock_usercode": "Imposta un codice utente su {entity_name}", + "set_value": "Imposta un valore Z-Wave" + }, "condition_type": { "config_parameter": "Valore del parametro di configurazione {subtype}", "node_status": "Stato del nodo", @@ -100,6 +113,10 @@ "emulate_hardware": "Emulare l'hardware", "log_level": "Livello di registro", "network_key": "Chiave di rete", + "s0_legacy_key": "Chiave S0 (Obsoleta)", + "s2_access_control_key": "Chiave di controllo di accesso S2", + "s2_authenticated_key": "Chiave S2 autenticata", + "s2_unauthenticated_key": "Chiave S2 non autenticata", "usb_path": "Percorso del dispositivo USB" }, "title": "Entra nella configurazione del componente aggiuntivo Z-Wave JS" diff --git a/homeassistant/components/zwave_js/translations/nl.json b/homeassistant/components/zwave_js/translations/nl.json index 23d185f1ded..b7a3a68fe6b 100644 --- a/homeassistant/components/zwave_js/translations/nl.json +++ b/homeassistant/components/zwave_js/translations/nl.json @@ -53,11 +53,20 @@ "title": "De add-on Z-Wave JS wordt gestart." }, "usb_confirm": { - "description": "Wilt u {naam} instellen met de Z-Wave JS add-on?" + "description": "Wilt u {name} instellen met de Z-Wave JS add-on?" } } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "Wis gebruikerscode van {entity_name}", + "ping": "Ping apparaat", + "refresh_value": "Ververs de waarde(s) voor {entity_name}", + "reset_meter": "Reset meters op {subtype}", + "set_config_parameter": "Stel waarde in voor configuratieparameter {subtype}", + "set_lock_usercode": "Stel gebruikerscode in voor {entity_name}", + "set_value": "Waarde van een Z-Wave waarde instellen" + }, "condition_type": { "config_parameter": "Config parameter {subtype} waarde", "node_status": "Knooppuntstatus", diff --git a/homeassistant/components/zwave_js/translations/no.json b/homeassistant/components/zwave_js/translations/no.json index b69b1cb4f7a..9ddf12a3b85 100644 --- a/homeassistant/components/zwave_js/translations/no.json +++ b/homeassistant/components/zwave_js/translations/no.json @@ -58,6 +58,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "Fjern brukerkoden p\u00e5 {entity_name}", + "ping": "Ping -enhet", + "refresh_value": "Oppdater verdien (e) for {entity_name}", + "reset_meter": "Tilbakestill m\u00e5lere p\u00e5 {subtype}", + "set_config_parameter": "Angi verdien til konfigurasjonsparameteren {subtype}", + "set_lock_usercode": "Angi en brukerkode p\u00e5 {entity_name}", + "set_value": "Angi verdien for en Z-Wave-verdi" + }, "condition_type": { "config_parameter": "Konfigurer parameter {subtype} verdi", "node_status": "Nodestatus", diff --git a/homeassistant/components/zwave_js/translations/ru.json b/homeassistant/components/zwave_js/translations/ru.json index 994bfb54cfc..9ae79edb32d 100644 --- a/homeassistant/components/zwave_js/translations/ru.json +++ b/homeassistant/components/zwave_js/translations/ru.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "\u041a\u043b\u044e\u0447 \u0441\u0435\u0442\u0438", + "s0_legacy_key": "\u041a\u043b\u044e\u0447 S0 (\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439)", + "s2_access_control_key": "\u041a\u043b\u044e\u0447 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 S2", + "s2_authenticated_key": "\u041a\u043b\u044e\u0447 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 S2", + "s2_unauthenticated_key": "\u041a\u043b\u044e\u0447 \u0431\u0435\u0437 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 S2", "usb_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" }, "title": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Z-Wave JS" @@ -58,6 +62,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 {entity_name}", + "ping": "\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c", + "refresh_value": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f {entity_name}", + "reset_meter": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 {subtype}", + "set_config_parameter": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {subtype}", + "set_lock_usercode": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430 {entity_name}", + "set_value": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Z-Wave Value" + }, "condition_type": { "config_parameter": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 {subtype}", "node_status": "\u0421\u0442\u0430\u0442\u0443\u0441 \u0443\u0437\u043b\u0430", @@ -100,6 +113,10 @@ "emulate_hardware": "\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f", "log_level": "\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0436\u0443\u0440\u043d\u0430\u043b\u0430", "network_key": "\u041a\u043b\u044e\u0447 \u0441\u0435\u0442\u0438", + "s0_legacy_key": "\u041a\u043b\u044e\u0447 S0 (\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439)", + "s2_access_control_key": "\u041a\u043b\u044e\u0447 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 S2", + "s2_authenticated_key": "\u041a\u043b\u044e\u0447 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 S2", + "s2_unauthenticated_key": "\u041a\u043b\u044e\u0447 \u0431\u0435\u0437 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 S2", "usb_path": "\u041f\u0443\u0442\u044c \u043a USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443" }, "title": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Z-Wave JS" diff --git a/homeassistant/components/zwave_js/translations/zh-Hant.json b/homeassistant/components/zwave_js/translations/zh-Hant.json index e9038ed9a00..7b495ed0ca0 100644 --- a/homeassistant/components/zwave_js/translations/zh-Hant.json +++ b/homeassistant/components/zwave_js/translations/zh-Hant.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "\u7db2\u8def\u5bc6\u9470", + "s0_legacy_key": "S0 \u5bc6\u9470\uff08\u820a\u7248\uff09", + "s2_access_control_key": "S2 \u5b58\u53d6\u63a7\u5236\u5bc6\u9470", + "s2_authenticated_key": "S2 \u9a57\u8b49\u5bc6\u9470", + "s2_unauthenticated_key": "S2 \u672a\u9a57\u8b49\u5bc6\u9470", "usb_path": "USB \u88dd\u7f6e\u8def\u5f91" }, "title": "\u8f38\u5165 Z-Wave JS \u9644\u52a0\u5143\u4ef6\u8a2d\u5b9a" @@ -58,6 +62,15 @@ } }, "device_automation": { + "action_type": { + "clear_lock_usercode": "\u6e05\u9664 {entity_name} usercode", + "ping": "Ping \u88dd\u7f6e", + "refresh_value": "\u66f4\u65b0 {entity_name} \u6578\u503c", + "reset_meter": "\u91cd\u7f6e {subtype} \u8a08\u91cf", + "set_config_parameter": "\u8a2d\u5b9a {subtype} \u8a2d\u5b9a\u8b8a\u6578", + "set_lock_usercode": "\u8a2d\u5b9a {entity_name} usercode", + "set_value": "\u8a2d\u5b9a Z-Wave \u6578\u503c" + }, "condition_type": { "config_parameter": "\u8a2d\u5b9a\u53c3\u6578 {subtype} \u6578\u503c", "node_status": "\u7bc0\u9ede\u72c0\u614b", @@ -100,6 +113,10 @@ "emulate_hardware": "\u6a21\u64ec\u786c\u9ad4", "log_level": "\u65e5\u8a8c\u8a18\u9304\u7b49\u7d1a", "network_key": "\u7db2\u8def\u5bc6\u9470", + "s0_legacy_key": "S0 \u5bc6\u9470\uff08\u820a\u7248\uff09", + "s2_access_control_key": "S2 \u5b58\u53d6\u63a7\u5236\u5bc6\u9470", + "s2_authenticated_key": "S2 \u9a57\u8b49\u5bc6\u9470", + "s2_unauthenticated_key": "S2 \u672a\u9a57\u8b49\u5bc6\u9470", "usb_path": "USB \u88dd\u7f6e\u8def\u5f91" }, "title": "\u8f38\u5165 Z-Wave JS \u9644\u52a0\u5143\u4ef6\u8a2d\u5b9a" From 75b6526cdc0a996fcc09c8114777ac1f7661329a Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 1 Oct 2021 21:46:44 +0200 Subject: [PATCH 017/162] Fix vicare binary sensor (#56912) --- homeassistant/components/vicare/binary_sensor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/vicare/binary_sensor.py b/homeassistant/components/vicare/binary_sensor.py index 9897b38ccf5..88d6e3ac06a 100644 --- a/homeassistant/components/vicare/binary_sensor.py +++ b/homeassistant/components/vicare/binary_sensor.py @@ -124,6 +124,7 @@ class ViCareBinarySensor(BinarySensorEntity): def __init__(self, name, api, description: DescriptionT): """Initialize the sensor.""" + self.entity_description = description self._attr_name = f"{name} {description.name}" self._api = api self._state = None From 3579d638a8b20152399fb2e222708165559e0511 Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Sat, 2 Oct 2021 22:52:28 +0200 Subject: [PATCH 018/162] Set unique id while SSDP discovery of Synology DSM (#56914) --- homeassistant/components/synology_dsm/config_flow.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/homeassistant/components/synology_dsm/config_flow.py b/homeassistant/components/synology_dsm/config_flow.py index ae24adc7960..ed0ee8e9125 100644 --- a/homeassistant/components/synology_dsm/config_flow.py +++ b/homeassistant/components/synology_dsm/config_flow.py @@ -239,8 +239,12 @@ class SynologyDSMFlowHandler(ConfigFlow, domain=DOMAIN): # Synology NAS can broadcast on multiple IP addresses, since they can be connected to multiple ethernets. # The serial of the NAS is actually its MAC address. + await self.async_set_unique_id(discovered_mac) existing_entry = self._async_get_existing_entry(discovered_mac) + if not existing_entry: + self._abort_if_unique_id_configured() + if existing_entry and existing_entry.data[CONF_HOST] != parsed_url.hostname: _LOGGER.debug( "Update host from '%s' to '%s' for NAS '%s' via SSDP discovery", @@ -253,6 +257,7 @@ class SynologyDSMFlowHandler(ConfigFlow, domain=DOMAIN): data={**existing_entry.data, CONF_HOST: parsed_url.hostname}, ) return self.async_abort(reason="reconfigure_successful") + if existing_entry: return self.async_abort(reason="already_configured") From 5f681921099d947662206c4c152fc6803e56aeba Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sat, 2 Oct 2021 04:20:17 -0600 Subject: [PATCH 019/162] Address beta review comments for WattTime (#56919) --- homeassistant/components/watttime/__init__.py | 11 +++--- .../components/watttime/config_flow.py | 16 ++++----- .../components/watttime/manifest.json | 4 --- homeassistant/components/watttime/sensor.py | 35 +++++-------------- 4 files changed, 19 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/watttime/__init__.py b/homeassistant/components/watttime/__init__.py index d376dd40db6..6d23182c011 100644 --- a/homeassistant/components/watttime/__init__.py +++ b/homeassistant/components/watttime/__init__.py @@ -27,16 +27,13 @@ PLATFORMS: list[str] = ["sensor"] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up WattTime from a config entry.""" - hass.data.setdefault(DOMAIN, {DATA_COORDINATOR: {}}) + hass.data.setdefault(DOMAIN, {entry.entry_id: {DATA_COORDINATOR: {}}}) session = aiohttp_client.async_get_clientsession(hass) try: client = await Client.async_login( - entry.data[CONF_USERNAME], - entry.data[CONF_PASSWORD], - session=session, - logger=LOGGER, + entry.data[CONF_USERNAME], entry.data[CONF_PASSWORD], session=session ) except WattTimeError as err: LOGGER.error("Error while authenticating with WattTime: %s", err) @@ -62,7 +59,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) await coordinator.async_config_entry_first_refresh() - hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id] = coordinator + hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR] = coordinator hass.config_entries.async_setup_platforms(entry, PLATFORMS) @@ -73,6 +70,6 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if unload_ok: - hass.data[DOMAIN][DATA_COORDINATOR].pop(entry.entry_id) + hass.data[DOMAIN].pop(entry.entry_id) return unload_ok diff --git a/homeassistant/components/watttime/config_flow.py b/homeassistant/components/watttime/config_flow.py index a6c5dd422c2..6c523f64331 100644 --- a/homeassistant/components/watttime/config_flow.py +++ b/homeassistant/components/watttime/config_flow.py @@ -118,16 +118,14 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): step_id="location", data_schema=STEP_LOCATION_DATA_SCHEMA ) - if user_input[CONF_LOCATION_TYPE] == LOCATION_TYPE_COORDINATES: - return self.async_show_form( - step_id="coordinates", data_schema=STEP_COORDINATES_DATA_SCHEMA + if user_input[CONF_LOCATION_TYPE] == LOCATION_TYPE_HOME: + return await self.async_step_coordinates( + { + CONF_LATITUDE: self.hass.config.latitude, + CONF_LONGITUDE: self.hass.config.longitude, + } ) - return await self.async_step_coordinates( - { - CONF_LATITUDE: self.hass.config.latitude, - CONF_LONGITUDE: self.hass.config.longitude, - } - ) + return await self.async_step_coordinates() async def async_step_user( self, user_input: dict[str, Any] | None = None diff --git a/homeassistant/components/watttime/manifest.json b/homeassistant/components/watttime/manifest.json index d4000b6f6b1..85a32bce331 100644 --- a/homeassistant/components/watttime/manifest.json +++ b/homeassistant/components/watttime/manifest.json @@ -6,10 +6,6 @@ "requirements": [ "aiowatttime==0.1.1" ], - "ssdp": [], - "zeroconf": [], - "homekit": {}, - "dependencies": [], "codeowners": [ "@bachya" ], diff --git a/homeassistant/components/watttime/sensor.py b/homeassistant/components/watttime/sensor.py index 4453044e0d2..6a6d05701c4 100644 --- a/homeassistant/components/watttime/sensor.py +++ b/homeassistant/components/watttime/sensor.py @@ -1,7 +1,6 @@ """Support for WattTime sensors.""" from __future__ import annotations -from dataclasses import dataclass from typing import TYPE_CHECKING from homeassistant.components.sensor import ( @@ -36,40 +35,24 @@ ATTR_BALANCING_AUTHORITY = "balancing_authority" DEFAULT_ATTRIBUTION = "Pickup data provided by WattTime" -SENSOR_TYPE_REALTIME_EMISSIONS_MOER = "realtime_emissions_moer" -SENSOR_TYPE_REALTIME_EMISSIONS_PERCENT = "realtime_emissions_percent" - - -@dataclass -class RealtimeEmissionsSensorDescriptionMixin: - """Define an entity description mixin for realtime emissions sensors.""" - - data_key: str - - -@dataclass -class RealtimeEmissionsSensorEntityDescription( - SensorEntityDescription, RealtimeEmissionsSensorDescriptionMixin -): - """Describe a realtime emissions sensor.""" +SENSOR_TYPE_REALTIME_EMISSIONS_MOER = "moer" +SENSOR_TYPE_REALTIME_EMISSIONS_PERCENT = "percent" REALTIME_EMISSIONS_SENSOR_DESCRIPTIONS = ( - RealtimeEmissionsSensorEntityDescription( + SensorEntityDescription( key=SENSOR_TYPE_REALTIME_EMISSIONS_MOER, name="Marginal Operating Emissions Rate", icon="mdi:blur", native_unit_of_measurement=f"{MASS_POUNDS} CO2/MWh", state_class=STATE_CLASS_MEASUREMENT, - data_key="moer", ), - RealtimeEmissionsSensorEntityDescription( + SensorEntityDescription( key=SENSOR_TYPE_REALTIME_EMISSIONS_PERCENT, name="Relative Marginal Emissions Intensity", icon="mdi:blur", native_unit_of_measurement=PERCENTAGE, state_class=STATE_CLASS_MEASUREMENT, - data_key="percent", ), ) @@ -78,12 +61,12 @@ async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback ) -> None: """Set up WattTime sensors based on a config entry.""" - coordinator = hass.data[DOMAIN][DATA_COORDINATOR][entry.entry_id] + coordinator = hass.data[DOMAIN][entry.entry_id][DATA_COORDINATOR] async_add_entities( [ RealtimeEmissionsSensor(coordinator, description) for description in REALTIME_EMISSIONS_SENSOR_DESCRIPTIONS - if description.data_key in coordinator.data + if description.key in coordinator.data ] ) @@ -91,12 +74,10 @@ async def async_setup_entry( class RealtimeEmissionsSensor(CoordinatorEntity, SensorEntity): """Define a realtime emissions sensor.""" - entity_description: RealtimeEmissionsSensorEntityDescription - def __init__( self, coordinator: DataUpdateCoordinator, - description: RealtimeEmissionsSensorEntityDescription, + description: SensorEntityDescription, ) -> None: """Initialize the sensor.""" super().__init__(coordinator) @@ -119,4 +100,4 @@ class RealtimeEmissionsSensor(CoordinatorEntity, SensorEntity): @property def native_value(self) -> StateType: """Return the value reported by the sensor.""" - return self.coordinator.data[self.entity_description.data_key] + return self.coordinator.data[self.entity_description.key] From baae7089ed13c0bd0ae1ecee9a88504af22bccfd Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Sat, 2 Oct 2021 03:11:31 -0400 Subject: [PATCH 020/162] Bump pynws: fix unit code bug (#56923) --- homeassistant/components/nws/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nws/manifest.json b/homeassistant/components/nws/manifest.json index d1e7158ab20..30b00fde15a 100644 --- a/homeassistant/components/nws/manifest.json +++ b/homeassistant/components/nws/manifest.json @@ -3,7 +3,7 @@ "name": "National Weather Service (NWS)", "documentation": "https://www.home-assistant.io/integrations/nws", "codeowners": ["@MatthewFlamm"], - "requirements": ["pynws==1.3.0"], + "requirements": ["pynws==1.3.1"], "quality_scale": "platinum", "config_flow": true, "iot_class": "cloud_polling" diff --git a/requirements_all.txt b/requirements_all.txt index dd2447b9bda..990b28276b0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1670,7 +1670,7 @@ pynuki==1.4.1 pynut2==2.1.2 # homeassistant.components.nws -pynws==1.3.0 +pynws==1.3.1 # homeassistant.components.nx584 pynx584==0.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8ba707f471c..7bf3e73c6b5 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -986,7 +986,7 @@ pynuki==1.4.1 pynut2==2.1.2 # homeassistant.components.nws -pynws==1.3.0 +pynws==1.3.1 # homeassistant.components.nx584 pynx584==0.5 From b1b23ef67df2aceed3d1b837f4e1f449b862a707 Mon Sep 17 00:00:00 2001 From: RenierM26 <66512715+RenierM26@users.noreply.github.com> Date: Sat, 2 Oct 2021 22:51:53 +0200 Subject: [PATCH 021/162] Fix Switchbot unsupported SB types (#56928) --- homeassistant/components/switchbot/config_flow.py | 2 +- tests/components/switchbot/conftest.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/switchbot/config_flow.py b/homeassistant/components/switchbot/config_flow.py index eba40d46058..2d4e61bada5 100644 --- a/homeassistant/components/switchbot/config_flow.py +++ b/homeassistant/components/switchbot/config_flow.py @@ -112,7 +112,7 @@ class SwitchbotConfigFlow(ConfigFlow, domain=DOMAIN): unconfigured_devices = { device["mac_address"]: f"{device['mac_address']} {device['modelName']}" for device in self._discovered_devices.values() - if device["modelName"] in SUPPORTED_MODEL_TYPES + if device.get("modelName") in SUPPORTED_MODEL_TYPES and device["mac_address"] not in configured_devices } diff --git a/tests/components/switchbot/conftest.py b/tests/components/switchbot/conftest.py index 8e90547a18f..52e5fd4fa15 100644 --- a/tests/components/switchbot/conftest.py +++ b/tests/components/switchbot/conftest.py @@ -41,6 +41,12 @@ class MocGetSwitchbotDevices: "model": "c", "modelName": "WoCurtain", }, + "ffffff19ffff": { + "mac_address": "ff:ff:ff:19:ff:ff", + "Flags": "06", + "Manufacturer": "5900ffffff19ffff", + "Complete 128b Services": "cba20d00-224d-11e6-9fb8-0002a5d5c51b", + }, } self._curtain_all_services_data = { "mac_address": "e7:89:43:90:90:90", From 7a75506b0275e1481f9bbe49fa98f2acd6773afc Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Sat, 2 Oct 2021 09:05:49 +0200 Subject: [PATCH 022/162] Fix `Unable to serialize to JSON` error in Xiaomi Miio (#56929) --- homeassistant/components/xiaomi_miio/fan.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/fan.py b/homeassistant/components/xiaomi_miio/fan.py index 1b275ea2d6e..04cdc4573db 100644 --- a/homeassistant/components/xiaomi_miio/fan.py +++ b/homeassistant/components/xiaomi_miio/fan.py @@ -1,6 +1,7 @@ """Support for Xiaomi Mi Air Purifier and Xiaomi Mi Air Humidifier.""" from abc import abstractmethod import asyncio +from enum import Enum import logging import math @@ -363,13 +364,21 @@ class XiaomiGenericAirPurifier(XiaomiGenericDevice): return None + @staticmethod + def _extract_value_from_attribute(state, attribute): + value = getattr(state, attribute) + if isinstance(value, Enum): + return value.value + + return value + @callback def _handle_coordinator_update(self): """Fetch state from the device.""" self._state = self.coordinator.data.is_on self._state_attrs.update( { - key: getattr(self.coordinator.data, value) + key: self._extract_value_from_attribute(self.coordinator.data, value) for key, value in self._available_attributes.items() } ) @@ -434,7 +443,7 @@ class XiaomiAirPurifier(XiaomiGenericAirPurifier): self._state = self.coordinator.data.is_on self._state_attrs.update( { - key: getattr(self.coordinator.data, value) + key: self._extract_value_from_attribute(self.coordinator.data, value) for key, value in self._available_attributes.items() } ) From 8ecf03569d422356fe511b33d6cf688d0e758318 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 2 Oct 2021 03:19:11 -0500 Subject: [PATCH 023/162] Add DHCP support for TPLink KL430, KP115 (#56932) --- homeassistant/components/tplink/manifest.json | 8 ++++++++ homeassistant/generated/dhcp.py | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/homeassistant/components/tplink/manifest.json b/homeassistant/components/tplink/manifest.json index cfc9fce5213..6712da00d0e 100644 --- a/homeassistant/components/tplink/manifest.json +++ b/homeassistant/components/tplink/manifest.json @@ -13,6 +13,14 @@ "hostname": "ep*", "macaddress": "E848B8*" }, + { + "hostname": "k[lp]*", + "macaddress": "E848B8*" + }, + { + "hostname": "k[lp]*", + "macaddress": "909A4A*" + }, { "hostname": "hs*", "macaddress": "1C3BF3*" diff --git a/homeassistant/generated/dhcp.py b/homeassistant/generated/dhcp.py index 370a87e2575..34b0a468fc1 100644 --- a/homeassistant/generated/dhcp.py +++ b/homeassistant/generated/dhcp.py @@ -269,6 +269,16 @@ DHCP = [ "hostname": "ep*", "macaddress": "E848B8*" }, + { + "domain": "tplink", + "hostname": "k[lp]*", + "macaddress": "E848B8*" + }, + { + "domain": "tplink", + "hostname": "k[lp]*", + "macaddress": "909A4A*" + }, { "domain": "tplink", "hostname": "hs*", From 4438fc55e0de34cea625281581a86c6ab98849b5 Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Sat, 2 Oct 2021 22:53:19 +0200 Subject: [PATCH 024/162] Update pypoint to use v5 of backend API (#56934) --- homeassistant/components/point/manifest.json | 2 +- homeassistant/components/point/sensor.py | 8 -------- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/point/manifest.json b/homeassistant/components/point/manifest.json index fffb1b07f25..13a1ac5ce23 100644 --- a/homeassistant/components/point/manifest.json +++ b/homeassistant/components/point/manifest.json @@ -3,7 +3,7 @@ "name": "Minut Point", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/point", - "requirements": ["pypoint==2.1.0"], + "requirements": ["pypoint==2.2.0"], "dependencies": ["webhook", "http"], "codeowners": ["@fredrike"], "quality_scale": "gold", diff --git a/homeassistant/components/point/sensor.py b/homeassistant/components/point/sensor.py index 8d4ee69fca2..bb98ccb53d9 100644 --- a/homeassistant/components/point/sensor.py +++ b/homeassistant/components/point/sensor.py @@ -11,10 +11,8 @@ from homeassistant.components.sensor import ( ) from homeassistant.const import ( DEVICE_CLASS_HUMIDITY, - DEVICE_CLASS_PRESSURE, DEVICE_CLASS_TEMPERATURE, PERCENTAGE, - PRESSURE_HPA, SOUND_PRESSURE_WEIGHTED_DBA, TEMP_CELSIUS, ) @@ -50,12 +48,6 @@ SENSOR_TYPES: tuple[MinutPointSensorEntityDescription, ...] = ( device_class=DEVICE_CLASS_TEMPERATURE, native_unit_of_measurement=TEMP_CELSIUS, ), - MinutPointSensorEntityDescription( - key="pressure", - precision=0, - device_class=DEVICE_CLASS_PRESSURE, - native_unit_of_measurement=PRESSURE_HPA, - ), MinutPointSensorEntityDescription( key="humidity", precision=1, diff --git a/requirements_all.txt b/requirements_all.txt index 990b28276b0..db90da7d71f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1723,7 +1723,7 @@ pypjlink2==1.2.1 pyplaato==0.0.15 # homeassistant.components.point -pypoint==2.1.0 +pypoint==2.2.0 # homeassistant.components.profiler pyprof2calltree==1.4.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7bf3e73c6b5..b1d34061845 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1021,7 +1021,7 @@ pypck==0.7.10 pyplaato==0.0.15 # homeassistant.components.point -pypoint==2.1.0 +pypoint==2.2.0 # homeassistant.components.profiler pyprof2calltree==1.4.5 From 427200e258e679bc423edc849583b9469fe67123 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 2 Oct 2021 05:47:28 -0500 Subject: [PATCH 025/162] Bump PyFlume to 0.6.5 to fix compat with new JWT (#56936) Changelog: https://github.com/ChrisMandich/PyFlume/compare/5476fd67cfc8be768c0ea810d248f39399e038d1...v0.6.5 --- homeassistant/components/flume/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/flume/manifest.json b/homeassistant/components/flume/manifest.json index d689f5fb17f..cdad0dd3f0c 100644 --- a/homeassistant/components/flume/manifest.json +++ b/homeassistant/components/flume/manifest.json @@ -2,7 +2,7 @@ "domain": "flume", "name": "Flume", "documentation": "https://www.home-assistant.io/integrations/flume/", - "requirements": ["pyflume==0.5.5"], + "requirements": ["pyflume==0.6.5"], "codeowners": ["@ChrisMandich", "@bdraco"], "config_flow": true, "dhcp": [ diff --git a/requirements_all.txt b/requirements_all.txt index db90da7d71f..a8dd4b89005 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1480,7 +1480,7 @@ pyfireservicerota==0.0.43 pyflic==2.0.3 # homeassistant.components.flume -pyflume==0.5.5 +pyflume==0.6.5 # homeassistant.components.flunearyou pyflunearyou==2.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b1d34061845..1c7299da62b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -856,7 +856,7 @@ pyfido==2.1.1 pyfireservicerota==0.0.43 # homeassistant.components.flume -pyflume==0.5.5 +pyflume==0.6.5 # homeassistant.components.flunearyou pyflunearyou==2.0.2 From 14cddc75c2e8a6c5376cfb7c936015617236139d Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Sat, 2 Oct 2021 16:31:23 +0200 Subject: [PATCH 026/162] Add sleep_period to log for easier debugging (#56949) --- homeassistant/components/shelly/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/shelly/__init__.py b/homeassistant/components/shelly/__init__.py index ad0ad5f4387..b0df4d4cb7f 100644 --- a/homeassistant/components/shelly/__init__.py +++ b/homeassistant/components/shelly/__init__.py @@ -320,9 +320,11 @@ class BlockDeviceWrapper(update_coordinator.DataUpdateCoordinator): async def _async_update_data(self) -> None: """Fetch data.""" - if self.entry.data.get("sleep_period"): + if sleep_period := self.entry.data.get("sleep_period"): # Sleeping device, no point polling it, just mark it unavailable - raise update_coordinator.UpdateFailed("Sleeping device did not update") + raise update_coordinator.UpdateFailed( + f"Sleeping device did not update within {sleep_period} seconds interval" + ) _LOGGER.debug("Polling Shelly Block Device - %s", self.name) try: From e4d295c80a23108b7447ff468626e8f3b4f83544 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 2 Oct 2021 15:53:37 -0500 Subject: [PATCH 027/162] Add dhcp discovery for TPLink EP10 (#56955) --- homeassistant/components/tplink/manifest.json | 4 ++++ homeassistant/generated/dhcp.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/homeassistant/components/tplink/manifest.json b/homeassistant/components/tplink/manifest.json index 6712da00d0e..a24d95bbc75 100644 --- a/homeassistant/components/tplink/manifest.json +++ b/homeassistant/components/tplink/manifest.json @@ -45,6 +45,10 @@ "hostname": "hs*", "macaddress": "C006C3*" }, + { + "hostname": "ep*", + "macaddress": "003192*" + }, { "hostname": "k[lp]*", "macaddress": "003192*" diff --git a/homeassistant/generated/dhcp.py b/homeassistant/generated/dhcp.py index 34b0a468fc1..73343bdf157 100644 --- a/homeassistant/generated/dhcp.py +++ b/homeassistant/generated/dhcp.py @@ -309,6 +309,11 @@ DHCP = [ "hostname": "hs*", "macaddress": "C006C3*" }, + { + "domain": "tplink", + "hostname": "ep*", + "macaddress": "003192*" + }, { "domain": "tplink", "hostname": "k[lp]*", From 180316026ba1af4eaab51d5fc2d942664025c2d3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 2 Oct 2021 13:54:13 -0700 Subject: [PATCH 028/162] Bumped version to 2021.10.0b3 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 6c6e56f5927..058eeb13668 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b2" +PATCH_VERSION: Final = "0b3" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From fc373563bd75dcd19c7af69dc7e80696902f2d83 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 2 Oct 2021 23:16:29 +0200 Subject: [PATCH 029/162] Update frontend to 20211002.0 (#56963) --- homeassistant/components/frontend/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index cf1f8f052af..d6d38faab27 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -3,7 +3,7 @@ "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", "requirements": [ - "home-assistant-frontend==20210930.0" + "home-assistant-frontend==20211002.0" ], "dependencies": [ "api", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index f8c047e81f0..e7f0cb6a5c3 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -15,7 +15,7 @@ ciso8601==2.2.0 cryptography==3.4.8 emoji==1.5.0 hass-nabucasa==0.50.0 -home-assistant-frontend==20210930.0 +home-assistant-frontend==20211002.0 httpx==0.19.0 ifaddr==0.1.7 jinja2==3.0.1 diff --git a/requirements_all.txt b/requirements_all.txt index a8dd4b89005..506f88df9db 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -810,7 +810,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20210930.0 +home-assistant-frontend==20211002.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 1c7299da62b..15df8a9f94e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -485,7 +485,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20210930.0 +home-assistant-frontend==20211002.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From 2dac92df0c23f7f2342ca707281d13bcf700e5d7 Mon Sep 17 00:00:00 2001 From: Michael Chisholm Date: Mon, 4 Oct 2021 02:09:30 +1100 Subject: [PATCH 030/162] Disable discovery for dlna_dmr until it is more selective (#56950) --- .../components/dlna_dmr/manifest.json | 20 ------------------- homeassistant/generated/ssdp.py | 20 ------------------- 2 files changed, 40 deletions(-) diff --git a/homeassistant/components/dlna_dmr/manifest.json b/homeassistant/components/dlna_dmr/manifest.json index 002228e28b3..8ea4ab48e27 100644 --- a/homeassistant/components/dlna_dmr/manifest.json +++ b/homeassistant/components/dlna_dmr/manifest.json @@ -5,26 +5,6 @@ "documentation": "https://www.home-assistant.io/integrations/dlna_dmr", "requirements": ["async-upnp-client==0.22.4"], "dependencies": ["network", "ssdp"], - "ssdp": [ - { - "st": "urn:schemas-upnp-org:device:MediaRenderer:1" - }, - { - "st": "urn:schemas-upnp-org:device:MediaRenderer:2" - }, - { - "st": "urn:schemas-upnp-org:device:MediaRenderer:3" - }, - { - "nt": "urn:schemas-upnp-org:device:MediaRenderer:1" - }, - { - "nt": "urn:schemas-upnp-org:device:MediaRenderer:2" - }, - { - "nt": "urn:schemas-upnp-org:device:MediaRenderer:3" - } - ], "codeowners": ["@StevenLooman", "@chishm"], "iot_class": "local_push" } diff --git a/homeassistant/generated/ssdp.py b/homeassistant/generated/ssdp.py index b058f972229..e5e823b404a 100644 --- a/homeassistant/generated/ssdp.py +++ b/homeassistant/generated/ssdp.py @@ -83,26 +83,6 @@ SSDP = { "manufacturer": "DIRECTV" } ], - "dlna_dmr": [ - { - "st": "urn:schemas-upnp-org:device:MediaRenderer:1" - }, - { - "st": "urn:schemas-upnp-org:device:MediaRenderer:2" - }, - { - "st": "urn:schemas-upnp-org:device:MediaRenderer:3" - }, - { - "nt": "urn:schemas-upnp-org:device:MediaRenderer:1" - }, - { - "nt": "urn:schemas-upnp-org:device:MediaRenderer:2" - }, - { - "nt": "urn:schemas-upnp-org:device:MediaRenderer:3" - } - ], "fritz": [ { "st": "urn:schemas-upnp-org:device:fritzbox:1" From e454c6628a1a6602aed287b848a2f048b149b06e Mon Sep 17 00:00:00 2001 From: Oliver Ou Date: Sun, 3 Oct 2021 08:41:31 +0800 Subject: [PATCH 031/162] Fix Tuya v2 fan percentage (#56954) * fix:Some fans do not have a fan_speed_percent key * fix comment format issue Co-authored-by: erchuan --- homeassistant/components/tuya/fan.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/tuya/fan.py b/homeassistant/components/tuya/fan.py index dcfde0ded0f..15a8e553a10 100644 --- a/homeassistant/components/tuya/fan.py +++ b/homeassistant/components/tuya/fan.py @@ -211,7 +211,7 @@ class TuyaHaFan(TuyaHaEntity, FanEntity): return self.tuya_device.status[DPCODE_MODE] @property - def percentage(self) -> int: + def percentage(self) -> int | None: """Return the current speed.""" if not self.is_on: return 0 @@ -228,7 +228,8 @@ class TuyaHaFan(TuyaHaEntity, FanEntity): self.tuya_device.status[DPCODE_AP_FAN_SPEED_ENUM], ) - return self.tuya_device.status[DPCODE_FAN_SPEED] + # some type may not have the fan_speed_percent key + return self.tuya_device.status.get(DPCODE_FAN_SPEED) @property def speed_count(self) -> int: From 201be1a59d8d6dc0c5138bb0de042f10bca21da3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 2 Oct 2021 21:08:31 -1000 Subject: [PATCH 032/162] Fix yeelight state when controlled outside of Home Assistant (#56964) --- homeassistant/components/yeelight/__init__.py | 24 +- homeassistant/components/yeelight/light.py | 69 +++-- tests/components/yeelight/test_init.py | 5 +- tests/components/yeelight/test_light.py | 259 ++++++++++-------- 4 files changed, 201 insertions(+), 156 deletions(-) diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index a4ff947191e..e7f7b06f58f 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -36,6 +36,9 @@ from homeassistant.helpers.typing import ConfigType _LOGGER = logging.getLogger(__name__) +STATE_CHANGE_TIME = 0.25 # seconds + + DOMAIN = "yeelight" DATA_YEELIGHT = DOMAIN DATA_UPDATED = "yeelight_{}_data_updated" @@ -546,6 +549,17 @@ class YeelightScanner: self._async_stop_scan() +def update_needs_bg_power_workaround(data): + """Check if a push update needs the bg_power workaround. + + Some devices will push the incorrect state for bg_power. + + To work around this any time we are pushed an update + with bg_power, we force poll state which will be correct. + """ + return "bg_power" in data + + class YeelightDevice: """Represents single Yeelight device.""" @@ -692,12 +706,18 @@ class YeelightDevice: await self._async_update_properties() async_dispatcher_send(self._hass, DATA_UPDATED.format(self._host)) + async def _async_forced_update(self, _now): + """Call a forced update.""" + await self.async_update(True) + @callback def async_update_callback(self, data): """Update push from device.""" was_available = self._available self._available = data.get(KEY_CONNECTED, True) - if self._did_first_update and not was_available and self._available: + if update_needs_bg_power_workaround(data) or ( + self._did_first_update and not was_available and self._available + ): # On reconnect the properties may be out of sync # # We need to make sure the DEVICE_INITIALIZED dispatcher is setup @@ -708,7 +728,7 @@ class YeelightDevice: # to be called when async_setup_entry reaches the end of the # function # - asyncio.create_task(self.async_update(True)) + async_call_later(self._hass, STATE_CHANGE_TIME, self._async_forced_update) async_dispatcher_send(self._hass, DATA_UPDATED.format(self._host)) diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 3f5bb29bab7..69dde0e75b6 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -1,7 +1,6 @@ """Light platform support for yeelight.""" from __future__ import annotations -import asyncio import logging import math @@ -210,9 +209,6 @@ SERVICE_SCHEMA_SET_AUTO_DELAY_OFF_SCENE = { } -STATE_CHANGE_TIME = 0.25 # seconds - - @callback def _transitions_config_parser(transitions): """Parse transitions config into initialized objects.""" @@ -252,13 +248,15 @@ def _async_cmd(func): # A network error happened, the bulb is likely offline now self.device.async_mark_unavailable() self.async_write_ha_state() + exc_message = str(ex) or type(ex) raise HomeAssistantError( - f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {ex}" + f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" ) from ex except BULB_EXCEPTIONS as ex: # The bulb likely responded but had an error + exc_message = str(ex) or type(ex) raise HomeAssistantError( - f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {ex}" + f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" ) from ex return _async_wrap @@ -762,11 +760,6 @@ class YeelightGenericLight(YeelightEntity, LightEntity): if self.config[CONF_SAVE_ON_CHANGE] and (brightness or colortemp or rgb): await self.async_set_default() - # Some devices (mainly nightlights) will not send back the on state so we need to force a refresh - await asyncio.sleep(STATE_CHANGE_TIME) - if not self.is_on: - await self.device.async_update(True) - @_async_cmd async def _async_turn_off(self, duration) -> None: """Turn off with a given transition duration wrapped with _async_cmd.""" @@ -782,10 +775,6 @@ class YeelightGenericLight(YeelightEntity, LightEntity): duration = int(kwargs.get(ATTR_TRANSITION) * 1000) # kwarg in s await self._async_turn_off(duration) - # Some devices will not send back the off state so we need to force a refresh - await asyncio.sleep(STATE_CHANGE_TIME) - if self.is_on: - await self.device.async_update(True) @_async_cmd async def async_set_mode(self, mode: str): @@ -850,10 +839,8 @@ class YeelightNightLightSupport: return PowerMode.NORMAL -class YeelightColorLightWithoutNightlightSwitch( - YeelightColorLightSupport, YeelightGenericLight -): - """Representation of a Color Yeelight light.""" +class YeelightWithoutNightlightSwitchMixIn: + """A mix-in for yeelights without a nightlight switch.""" @property def _brightness_property(self): @@ -861,9 +848,25 @@ class YeelightColorLightWithoutNightlightSwitch( # want to "current_brightness" since it will check # "bg_power" and main light could still be on if self.device.is_nightlight_enabled: - return "current_brightness" + return "nl_br" return super()._brightness_property + @property + def color_temp(self) -> int: + """Return the color temperature.""" + if self.device.is_nightlight_enabled: + # Enabling the nightlight locks the colortemp to max + return self._max_mireds + return super().color_temp + + +class YeelightColorLightWithoutNightlightSwitch( + YeelightColorLightSupport, + YeelightWithoutNightlightSwitchMixIn, + YeelightGenericLight, +): + """Representation of a Color Yeelight light.""" + class YeelightColorLightWithNightlightSwitch( YeelightNightLightSupport, YeelightColorLightSupport, YeelightGenericLight @@ -880,19 +883,12 @@ class YeelightColorLightWithNightlightSwitch( class YeelightWhiteTempWithoutNightlightSwitch( - YeelightWhiteTempLightSupport, YeelightGenericLight + YeelightWhiteTempLightSupport, + YeelightWithoutNightlightSwitchMixIn, + YeelightGenericLight, ): """White temp light, when nightlight switch is not set to light.""" - @property - def _brightness_property(self): - # If the nightlight is not active, we do not - # want to "current_brightness" since it will check - # "bg_power" and main light could still be on - if self.device.is_nightlight_enabled: - return "current_brightness" - return super()._brightness_property - class YeelightWithNightLight( YeelightNightLightSupport, YeelightWhiteTempLightSupport, YeelightGenericLight @@ -911,6 +907,9 @@ class YeelightWithNightLight( class YeelightNightLightMode(YeelightGenericLight): """Representation of a Yeelight when in nightlight mode.""" + _attr_color_mode = COLOR_MODE_BRIGHTNESS + _attr_supported_color_modes = {COLOR_MODE_BRIGHTNESS} + @property def unique_id(self) -> str: """Return a unique ID.""" @@ -941,8 +940,9 @@ class YeelightNightLightMode(YeelightGenericLight): return PowerMode.MOONLIGHT @property - def _predefined_effects(self): - return YEELIGHT_TEMP_ONLY_EFFECT_LIST + def supported_features(self): + """Flag no supported features.""" + return 0 class YeelightNightLightModeWithAmbientSupport(YeelightNightLightMode): @@ -962,11 +962,6 @@ class YeelightNightLightModeWithoutBrightnessControl(YeelightNightLightMode): _attr_color_mode = COLOR_MODE_ONOFF _attr_supported_color_modes = {COLOR_MODE_ONOFF} - @property - def supported_features(self): - """Flag no supported features.""" - return 0 - class YeelightWithAmbientWithoutNightlight(YeelightWhiteTempWithoutNightlightSwitch): """Representation of a Yeelight which has ambilight support. diff --git a/tests/components/yeelight/test_init.py b/tests/components/yeelight/test_init.py index cee798308c4..aed2025ab5d 100644 --- a/tests/components/yeelight/test_init.py +++ b/tests/components/yeelight/test_init.py @@ -13,6 +13,7 @@ from homeassistant.components.yeelight import ( DATA_DEVICE, DOMAIN, NIGHTLIGHT_SWITCH_TYPE_LIGHT, + STATE_CHANGE_TIME, ) from homeassistant.config_entries import ConfigEntryState from homeassistant.const import ( @@ -458,6 +459,8 @@ async def test_connection_dropped_resyncs_properties(hass: HomeAssistant): await hass.async_block_till_done() assert len(mocked_bulb.async_get_properties.mock_calls) == 1 mocked_bulb._async_callback({KEY_CONNECTED: True}) - await hass.async_block_till_done() + async_fire_time_changed( + hass, dt_util.utcnow() + timedelta(seconds=STATE_CHANGE_TIME) + ) await hass.async_block_till_done() assert len(mocked_bulb.async_get_properties.mock_calls) == 2 diff --git a/tests/components/yeelight/test_light.py b/tests/components/yeelight/test_light.py index f4cae17a30c..fd6e12f2635 100644 --- a/tests/components/yeelight/test_light.py +++ b/tests/components/yeelight/test_light.py @@ -545,25 +545,27 @@ async def test_update_errors(hass: HomeAssistant, caplog): # Timeout usually means the bulb is overloaded with commands # but will still respond eventually. - mocked_bulb.async_get_properties = AsyncMock(side_effect=asyncio.TimeoutError) - await hass.services.async_call( - "light", - SERVICE_TURN_OFF, - {ATTR_ENTITY_ID: ENTITY_LIGHT}, - blocking=True, - ) + mocked_bulb.async_turn_off = AsyncMock(side_effect=asyncio.TimeoutError) + with pytest.raises(HomeAssistantError): + await hass.services.async_call( + "light", + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: ENTITY_LIGHT}, + blocking=True, + ) assert hass.states.get(ENTITY_LIGHT).state == STATE_ON # socket.error usually means the bulb dropped the connection # or lost wifi, then came back online and forced the existing # connection closed with a TCP RST - mocked_bulb.async_get_properties = AsyncMock(side_effect=socket.error) - await hass.services.async_call( - "light", - SERVICE_TURN_OFF, - {ATTR_ENTITY_ID: ENTITY_LIGHT}, - blocking=True, - ) + mocked_bulb.async_turn_off = AsyncMock(side_effect=socket.error) + with pytest.raises(HomeAssistantError): + await hass.services.async_call( + "light", + SERVICE_TURN_OFF, + {ATTR_ENTITY_ID: ENTITY_LIGHT}, + blocking=True, + ) assert hass.states.get(ENTITY_LIGHT).state == STATE_UNAVAILABLE @@ -572,6 +574,7 @@ async def test_state_already_set_avoid_ratelimit(hass: HomeAssistant): mocked_bulb = _mocked_bulb() properties = {**PROPERTIES} properties.pop("active_mode") + properties.pop("nl_br") properties["color_mode"] = "3" # HSV mocked_bulb.last_properties = properties mocked_bulb.bulb_type = BulbType.Color @@ -579,7 +582,9 @@ async def test_state_already_set_avoid_ratelimit(hass: HomeAssistant): domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: False} ) config_entry.add_to_hass(hass) - with patch(f"{MODULE}.AsyncBulb", return_value=mocked_bulb): + with _patch_discovery(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=mocked_bulb + ): assert await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() # We use asyncio.create_task now to avoid @@ -623,7 +628,7 @@ async def test_state_already_set_avoid_ratelimit(hass: HomeAssistant): SERVICE_TURN_ON, { ATTR_ENTITY_ID: ENTITY_LIGHT, - ATTR_BRIGHTNESS_PCT: PROPERTIES["current_brightness"], + ATTR_BRIGHTNESS_PCT: PROPERTIES["bright"], }, blocking=True, ) @@ -696,9 +701,10 @@ async def test_device_types(hass: HomeAssistant, caplog): bulb_type, model, target_properties, - nightlight_properties=None, + nightlight_entity_properties=None, name=UNIQUE_FRIENDLY_NAME, entity_id=ENTITY_LIGHT, + nightlight_mode_properties=None, ): config_entry = MockConfigEntry( domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: False} @@ -708,6 +714,9 @@ async def test_device_types(hass: HomeAssistant, caplog): mocked_bulb.bulb_type = bulb_type model_specs = _MODEL_SPECS.get(model) type(mocked_bulb).get_model_specs = MagicMock(return_value=model_specs) + original_nightlight_brightness = mocked_bulb.last_properties["nl_br"] + + mocked_bulb.last_properties["nl_br"] = "0" await _async_setup(config_entry) state = hass.states.get(entity_id) @@ -715,41 +724,58 @@ async def test_device_types(hass: HomeAssistant, caplog): assert state.state == "on" target_properties["friendly_name"] = name target_properties["flowing"] = False - target_properties["night_light"] = True + target_properties["night_light"] = False target_properties["music_mode"] = False assert dict(state.attributes) == target_properties - await hass.config_entries.async_unload(config_entry.entry_id) await config_entry.async_remove(hass) registry = er.async_get(hass) registry.async_clear_config_entry(config_entry.entry_id) + mocked_bulb.last_properties["nl_br"] = original_nightlight_brightness - # nightlight - if nightlight_properties is None: - return - config_entry = MockConfigEntry( - domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: True} - ) - config_entry.add_to_hass(hass) - await _async_setup(config_entry) + # nightlight as a setting of the main entity + if nightlight_mode_properties is not None: + mocked_bulb.last_properties["active_mode"] = True + config_entry.add_to_hass(hass) + await _async_setup(config_entry) + state = hass.states.get(entity_id) + assert state.state == "on" + nightlight_mode_properties["friendly_name"] = name + nightlight_mode_properties["flowing"] = False + nightlight_mode_properties["night_light"] = True + nightlight_mode_properties["music_mode"] = False + assert dict(state.attributes) == nightlight_mode_properties - assert hass.states.get(entity_id).state == "off" - state = hass.states.get(f"{entity_id}_nightlight") - assert state.state == "on" - nightlight_properties["friendly_name"] = f"{name} Nightlight" - nightlight_properties["icon"] = "mdi:weather-night" - nightlight_properties["flowing"] = False - nightlight_properties["night_light"] = True - nightlight_properties["music_mode"] = False - assert dict(state.attributes) == nightlight_properties + await hass.config_entries.async_unload(config_entry.entry_id) + await config_entry.async_remove(hass) + registry.async_clear_config_entry(config_entry.entry_id) + await hass.async_block_till_done() + mocked_bulb.last_properties.pop("active_mode") - await hass.config_entries.async_unload(config_entry.entry_id) - await config_entry.async_remove(hass) - registry.async_clear_config_entry(config_entry.entry_id) - await hass.async_block_till_done() + # nightlight as a separate entity + if nightlight_entity_properties is not None: + config_entry = MockConfigEntry( + domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: True} + ) + config_entry.add_to_hass(hass) + await _async_setup(config_entry) + + assert hass.states.get(entity_id).state == "off" + state = hass.states.get(f"{entity_id}_nightlight") + assert state.state == "on" + nightlight_entity_properties["friendly_name"] = f"{name} Nightlight" + nightlight_entity_properties["icon"] = "mdi:weather-night" + nightlight_entity_properties["flowing"] = False + nightlight_entity_properties["night_light"] = True + nightlight_entity_properties["music_mode"] = False + assert dict(state.attributes) == nightlight_entity_properties + + await hass.config_entries.async_unload(config_entry.entry_id) + await config_entry.async_remove(hass) + registry.async_clear_config_entry(config_entry.entry_id) + await hass.async_block_till_done() bright = round(255 * int(PROPERTIES["bright"]) / 100) - current_brightness = round(255 * int(PROPERTIES["current_brightness"]) / 100) ct = color_temperature_kelvin_to_mired(int(PROPERTIES["ct"])) hue = int(PROPERTIES["hue"]) sat = int(PROPERTIES["sat"]) @@ -806,7 +832,7 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "color_temp": ct, "color_mode": "color_temp", "supported_color_modes": ["color_temp", "hs", "rgb"], @@ -814,11 +840,30 @@ async def test_device_types(hass: HomeAssistant, caplog): "rgb_color": (255, 205, 166), "xy_color": (0.421, 0.364), }, - { + nightlight_entity_properties={ "supported_features": 0, "color_mode": "onoff", "supported_color_modes": ["onoff"], }, + nightlight_mode_properties={ + "effect_list": YEELIGHT_COLOR_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "hs_color": (28.401, 100.0), + "rgb_color": (255, 120, 0), + "xy_color": (0.621, 0.367), + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": nl_br, + "color_mode": "color_temp", + "supported_color_modes": ["color_temp", "hs", "rgb"], + "color_temp": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + }, ) # Color - color mode HS @@ -836,14 +881,14 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "hs_color": hs_color, "rgb_color": color_hs_to_RGB(*hs_color), "xy_color": color_hs_to_xy(*hs_color), "color_mode": "hs", "supported_color_modes": ["color_temp", "hs", "rgb"], }, - { + nightlight_entity_properties={ "supported_features": 0, "color_mode": "onoff", "supported_color_modes": ["onoff"], @@ -865,14 +910,14 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "hs_color": color_RGB_to_hs(*rgb_color), "rgb_color": rgb_color, "xy_color": color_RGB_to_xy(*rgb_color), "color_mode": "rgb", "supported_color_modes": ["color_temp", "hs", "rgb"], }, - { + nightlight_entity_properties={ "supported_features": 0, "color_mode": "onoff", "supported_color_modes": ["onoff"], @@ -895,11 +940,11 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "color_mode": "hs", "supported_color_modes": ["color_temp", "hs", "rgb"], }, - { + nightlight_entity_properties={ "supported_features": 0, "color_mode": "onoff", "supported_color_modes": ["onoff"], @@ -922,11 +967,11 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "color_mode": "rgb", "supported_color_modes": ["color_temp", "hs", "rgb"], }, - { + nightlight_entity_properties={ "supported_features": 0, "color_mode": "onoff", "supported_color_modes": ["onoff"], @@ -973,7 +1018,7 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "color_temp": ct, "color_mode": "color_temp", "supported_color_modes": ["color_temp"], @@ -981,13 +1026,31 @@ async def test_device_types(hass: HomeAssistant, caplog): "rgb_color": (255, 205, 166), "xy_color": (0.421, 0.364), }, - { - "effect_list": YEELIGHT_TEMP_ONLY_EFFECT_LIST, - "supported_features": SUPPORT_YEELIGHT, + nightlight_entity_properties={ + "supported_features": 0, "brightness": nl_br, "color_mode": "brightness", "supported_color_modes": ["brightness"], }, + nightlight_mode_properties={ + "effect_list": YEELIGHT_TEMP_ONLY_EFFECT_LIST, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": nl_br, + "color_temp": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "color_mode": "color_temp", + "supported_color_modes": ["color_temp"], + "hs_color": (28.391, 65.659), + "rgb_color": (255, 166, 87), + "xy_color": (0.526, 0.387), + }, ) # WhiteTempMood @@ -1009,7 +1072,7 @@ async def test_device_types(hass: HomeAssistant, caplog): "max_mireds": color_temperature_kelvin_to_mired( model_specs["color_temp"]["min"] ), - "brightness": current_brightness, + "brightness": bright, "color_temp": ct, "color_mode": "color_temp", "supported_color_modes": ["color_temp"], @@ -1017,13 +1080,34 @@ async def test_device_types(hass: HomeAssistant, caplog): "rgb_color": (255, 205, 166), "xy_color": (0.421, 0.364), }, - { - "effect_list": YEELIGHT_TEMP_ONLY_EFFECT_LIST, - "supported_features": SUPPORT_YEELIGHT, + nightlight_entity_properties={ + "supported_features": 0, "brightness": nl_br, "color_mode": "brightness", "supported_color_modes": ["brightness"], }, + nightlight_mode_properties={ + "friendly_name": NAME, + "effect_list": YEELIGHT_TEMP_ONLY_EFFECT_LIST, + "flowing": False, + "night_light": True, + "supported_features": SUPPORT_YEELIGHT, + "min_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["max"] + ), + "max_mireds": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "brightness": nl_br, + "color_temp": color_temperature_kelvin_to_mired( + model_specs["color_temp"]["min"] + ), + "color_mode": "color_temp", + "supported_color_modes": ["color_temp"], + "hs_color": (28.391, 65.659), + "rgb_color": (255, 166, 87), + "xy_color": (0.526, 0.387), + }, ) # Background light - color mode CT mocked_bulb.last_properties["bg_lmode"] = "2" # CT @@ -1261,62 +1345,6 @@ async def test_effects(hass: HomeAssistant): await _async_test_effect("not_existed", called=False) -async def test_state_fails_to_update_triggers_update(hass: HomeAssistant): - """Ensure we call async_get_properties if the turn on/off fails to update the state.""" - mocked_bulb = _mocked_bulb() - properties = {**PROPERTIES} - properties.pop("active_mode") - properties["color_mode"] = "3" # HSV - mocked_bulb.last_properties = properties - mocked_bulb.bulb_type = BulbType.Color - config_entry = MockConfigEntry( - domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: False} - ) - config_entry.add_to_hass(hass) - with patch(f"{MODULE}.AsyncBulb", return_value=mocked_bulb): - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() - # We use asyncio.create_task now to avoid - # blocking starting so we need to block again - await hass.async_block_till_done() - - mocked_bulb.last_properties["power"] = "off" - await hass.services.async_call( - "light", - SERVICE_TURN_ON, - { - ATTR_ENTITY_ID: ENTITY_LIGHT, - }, - blocking=True, - ) - assert len(mocked_bulb.async_turn_on.mock_calls) == 1 - assert len(mocked_bulb.async_get_properties.mock_calls) == 2 - - mocked_bulb.last_properties["power"] = "on" - await hass.services.async_call( - "light", - SERVICE_TURN_OFF, - { - ATTR_ENTITY_ID: ENTITY_LIGHT, - }, - blocking=True, - ) - assert len(mocked_bulb.async_turn_off.mock_calls) == 1 - assert len(mocked_bulb.async_get_properties.mock_calls) == 3 - - # But if the state is correct no calls - await hass.services.async_call( - "light", - SERVICE_TURN_ON, - { - ATTR_ENTITY_ID: ENTITY_LIGHT, - }, - blocking=True, - ) - assert len(mocked_bulb.async_turn_on.mock_calls) == 1 - assert len(mocked_bulb.async_get_properties.mock_calls) == 3 - - async def test_ambilight_with_nightlight_disabled(hass: HomeAssistant): """Test that main light on ambilights with the nightlight disabled shows the correct brightness.""" mocked_bulb = _mocked_bulb() @@ -1325,7 +1353,6 @@ async def test_ambilight_with_nightlight_disabled(hass: HomeAssistant): capabilities["model"] = "ceiling10" properties["color_mode"] = "3" # HSV properties["bg_power"] = "off" - properties["current_brightness"] = 0 properties["bg_lmode"] = "2" # CT mocked_bulb.last_properties = properties mocked_bulb.bulb_type = BulbType.WhiteTempMood From a527c451c38747e5d561b5ade69af3954603019a Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sat, 2 Oct 2021 18:58:10 -0600 Subject: [PATCH 033/162] Fix incorrect handling of hass.data in WattTime setup (#56971) --- homeassistant/components/watttime/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/watttime/__init__.py b/homeassistant/components/watttime/__init__.py index 6d23182c011..8b3a83aa8d1 100644 --- a/homeassistant/components/watttime/__init__.py +++ b/homeassistant/components/watttime/__init__.py @@ -27,7 +27,8 @@ PLATFORMS: list[str] = ["sensor"] async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up WattTime from a config entry.""" - hass.data.setdefault(DOMAIN, {entry.entry_id: {DATA_COORDINATOR: {}}}) + hass.data.setdefault(DOMAIN, {}) + hass.data[DOMAIN][entry.entry_id] = {} session = aiohttp_client.async_get_clientsession(hass) From 7203f58b69b75043e0dcb1211ee935d181e3eb85 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Sun, 3 Oct 2021 13:07:17 +0300 Subject: [PATCH 034/162] Bump aioshelly to 1.0.2 (#56980) --- homeassistant/components/shelly/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/shelly/manifest.json b/homeassistant/components/shelly/manifest.json index ca092295473..09a046ee78d 100644 --- a/homeassistant/components/shelly/manifest.json +++ b/homeassistant/components/shelly/manifest.json @@ -3,7 +3,7 @@ "name": "Shelly", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/shelly", - "requirements": ["aioshelly==1.0.1"], + "requirements": ["aioshelly==1.0.2"], "zeroconf": [ { "type": "_http._tcp.local.", diff --git a/requirements_all.txt b/requirements_all.txt index 506f88df9db..7172a8f7e1d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -243,7 +243,7 @@ aiopylgtv==0.4.0 aiorecollect==1.0.8 # homeassistant.components.shelly -aioshelly==1.0.1 +aioshelly==1.0.2 # homeassistant.components.switcher_kis aioswitcher==2.0.6 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 15df8a9f94e..e197992d626 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -167,7 +167,7 @@ aiopylgtv==0.4.0 aiorecollect==1.0.8 # homeassistant.components.shelly -aioshelly==1.0.1 +aioshelly==1.0.2 # homeassistant.components.switcher_kis aioswitcher==2.0.6 From 757c5b92010511b26b2919dd5d9d49b45ce7764b Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Sun, 3 Oct 2021 19:29:01 +0200 Subject: [PATCH 035/162] Fix upnp invalid key in ssdp discovery_info (#56986) --- homeassistant/components/upnp/config_flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/upnp/config_flow.py b/homeassistant/components/upnp/config_flow.py index 9352ae0a5ff..d1c2c4b3c0f 100644 --- a/homeassistant/components/upnp/config_flow.py +++ b/homeassistant/components/upnp/config_flow.py @@ -273,7 +273,7 @@ class UpnpFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): title = _friendly_name_from_discovery(discovery) data = { - CONFIG_ENTRY_UDN: discovery["_udn"], + CONFIG_ENTRY_UDN: discovery[ssdp.ATTR_UPNP_UDN], CONFIG_ENTRY_ST: discovery[ssdp.ATTR_SSDP_ST], CONFIG_ENTRY_HOSTNAME: discovery["_host"], } From 6f396325837e282a91cd5682de061a903edc3e25 Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Sun, 3 Oct 2021 19:28:41 +0200 Subject: [PATCH 036/162] Bump async-upnp-client to 0.22.5 (#56989) --- homeassistant/components/dlna_dmr/manifest.json | 2 +- homeassistant/components/ssdp/manifest.json | 2 +- homeassistant/components/upnp/manifest.json | 2 +- homeassistant/components/yeelight/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/dlna_dmr/manifest.json b/homeassistant/components/dlna_dmr/manifest.json index 8ea4ab48e27..53bee3d8519 100644 --- a/homeassistant/components/dlna_dmr/manifest.json +++ b/homeassistant/components/dlna_dmr/manifest.json @@ -3,7 +3,7 @@ "name": "DLNA Digital Media Renderer", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/dlna_dmr", - "requirements": ["async-upnp-client==0.22.4"], + "requirements": ["async-upnp-client==0.22.5"], "dependencies": ["network", "ssdp"], "codeowners": ["@StevenLooman", "@chishm"], "iot_class": "local_push" diff --git a/homeassistant/components/ssdp/manifest.json b/homeassistant/components/ssdp/manifest.json index 3a6531fcacb..3e99a77e8bb 100644 --- a/homeassistant/components/ssdp/manifest.json +++ b/homeassistant/components/ssdp/manifest.json @@ -2,7 +2,7 @@ "domain": "ssdp", "name": "Simple Service Discovery Protocol (SSDP)", "documentation": "https://www.home-assistant.io/integrations/ssdp", - "requirements": ["async-upnp-client==0.22.4"], + "requirements": ["async-upnp-client==0.22.5"], "dependencies": ["network"], "after_dependencies": ["zeroconf"], "codeowners": [], diff --git a/homeassistant/components/upnp/manifest.json b/homeassistant/components/upnp/manifest.json index 6ab3896cfdb..9a1875777a6 100644 --- a/homeassistant/components/upnp/manifest.json +++ b/homeassistant/components/upnp/manifest.json @@ -3,7 +3,7 @@ "name": "UPnP/IGD", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/upnp", - "requirements": ["async-upnp-client==0.22.4"], + "requirements": ["async-upnp-client==0.22.5"], "dependencies": ["network", "ssdp"], "codeowners": ["@StevenLooman","@ehendrix23"], "ssdp": [ diff --git a/homeassistant/components/yeelight/manifest.json b/homeassistant/components/yeelight/manifest.json index ca6fe09fe53..cc40f07ce46 100644 --- a/homeassistant/components/yeelight/manifest.json +++ b/homeassistant/components/yeelight/manifest.json @@ -2,7 +2,7 @@ "domain": "yeelight", "name": "Yeelight", "documentation": "https://www.home-assistant.io/integrations/yeelight", - "requirements": ["yeelight==0.7.5", "async-upnp-client==0.22.4"], + "requirements": ["yeelight==0.7.5", "async-upnp-client==0.22.5"], "codeowners": ["@rytilahti", "@zewelor", "@shenxn", "@starkillerOG"], "config_flow": true, "dependencies": ["network"], diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index e7f0cb6a5c3..d69ae6d5e43 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -4,7 +4,7 @@ aiodiscover==1.4.4 aiohttp==3.7.4.post0 aiohttp_cors==0.7.0 astral==2.2 -async-upnp-client==0.22.4 +async-upnp-client==0.22.5 async_timeout==3.0.1 attrs==21.2.0 awesomeversion==21.8.1 diff --git a/requirements_all.txt b/requirements_all.txt index 7172a8f7e1d..f3b49ef91b1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -330,7 +330,7 @@ asterisk_mbox==0.5.0 # homeassistant.components.ssdp # homeassistant.components.upnp # homeassistant.components.yeelight -async-upnp-client==0.22.4 +async-upnp-client==0.22.5 # homeassistant.components.supla asyncpysupla==0.0.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index e197992d626..6c899f21f3e 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -224,7 +224,7 @@ arcam-fmj==0.7.0 # homeassistant.components.ssdp # homeassistant.components.upnp # homeassistant.components.yeelight -async-upnp-client==0.22.4 +async-upnp-client==0.22.5 # homeassistant.components.aurora auroranoaa==0.0.2 From 45b7922a6a97af8a8bdc08ea9b56338818cc83d7 Mon Sep 17 00:00:00 2001 From: Phil Cole Date: Mon, 4 Oct 2021 05:14:45 +0100 Subject: [PATCH 037/162] Use pycarwings2.12 for Nissan Leaf integration (#56996) --- homeassistant/components/nissan_leaf/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/nissan_leaf/manifest.json b/homeassistant/components/nissan_leaf/manifest.json index 55cd28d59fa..89e55cb69d9 100644 --- a/homeassistant/components/nissan_leaf/manifest.json +++ b/homeassistant/components/nissan_leaf/manifest.json @@ -2,7 +2,7 @@ "domain": "nissan_leaf", "name": "Nissan Leaf", "documentation": "https://www.home-assistant.io/integrations/nissan_leaf", - "requirements": ["pycarwings2==2.11"], + "requirements": ["pycarwings2==2.12"], "codeowners": ["@filcole"], "iot_class": "cloud_polling" } diff --git a/requirements_all.txt b/requirements_all.txt index f3b49ef91b1..f2cf40752f1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1381,7 +1381,7 @@ pyblackbird==0.5 pybotvac==0.0.22 # homeassistant.components.nissan_leaf -pycarwings2==2.11 +pycarwings2==2.12 # homeassistant.components.cloudflare pycfdns==1.2.1 From 5237817109283b328c6a3277e5eaa3f77497b6d4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Oct 2021 09:28:39 -1000 Subject: [PATCH 038/162] Round tplink energy sensors to prevent insignificant updates (#56999) - These sensors wobble quite a bit and the precision did not have sensible limits which generated a massive amount of data in the database which was not very useful --- homeassistant/components/tplink/sensor.py | 10 ++++++++-- tests/components/tplink/test_sensor.py | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/tplink/sensor.py b/homeassistant/components/tplink/sensor.py index 0afcf96dba5..9bd4a056d33 100644 --- a/homeassistant/components/tplink/sensor.py +++ b/homeassistant/components/tplink/sensor.py @@ -44,6 +44,7 @@ class TPLinkSensorEntityDescription(SensorEntityDescription): """Describes TPLink sensor entity.""" emeter_attr: str | None = None + precision: int | None = None ENERGY_SENSORS: tuple[TPLinkSensorEntityDescription, ...] = ( @@ -54,6 +55,7 @@ ENERGY_SENSORS: tuple[TPLinkSensorEntityDescription, ...] = ( state_class=STATE_CLASS_MEASUREMENT, name="Current Consumption", emeter_attr="power", + precision=1, ), TPLinkSensorEntityDescription( key=ATTR_TOTAL_ENERGY_KWH, @@ -62,6 +64,7 @@ ENERGY_SENSORS: tuple[TPLinkSensorEntityDescription, ...] = ( state_class=STATE_CLASS_TOTAL_INCREASING, name="Total Consumption", emeter_attr="total", + precision=3, ), TPLinkSensorEntityDescription( key=ATTR_TODAY_ENERGY_KWH, @@ -69,6 +72,7 @@ ENERGY_SENSORS: tuple[TPLinkSensorEntityDescription, ...] = ( device_class=DEVICE_CLASS_ENERGY, state_class=STATE_CLASS_TOTAL_INCREASING, name="Today's Consumption", + precision=3, ), TPLinkSensorEntityDescription( key=ATTR_VOLTAGE, @@ -77,6 +81,7 @@ ENERGY_SENSORS: tuple[TPLinkSensorEntityDescription, ...] = ( state_class=STATE_CLASS_MEASUREMENT, name="Voltage", emeter_attr="voltage", + precision=1, ), TPLinkSensorEntityDescription( key=ATTR_CURRENT_A, @@ -85,6 +90,7 @@ ENERGY_SENSORS: tuple[TPLinkSensorEntityDescription, ...] = ( state_class=STATE_CLASS_MEASUREMENT, name="Current", emeter_attr="current", + precision=2, ), ) @@ -97,11 +103,11 @@ def async_emeter_from_device( val = getattr(device.emeter_realtime, attr) if val is None: return None - return cast(float, val) + return round(cast(float, val), description.precision) # ATTR_TODAY_ENERGY_KWH if (emeter_today := device.emeter_today) is not None: - return cast(float, emeter_today) + return round(cast(float, emeter_today), description.precision) # today's consumption not available, when device was off all the day # bulb's do not report this information, so filter it out return None if device.is_bulb else 0.0 diff --git a/tests/components/tplink/test_sensor.py b/tests/components/tplink/test_sensor.py index 839588d2756..5413e036d96 100644 --- a/tests/components/tplink/test_sensor.py +++ b/tests/components/tplink/test_sensor.py @@ -34,14 +34,14 @@ async def test_color_light_with_an_emeter(hass: HomeAssistant) -> None: voltage=None, current=5, ) - bulb.emeter_today = 5000 + bulb.emeter_today = 5000.0036 with _patch_discovery(device=bulb), _patch_single_discovery(device=bulb): await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}}) await hass.async_block_till_done() await hass.async_block_till_done() expected = { - "sensor.my_bulb_today_s_consumption": 5000, + "sensor.my_bulb_today_s_consumption": 5000.004, "sensor.my_bulb_current": 5, } entity_id = "light.my_bulb" @@ -69,10 +69,10 @@ async def test_plug_with_an_emeter(hass: HomeAssistant) -> None: plug.color_temp = None plug.has_emeter = True plug.emeter_realtime = Mock( - power=100, - total=30, - voltage=121, - current=5, + power=100.06, + total=30.0049, + voltage=121.19, + current=5.035, ) plug.emeter_today = None with _patch_discovery(device=plug), _patch_single_discovery(device=plug): @@ -81,11 +81,11 @@ async def test_plug_with_an_emeter(hass: HomeAssistant) -> None: await hass.async_block_till_done() expected = { - "sensor.my_plug_current_consumption": 100, - "sensor.my_plug_total_consumption": 30, + "sensor.my_plug_current_consumption": 100.1, + "sensor.my_plug_total_consumption": 30.005, "sensor.my_plug_today_s_consumption": 0.0, - "sensor.my_plug_voltage": 121, - "sensor.my_plug_current": 5, + "sensor.my_plug_voltage": 121.2, + "sensor.my_plug_current": 5.04, } entity_id = "switch.my_plug" state = hass.states.get(entity_id) From 645cb53284cdedc463e878d6a65c2c7c99fc3802 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Oct 2021 13:07:25 -1000 Subject: [PATCH 039/162] Bump yeelight to 0.7.6 (#57009) - Fixes compat with Lamp15 model - May improvment Monob model drops seen in #56646 Changes: https://gitlab.com/stavros/python-yeelight/-/commit/0b94e5214e3375f20defa386067ef6cb058c872c --- homeassistant/components/yeelight/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/yeelight/manifest.json b/homeassistant/components/yeelight/manifest.json index cc40f07ce46..561606f5509 100644 --- a/homeassistant/components/yeelight/manifest.json +++ b/homeassistant/components/yeelight/manifest.json @@ -2,7 +2,7 @@ "domain": "yeelight", "name": "Yeelight", "documentation": "https://www.home-assistant.io/integrations/yeelight", - "requirements": ["yeelight==0.7.5", "async-upnp-client==0.22.5"], + "requirements": ["yeelight==0.7.6", "async-upnp-client==0.22.5"], "codeowners": ["@rytilahti", "@zewelor", "@shenxn", "@starkillerOG"], "config_flow": true, "dependencies": ["network"], diff --git a/requirements_all.txt b/requirements_all.txt index f2cf40752f1..3b7b04dfc9b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2459,7 +2459,7 @@ yalesmartalarmclient==0.3.4 yalexs==1.1.13 # homeassistant.components.yeelight -yeelight==0.7.5 +yeelight==0.7.6 # homeassistant.components.yeelightsunflower yeelightsunflower==0.0.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 6c899f21f3e..608b38434a6 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1403,7 +1403,7 @@ yalesmartalarmclient==0.3.4 yalexs==1.1.13 # homeassistant.components.yeelight -yeelight==0.7.5 +yeelight==0.7.6 # homeassistant.components.youless youless-api==0.13 From c22ec32726e50fab0f8dcf43c1b4263c87011086 Mon Sep 17 00:00:00 2001 From: Diogo Gomes Date: Mon, 4 Oct 2021 05:59:36 +0100 Subject: [PATCH 040/162] Ignore utility_meter restore state if state is invalid (#57010) Co-authored-by: Paulus Schoutsen --- .../components/utility_meter/sensor.py | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index 96bf12fdd4d..50185461030 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -1,5 +1,6 @@ """Utility meter from sensors providing raw data.""" from datetime import date, datetime, timedelta +import decimal from decimal import Decimal, DecimalException import logging @@ -323,19 +324,29 @@ class UtilityMeterSensor(RestoreEntity, SensorEntity): state = await self.async_get_last_state() if state: - self._state = Decimal(state.state) - self._unit_of_measurement = state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - self._last_period = ( - float(state.attributes.get(ATTR_LAST_PERIOD)) - if state.attributes.get(ATTR_LAST_PERIOD) - else 0 - ) - self._last_reset = dt_util.as_utc( - dt_util.parse_datetime(state.attributes.get(ATTR_LAST_RESET)) - ) - if state.attributes.get(ATTR_STATUS) == COLLECTING: - # Fake cancellation function to init the meter in similar state - self._collecting = lambda: None + try: + self._state = Decimal(state.state) + except decimal.InvalidOperation: + _LOGGER.error( + "Could not restore state <%s>. Resetting utility_meter.%s", + state.state, + self.name, + ) + else: + self._unit_of_measurement = state.attributes.get( + ATTR_UNIT_OF_MEASUREMENT + ) + self._last_period = ( + float(state.attributes.get(ATTR_LAST_PERIOD)) + if state.attributes.get(ATTR_LAST_PERIOD) + else 0 + ) + self._last_reset = dt_util.as_utc( + dt_util.parse_datetime(state.attributes.get(ATTR_LAST_RESET)) + ) + if state.attributes.get(ATTR_STATUS) == COLLECTING: + # Fake cancellation function to init the meter in similar state + self._collecting = lambda: None @callback def async_source_tracking(event): From ea2113d5d2f5a5dca8482ce6d264fbb01b3a7eff Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Mon, 4 Oct 2021 00:09:58 +0200 Subject: [PATCH 041/162] Bump pyatmo to v6.1.0 (#57014) --- homeassistant/components/netatmo/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/netatmo/manifest.json b/homeassistant/components/netatmo/manifest.json index f51f1a22f48..f162abbaad5 100644 --- a/homeassistant/components/netatmo/manifest.json +++ b/homeassistant/components/netatmo/manifest.json @@ -3,7 +3,7 @@ "name": "Netatmo", "documentation": "https://www.home-assistant.io/integrations/netatmo", "requirements": [ - "pyatmo==6.0.0" + "pyatmo==6.1.0" ], "after_dependencies": [ "cloud", diff --git a/requirements_all.txt b/requirements_all.txt index 3b7b04dfc9b..e5c58f55dd2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1360,7 +1360,7 @@ pyarlo==0.2.4 pyatag==0.3.5.3 # homeassistant.components.netatmo -pyatmo==6.0.0 +pyatmo==6.1.0 # homeassistant.components.atome pyatome==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 608b38434a6..3601b26a5f3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -799,7 +799,7 @@ pyarlo==0.2.4 pyatag==0.3.5.3 # homeassistant.components.netatmo -pyatmo==6.0.0 +pyatmo==6.1.0 # homeassistant.components.apple_tv pyatv==0.8.2 From 0084db3ad20f0660821309115c936469f76b8959 Mon Sep 17 00:00:00 2001 From: Oncleben31 Date: Mon, 4 Oct 2021 06:15:41 +0200 Subject: [PATCH 042/162] Meteofrance fix #56975 (#57016) --- .../components/meteo_france/sensor.py | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/meteo_france/sensor.py b/homeassistant/components/meteo_france/sensor.py index 9f24cf02a2c..1a5b3c4a33a 100644 --- a/homeassistant/components/meteo_france/sensor.py +++ b/homeassistant/components/meteo_france/sensor.py @@ -44,18 +44,23 @@ async def async_setup_entry( MeteoFranceSensor(coordinator_forecast, description) for description in SENSOR_TYPES ] - entities.extend( - [ - MeteoFranceRainSensor(coordinator_rain, description) - for description in SENSOR_TYPES_RAIN - ] - ) - entities.extend( - [ - MeteoFranceAlertSensor(coordinator_alert, description) - for description in SENSOR_TYPES_ALERT - ] - ) + # Add rain forecast entity only if location support this feature + if coordinator_rain: + entities.extend( + [ + MeteoFranceRainSensor(coordinator_rain, description) + for description in SENSOR_TYPES_RAIN + ] + ) + # Add weather alert entity only if location support this feature + if coordinator_alert: + entities.extend( + [ + MeteoFranceAlertSensor(coordinator_alert, description) + for description in SENSOR_TYPES_ALERT + ] + ) + # Add weather probability entities only if location support this feature if coordinator_forecast.data.probability_forecast: entities.extend( [ From 48fecc916ac075420973d164390d6732174c3138 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Mon, 4 Oct 2021 01:55:07 +0200 Subject: [PATCH 043/162] Fix camera tests (#57020) --- tests/components/netatmo/common.py | 11 +++++++++++ tests/components/netatmo/conftest.py | 3 ++- tests/components/netatmo/test_camera.py | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/components/netatmo/common.py b/tests/components/netatmo/common.py index 5ba989e2504..f2c03ac7de1 100644 --- a/tests/components/netatmo/common.py +++ b/tests/components/netatmo/common.py @@ -71,6 +71,17 @@ async def fake_post_request(*args, **kwargs): ) +async def fake_get_image(*args, **kwargs): + """Return fake data.""" + if "url" not in kwargs: + return "{}" + + endpoint = kwargs["url"].split("/")[-1] + + if endpoint in "snapshot_720.jpg": + return b"test stream image bytes" + + async def fake_post_request_no_data(*args, **kwargs): """Fake error during requesting backend data.""" return "{}" diff --git a/tests/components/netatmo/conftest.py b/tests/components/netatmo/conftest.py index d443802a41d..4d6bbb752f3 100644 --- a/tests/components/netatmo/conftest.py +++ b/tests/components/netatmo/conftest.py @@ -4,7 +4,7 @@ from unittest.mock import AsyncMock, patch import pytest -from .common import ALL_SCOPES, fake_post_request +from .common import ALL_SCOPES, fake_get_image, fake_post_request from tests.common import MockConfigEntry @@ -60,6 +60,7 @@ def netatmo_auth(): "homeassistant.components.netatmo.api.AsyncConfigEntryNetatmoAuth" ) as mock_auth: mock_auth.return_value.async_post_request.side_effect = fake_post_request + mock_auth.return_value.async_get_image.side_effect = fake_get_image mock_auth.return_value.async_addwebhook.side_effect = AsyncMock() mock_auth.return_value.async_dropwebhook.side_effect = AsyncMock() yield diff --git a/tests/components/netatmo/test_camera.py b/tests/components/netatmo/test_camera.py index c8132331bf3..45c8dc48b22 100644 --- a/tests/components/netatmo/test_camera.py +++ b/tests/components/netatmo/test_camera.py @@ -478,6 +478,7 @@ async def test_camera_image_raises_exception(hass, config_entry, requests_mock): "homeassistant.components.webhook.async_generate_url" ): mock_auth.return_value.async_post_request.side_effect = fake_post + mock_auth.return_value.async_get_image.side_effect = fake_post mock_auth.return_value.async_addwebhook.side_effect = AsyncMock() mock_auth.return_value.async_dropwebhook.side_effect = AsyncMock() From 779ae6c8015234347ac3fd5b6c1e6b0c6c68209b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 3 Oct 2021 14:40:27 -1000 Subject: [PATCH 044/162] Add DHCP support for TPLink KP400 (#57023) --- homeassistant/components/tplink/manifest.json | 4 ++++ homeassistant/generated/dhcp.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/homeassistant/components/tplink/manifest.json b/homeassistant/components/tplink/manifest.json index a24d95bbc75..0c45ca84ac6 100644 --- a/homeassistant/components/tplink/manifest.json +++ b/homeassistant/components/tplink/manifest.json @@ -9,6 +9,10 @@ "quality_scale": "platinum", "iot_class": "local_polling", "dhcp": [ + { + "hostname": "k[lp]*", + "macaddress": "403F8C*" + }, { "hostname": "ep*", "macaddress": "E848B8*" diff --git a/homeassistant/generated/dhcp.py b/homeassistant/generated/dhcp.py index 73343bdf157..6dcb3251e4e 100644 --- a/homeassistant/generated/dhcp.py +++ b/homeassistant/generated/dhcp.py @@ -264,6 +264,11 @@ DHCP = [ "hostname": "eneco-*", "macaddress": "74C63B*" }, + { + "domain": "tplink", + "hostname": "k[lp]*", + "macaddress": "403F8C*" + }, { "domain": "tplink", "hostname": "ep*", From 2d8684283f167f2f831f9d2bc2d49ff37dcd2d7e Mon Sep 17 00:00:00 2001 From: jjlawren Date: Sun, 3 Oct 2021 23:13:08 -0500 Subject: [PATCH 045/162] Shorten album titles when browsing artist (#57027) --- homeassistant/components/plex/helpers.py | 5 ++- tests/components/plex/test_browse_media.py | 45 +++++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/plex/helpers.py b/homeassistant/components/plex/helpers.py index be873614ba6..c534eca1f27 100644 --- a/homeassistant/components/plex/helpers.py +++ b/homeassistant/components/plex/helpers.py @@ -5,7 +5,10 @@ def pretty_title(media, short_name=False): """Return a formatted title for the given media item.""" year = None if media.type == "album": - title = f"{media.parentTitle} - {media.title}" + if short_name: + title = media.title + else: + title = f"{media.parentTitle} - {media.title}" elif media.type == "episode": title = f"{media.seasonEpisode.upper()} - {media.title}" if not short_name: diff --git a/tests/components/plex/test_browse_media.py b/tests/components/plex/test_browse_media.py index be4869839d2..d4ea73f6a97 100644 --- a/tests/components/plex/test_browse_media.py +++ b/tests/components/plex/test_browse_media.py @@ -46,6 +46,18 @@ class MockPlexEpisode: type = "episode" +class MockPlexArtist: + """Mock a plexapi Artist instance.""" + + ratingKey = 300 + title = "Artist" + type = "artist" + + def __iter__(self): + """Iterate over albums.""" + yield MockPlexAlbum() + + class MockPlexAlbum: """Mock a plexapi Album instance.""" @@ -53,7 +65,7 @@ class MockPlexAlbum: parentTitle = "Artist" title = "Album" type = "album" - year = 2001 + year = 2019 def __iter__(self): """Iterate over tracks.""" @@ -290,11 +302,13 @@ async def test_browse_media( assert result[ATTR_MEDIA_CONTENT_TYPE] == "library" assert result["title"] == "Music" - # Browse into a Plex album + # Browse into a Plex artist msg_id += 1 - mock_album = MockPlexAlbum() + mock_artist = MockPlexArtist() + mock_album = next(iter(MockPlexArtist())) + mock_track = next(iter(MockPlexAlbum())) with patch.object( - mock_plex_server, "fetch_item", return_value=mock_album + mock_plex_server, "fetch_item", return_value=mock_artist ) as mock_fetch: await websocket_client.send_json( { @@ -312,14 +326,35 @@ async def test_browse_media( msg = await websocket_client.receive_json() assert mock_fetch.called + assert msg["success"] + result = msg["result"] + result_id = int(result[ATTR_MEDIA_CONTENT_ID]) + assert result[ATTR_MEDIA_CONTENT_TYPE] == "artist" + assert result["title"] == mock_artist.title + assert result["children"][0]["title"] == f"{mock_album.title} ({mock_album.year})" + + # Browse into a Plex album + msg_id += 1 + await websocket_client.send_json( + { + "id": msg_id, + "type": "media_player/browse_media", + "entity_id": media_players[0], + ATTR_MEDIA_CONTENT_TYPE: result["children"][-1][ATTR_MEDIA_CONTENT_TYPE], + ATTR_MEDIA_CONTENT_ID: str(result["children"][-1][ATTR_MEDIA_CONTENT_ID]), + } + ) + msg = await websocket_client.receive_json() + assert msg["success"] result = msg["result"] result_id = int(result[ATTR_MEDIA_CONTENT_ID]) assert result[ATTR_MEDIA_CONTENT_TYPE] == "album" assert ( result["title"] - == f"{mock_album.parentTitle} - {mock_album.title} ({mock_album.year})" + == f"{mock_artist.title} - {mock_album.title} ({mock_album.year})" ) + assert result["children"][0]["title"] == f"{mock_track.index}. {mock_track.title}" # Browse into a non-existent TV season unknown_key = 99999999999999 From 6aad7510565c23f9342001f8b844604c1a0bfdac Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 3 Oct 2021 22:01:21 -0700 Subject: [PATCH 046/162] Bumped version to 2021.10.0b4 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 058eeb13668..d803b673e41 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b3" +PATCH_VERSION: Final = "0b4" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 8ee8aade8689517d98d92529d44563061b11fad7 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 4 Oct 2021 17:21:40 +0200 Subject: [PATCH 047/162] Evict purged states from recorder's old_state cache (#56877) Co-authored-by: J. Nick Koston --- homeassistant/components/recorder/purge.py | 51 ++++++++++---- tests/components/recorder/test_purge.py | 80 ++++++++++++---------- 2 files changed, 81 insertions(+), 50 deletions(-) diff --git a/homeassistant/components/recorder/purge.py b/homeassistant/components/recorder/purge.py index bc91f7ce67e..2b84a439871 100644 --- a/homeassistant/components/recorder/purge.py +++ b/homeassistant/components/recorder/purge.py @@ -38,7 +38,8 @@ def purge_old_data( event_ids = _select_event_ids_to_purge(session, purge_before) state_ids = _select_state_ids_to_purge(session, purge_before, event_ids) if state_ids: - _purge_state_ids(session, state_ids) + _purge_state_ids(instance, session, state_ids) + if event_ids: _purge_event_ids(session, event_ids) # If states or events purging isn't processing the purge_before yet, @@ -68,10 +69,10 @@ def _select_event_ids_to_purge(session: Session, purge_before: datetime) -> list def _select_state_ids_to_purge( session: Session, purge_before: datetime, event_ids: list[int] -) -> list[int]: +) -> set[int]: """Return a list of state ids to purge.""" if not event_ids: - return [] + return set() states = ( session.query(States.state_id) .filter(States.last_updated < purge_before) @@ -79,10 +80,10 @@ def _select_state_ids_to_purge( .all() ) _LOGGER.debug("Selected %s state ids to remove", len(states)) - return [state.state_id for state in states] + return {state.state_id for state in states} -def _purge_state_ids(session: Session, state_ids: list[int]) -> None: +def _purge_state_ids(instance: Recorder, session: Session, state_ids: set[int]) -> None: """Disconnect states and delete by state id.""" # Update old_state_id to NULL before deleting to ensure @@ -103,6 +104,26 @@ def _purge_state_ids(session: Session, state_ids: list[int]) -> None: ) _LOGGER.debug("Deleted %s states", deleted_rows) + # Evict eny entries in the old_states cache referring to a purged state + _evict_purged_states_from_old_states_cache(instance, state_ids) + + +def _evict_purged_states_from_old_states_cache( + instance: Recorder, purged_state_ids: set[int] +) -> None: + """Evict purged states from the old states cache.""" + # Make a map from old_state_id to entity_id + old_states = instance._old_states # pylint: disable=protected-access + old_state_reversed = { + old_state.state_id: entity_id + for entity_id, old_state in old_states.items() + if old_state.state_id + } + + # Evict any purged state from the old states cache + for purged_state_id in purged_state_ids.intersection(old_state_reversed): + old_states.pop(old_state_reversed[purged_state_id], None) + def _purge_event_ids(session: Session, event_ids: list[int]) -> None: """Delete by event id.""" @@ -139,7 +160,7 @@ def _purge_filtered_data(instance: Recorder, session: Session) -> bool: if not instance.entity_filter(entity_id) ] if len(excluded_entity_ids) > 0: - _purge_filtered_states(session, excluded_entity_ids) + _purge_filtered_states(instance, session, excluded_entity_ids) return False # Check if excluded event_types are in database @@ -149,13 +170,15 @@ def _purge_filtered_data(instance: Recorder, session: Session) -> bool: if event_type in instance.exclude_t ] if len(excluded_event_types) > 0: - _purge_filtered_events(session, excluded_event_types) + _purge_filtered_events(instance, session, excluded_event_types) return False return True -def _purge_filtered_states(session: Session, excluded_entity_ids: list[str]) -> None: +def _purge_filtered_states( + instance: Recorder, session: Session, excluded_entity_ids: list[str] +) -> None: """Remove filtered states and linked events.""" state_ids: list[int] event_ids: list[int | None] @@ -171,11 +194,13 @@ def _purge_filtered_states(session: Session, excluded_entity_ids: list[str]) -> _LOGGER.debug( "Selected %s state_ids to remove that should be filtered", len(state_ids) ) - _purge_state_ids(session, state_ids) + _purge_state_ids(instance, session, set(state_ids)) _purge_event_ids(session, event_ids) # type: ignore # type of event_ids already narrowed to 'list[int]' -def _purge_filtered_events(session: Session, excluded_event_types: list[str]) -> None: +def _purge_filtered_events( + instance: Recorder, session: Session, excluded_event_types: list[str] +) -> None: """Remove filtered events and linked states.""" events: list[Events] = ( session.query(Events.event_id) @@ -190,8 +215,8 @@ def _purge_filtered_events(session: Session, excluded_event_types: list[str]) -> states: list[States] = ( session.query(States.state_id).filter(States.event_id.in_(event_ids)).all() ) - state_ids: list[int] = [state.state_id for state in states] - _purge_state_ids(session, state_ids) + state_ids: set[int] = {state.state_id for state in states} + _purge_state_ids(instance, session, state_ids) _purge_event_ids(session, event_ids) @@ -207,7 +232,7 @@ def purge_entity_data(instance: Recorder, entity_filter: Callable[[str], bool]) _LOGGER.debug("Purging entity data for %s", selected_entity_ids) if len(selected_entity_ids) > 0: # Purge a max of MAX_ROWS_TO_PURGE, based on the oldest states or events record - _purge_filtered_states(session, selected_entity_ids) + _purge_filtered_states(instance, session, selected_entity_ids) _LOGGER.debug("Purging entity data hasn't fully completed yet") return False diff --git a/tests/components/recorder/test_purge.py b/tests/components/recorder/test_purge.py index 40ad71096c1..0e66beecd87 100644 --- a/tests/components/recorder/test_purge.py +++ b/tests/components/recorder/test_purge.py @@ -44,6 +44,7 @@ async def test_purge_old_states( events = session.query(Events).filter(Events.event_type == "state_changed") assert events.count() == 6 + assert "test.recorder2" in instance._old_states purge_before = dt_util.utcnow() - timedelta(days=4) @@ -51,6 +52,7 @@ async def test_purge_old_states( finished = purge_old_data(instance, purge_before, repack=False) assert not finished assert states.count() == 2 + assert "test.recorder2" in instance._old_states states_after_purge = session.query(States) assert states_after_purge[1].old_state_id == states_after_purge[0].state_id @@ -59,6 +61,28 @@ async def test_purge_old_states( finished = purge_old_data(instance, purge_before, repack=False) assert finished assert states.count() == 2 + assert "test.recorder2" in instance._old_states + + # run purge_old_data again + purge_before = dt_util.utcnow() + finished = purge_old_data(instance, purge_before, repack=False) + assert not finished + assert states.count() == 0 + assert "test.recorder2" not in instance._old_states + + # Add some more states + await _add_test_states(hass, instance) + + # make sure we start with 6 states + with session_scope(hass=hass) as session: + states = session.query(States) + assert states.count() == 6 + assert states[0].old_state_id is None + assert states[-1].old_state_id == states[-2].state_id + + events = session.query(Events).filter(Events.event_type == "state_changed") + assert events.count() == 6 + assert "test.recorder2" in instance._old_states async def test_purge_old_states_encouters_database_corruption( @@ -872,45 +896,27 @@ async def _add_test_states(hass: HomeAssistant, instance: recorder.Recorder): eleven_days_ago = utcnow - timedelta(days=11) attributes = {"test_attr": 5, "test_attr_10": "nice"} - await hass.async_block_till_done() - await async_wait_recording_done(hass, instance) + async def set_state(entity_id, state, **kwargs): + """Set the state.""" + hass.states.async_set(entity_id, state, **kwargs) + await hass.async_block_till_done() + await async_wait_recording_done(hass, instance) - with recorder.session_scope(hass=hass) as session: - old_state_id = None - for event_id in range(6): - if event_id < 2: - timestamp = eleven_days_ago - state = "autopurgeme" - elif event_id < 4: - timestamp = five_days_ago - state = "purgeme" - else: - timestamp = utcnow - state = "dontpurgeme" + for event_id in range(6): + if event_id < 2: + timestamp = eleven_days_ago + state = f"autopurgeme_{event_id}" + elif event_id < 4: + timestamp = five_days_ago + state = f"purgeme_{event_id}" + else: + timestamp = utcnow + state = f"dontpurgeme_{event_id}" - event = Events( - event_type="state_changed", - event_data="{}", - origin="LOCAL", - created=timestamp, - time_fired=timestamp, - ) - session.add(event) - session.flush() - state = States( - entity_id="test.recorder2", - domain="sensor", - state=state, - attributes=json.dumps(attributes), - last_changed=timestamp, - last_updated=timestamp, - created=timestamp, - event_id=event.event_id, - old_state_id=old_state_id, - ) - session.add(state) - session.flush() - old_state_id = state.state_id + with patch( + "homeassistant.components.recorder.dt_util.utcnow", return_value=timestamp + ): + await set_state("test.recorder2", state, attributes=attributes) async def _add_test_events(hass: HomeAssistant, instance: recorder.Recorder): From d1f36027321582e02762eeea9bc9127543fa75f0 Mon Sep 17 00:00:00 2001 From: Oliver Ou Date: Mon, 4 Oct 2021 16:45:37 +0800 Subject: [PATCH 048/162] Fix Tuya v2 login issue (#56973) * fix login issue * fix:login error * update COUNTRY_CODE_CHINA line location * added one blank line * feat:added line #L88 was not covered by tests * ci build errors Co-authored-by: erchuan --- homeassistant/components/tuya/config_flow.py | 8 ++- tests/components/tuya/test_config_flow.py | 76 +++++++++++++++----- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/tuya/config_flow.py b/homeassistant/components/tuya/config_flow.py index 9761b1b6c96..357910b5388 100644 --- a/homeassistant/components/tuya/config_flow.py +++ b/homeassistant/components/tuya/config_flow.py @@ -26,6 +26,8 @@ from .const import ( RESULT_SINGLE_INSTANCE = "single_instance_allowed" RESULT_AUTH_FAILED = "invalid_auth" TUYA_ENDPOINT_BASE = "https://openapi.tuyacn.com" +TUYA_ENDPOINT_OTHER = "https://openapi.tuyaus.com" +COUNTRY_CODE_CHINA = ["86", "+86", "China"] _LOGGER = logging.getLogger(__name__) @@ -82,7 +84,11 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): if project_type == ProjectType.INDUSTY_SOLUTIONS: response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) else: - api.endpoint = TUYA_ENDPOINT_BASE + if user_input[CONF_COUNTRY_CODE] in COUNTRY_CODE_CHINA: + api.endpoint = TUYA_ENDPOINT_BASE + else: + api.endpoint = TUYA_ENDPOINT_OTHER + response = api.login( user_input[CONF_USERNAME], user_input[CONF_PASSWORD], diff --git a/tests/components/tuya/test_config_flow.py b/tests/components/tuya/test_config_flow.py index a15cfcc0fdf..b01745ee8db 100644 --- a/tests/components/tuya/test_config_flow.py +++ b/tests/components/tuya/test_config_flow.py @@ -24,7 +24,8 @@ MOCK_ACCESS_ID = "myAccessId" MOCK_ACCESS_SECRET = "myAccessSecret" MOCK_USERNAME = "myUsername" MOCK_PASSWORD = "myPassword" -MOCK_COUNTRY_CODE = "1" +MOCK_COUNTRY_CODE_BASE = "86" +MOCK_COUNTRY_CODE_OTHER = "1" MOCK_APP_TYPE = "smartlife" MOCK_ENDPOINT = "https://openapi-ueaz.tuyaus.com" @@ -35,15 +36,6 @@ TUYA_INDUSTRY_PROJECT_DATA = { CONF_PROJECT_TYPE: MOCK_INDUSTRY_PROJECT_TYPE, } -TUYA_INPUT_SMART_HOME_DATA = { - CONF_ACCESS_ID: MOCK_ACCESS_ID, - CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, - CONF_USERNAME: MOCK_USERNAME, - CONF_PASSWORD: MOCK_PASSWORD, - CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE, - CONF_APP_TYPE: MOCK_APP_TYPE, -} - TUYA_INPUT_INDUSTRY_DATA = { CONF_ENDPOINT: MOCK_ENDPOINT, CONF_ACCESS_ID: MOCK_ACCESS_ID, @@ -52,15 +44,23 @@ TUYA_INPUT_INDUSTRY_DATA = { CONF_PASSWORD: MOCK_PASSWORD, } -TUYA_IMPORT_SMART_HOME_DATA = { +TUYA_IMPORT_SMART_HOME_DATA_BASE = { CONF_ACCESS_ID: MOCK_ACCESS_ID, CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, CONF_USERNAME: MOCK_USERNAME, CONF_PASSWORD: MOCK_PASSWORD, - CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE, + CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE_BASE, CONF_APP_TYPE: MOCK_APP_TYPE, } +TUYA_IMPORT_SMART_HOME_DATA_OTHER = { + CONF_ACCESS_ID: MOCK_ACCESS_ID, + CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, + CONF_USERNAME: MOCK_USERNAME, + CONF_PASSWORD: MOCK_PASSWORD, + CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE_OTHER, + CONF_APP_TYPE: MOCK_APP_TYPE, +} TUYA_IMPORT_INDUSTRY_DATA = { CONF_PROJECT_TYPE: MOCK_SMART_HOME_PROJECT_TYPE, @@ -118,8 +118,8 @@ async def test_industry_user(hass, tuya): assert not result["result"].unique_id -async def test_smart_home_user(hass, tuya): - """Test smart home user config.""" +async def test_smart_home_user_base(hass, tuya): + """Test smart home user config base.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) @@ -137,7 +137,7 @@ async def test_smart_home_user(hass, tuya): tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_BASE ) await hass.async_block_till_done() @@ -145,7 +145,7 @@ async def test_smart_home_user(hass, tuya): tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_BASE ) await hass.async_block_till_done() @@ -155,7 +155,49 @@ async def test_smart_home_user(hass, tuya): assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET assert result["data"][CONF_USERNAME] == MOCK_USERNAME assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD - assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE + assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE_BASE + assert result["data"][CONF_APP_TYPE] == MOCK_APP_TYPE + assert not result["result"].unique_id + + +async def test_smart_home_user_other(hass, tuya): + """Test smart home user config other.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "user" + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input=TUYA_SMART_HOME_PROJECT_DATA + ) + await hass.async_block_till_done() + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "login" + + tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_OTHER + ) + await hass.async_block_till_done() + + assert result["errors"]["base"] == RESULT_AUTH_FAILED + + tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_OTHER + ) + await hass.async_block_till_done() + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["title"] == MOCK_USERNAME + assert result["data"][CONF_ACCESS_ID] == MOCK_ACCESS_ID + assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET + assert result["data"][CONF_USERNAME] == MOCK_USERNAME + assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD + assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE_OTHER assert result["data"][CONF_APP_TYPE] == MOCK_APP_TYPE assert not result["result"].unique_id From cdaa7b7db7b50608db0d06fc08d7d9778ef0066a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 3 Oct 2021 22:02:30 -0700 Subject: [PATCH 049/162] Mark auth voluptuous schema fields as required (#57003) --- homeassistant/auth/mfa_modules/insecure_example.py | 4 ++-- homeassistant/auth/mfa_modules/notify.py | 2 +- homeassistant/auth/mfa_modules/totp.py | 2 +- homeassistant/auth/providers/command_line.py | 14 ++++++++------ homeassistant/auth/providers/homeassistant.py | 14 ++++++++------ homeassistant/auth/providers/insecure_example.py | 14 ++++++++------ .../auth/providers/legacy_api_password.py | 4 +++- homeassistant/auth/providers/trusted_networks.py | 4 +++- tests/components/auth/test_mfa_setup_flow.py | 2 +- 9 files changed, 35 insertions(+), 25 deletions(-) diff --git a/homeassistant/auth/mfa_modules/insecure_example.py b/homeassistant/auth/mfa_modules/insecure_example.py index 1d40339417b..a50b762b121 100644 --- a/homeassistant/auth/mfa_modules/insecure_example.py +++ b/homeassistant/auth/mfa_modules/insecure_example.py @@ -38,12 +38,12 @@ class InsecureExampleModule(MultiFactorAuthModule): @property def input_schema(self) -> vol.Schema: """Validate login flow input data.""" - return vol.Schema({"pin": str}) + return vol.Schema({vol.Required("pin"): str}) @property def setup_schema(self) -> vol.Schema: """Validate async_setup_user input data.""" - return vol.Schema({"pin": str}) + return vol.Schema({vol.Required("pin"): str}) async def async_setup_flow(self, user_id: str) -> SetupFlow: """Return a data entry flow handler for setup module. diff --git a/homeassistant/auth/mfa_modules/notify.py b/homeassistant/auth/mfa_modules/notify.py index 7d5cf0b0641..ec5d5b7cd03 100644 --- a/homeassistant/auth/mfa_modules/notify.py +++ b/homeassistant/auth/mfa_modules/notify.py @@ -110,7 +110,7 @@ class NotifyAuthModule(MultiFactorAuthModule): @property def input_schema(self) -> vol.Schema: """Validate login flow input data.""" - return vol.Schema({INPUT_FIELD_CODE: str}) + return vol.Schema({vol.Required(INPUT_FIELD_CODE): str}) async def _async_load(self) -> None: """Load stored data.""" diff --git a/homeassistant/auth/mfa_modules/totp.py b/homeassistant/auth/mfa_modules/totp.py index 5ff2c01c755..0ff7e1147b1 100644 --- a/homeassistant/auth/mfa_modules/totp.py +++ b/homeassistant/auth/mfa_modules/totp.py @@ -84,7 +84,7 @@ class TotpAuthModule(MultiFactorAuthModule): @property def input_schema(self) -> vol.Schema: """Validate login flow input data.""" - return vol.Schema({INPUT_FIELD_CODE: str}) + return vol.Schema({vol.Required(INPUT_FIELD_CODE): str}) async def _async_load(self) -> None: """Load stored data.""" diff --git a/homeassistant/auth/providers/command_line.py b/homeassistant/auth/providers/command_line.py index 6d1a1627fd5..81a6b6d78e5 100644 --- a/homeassistant/auth/providers/command_line.py +++ b/homeassistant/auth/providers/command_line.py @@ -2,7 +2,6 @@ from __future__ import annotations import asyncio -import collections from collections.abc import Mapping import logging import os @@ -148,10 +147,13 @@ class CommandLineLoginFlow(LoginFlow): user_input.pop("password") return await self.async_finish(user_input) - schema: dict[str, type] = collections.OrderedDict() - schema["username"] = str - schema["password"] = str - return self.async_show_form( - step_id="init", data_schema=vol.Schema(schema), errors=errors + step_id="init", + data_schema=vol.Schema( + { + vol.Required("username"): str, + vol.Required("password"): str, + } + ), + errors=errors, ) diff --git a/homeassistant/auth/providers/homeassistant.py b/homeassistant/auth/providers/homeassistant.py index 6ac9fac03e5..1ffed6f87fd 100644 --- a/homeassistant/auth/providers/homeassistant.py +++ b/homeassistant/auth/providers/homeassistant.py @@ -3,7 +3,6 @@ from __future__ import annotations import asyncio import base64 -from collections import OrderedDict from collections.abc import Mapping import logging from typing import Any, cast @@ -335,10 +334,13 @@ class HassLoginFlow(LoginFlow): user_input.pop("password") return await self.async_finish(user_input) - schema: dict[str, type] = OrderedDict() - schema["username"] = str - schema["password"] = str - return self.async_show_form( - step_id="init", data_schema=vol.Schema(schema), errors=errors + step_id="init", + data_schema=vol.Schema( + { + vol.Required("username"): str, + vol.Required("password"): str, + } + ), + errors=errors, ) diff --git a/homeassistant/auth/providers/insecure_example.py b/homeassistant/auth/providers/insecure_example.py index fb390b65b0d..9ad6da27ce3 100644 --- a/homeassistant/auth/providers/insecure_example.py +++ b/homeassistant/auth/providers/insecure_example.py @@ -1,7 +1,6 @@ """Example auth provider.""" from __future__ import annotations -from collections import OrderedDict from collections.abc import Mapping import hmac from typing import Any, cast @@ -117,10 +116,13 @@ class ExampleLoginFlow(LoginFlow): user_input.pop("password") return await self.async_finish(user_input) - schema: dict[str, type] = OrderedDict() - schema["username"] = str - schema["password"] = str - return self.async_show_form( - step_id="init", data_schema=vol.Schema(schema), errors=errors + step_id="init", + data_schema=vol.Schema( + { + vol.Required("username"): str, + vol.Required("password"): str, + } + ), + errors=errors, ) diff --git a/homeassistant/auth/providers/legacy_api_password.py b/homeassistant/auth/providers/legacy_api_password.py index af24506210b..2cb113b8b8c 100644 --- a/homeassistant/auth/providers/legacy_api_password.py +++ b/homeassistant/auth/providers/legacy_api_password.py @@ -102,5 +102,7 @@ class LegacyLoginFlow(LoginFlow): return await self.async_finish({}) return self.async_show_form( - step_id="init", data_schema=vol.Schema({"password": str}), errors=errors + step_id="init", + data_schema=vol.Schema({vol.Required("password"): str}), + errors=errors, ) diff --git a/homeassistant/auth/providers/trusted_networks.py b/homeassistant/auth/providers/trusted_networks.py index a9ee6a48335..0f2b287a227 100644 --- a/homeassistant/auth/providers/trusted_networks.py +++ b/homeassistant/auth/providers/trusted_networks.py @@ -244,5 +244,7 @@ class TrustedNetworksLoginFlow(LoginFlow): return self.async_show_form( step_id="init", - data_schema=vol.Schema({"user": vol.In(self._available_users)}), + data_schema=vol.Schema( + {vol.Required("user"): vol.In(self._available_users)} + ), ) diff --git a/tests/components/auth/test_mfa_setup_flow.py b/tests/components/auth/test_mfa_setup_flow.py index 3569d7d5233..edf45742dbd 100644 --- a/tests/components/auth/test_mfa_setup_flow.py +++ b/tests/components/auth/test_mfa_setup_flow.py @@ -67,7 +67,7 @@ async def test_ws_setup_depose_mfa(hass, hass_ws_client): assert flow["type"] == data_entry_flow.RESULT_TYPE_FORM assert flow["handler"] == "example_module" assert flow["step_id"] == "init" - assert flow["data_schema"][0] == {"type": "string", "name": "pin"} + assert flow["data_schema"][0] == {"type": "string", "name": "pin", "required": True} await client.send_json( { From 4ca0c0d3a9da2d7168721108b37dc25ed682edff Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sun, 3 Oct 2021 18:24:23 -0400 Subject: [PATCH 050/162] Bump zwave-js-server-python to 0.31.2 (#57007) --- homeassistant/components/zwave_js/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/zwave_js/manifest.json b/homeassistant/components/zwave_js/manifest.json index 1a9091005e2..e80549d815d 100644 --- a/homeassistant/components/zwave_js/manifest.json +++ b/homeassistant/components/zwave_js/manifest.json @@ -3,7 +3,7 @@ "name": "Z-Wave JS", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/zwave_js", - "requirements": ["zwave-js-server-python==0.31.1"], + "requirements": ["zwave-js-server-python==0.31.2"], "codeowners": ["@home-assistant/z-wave"], "dependencies": ["usb", "http", "websocket_api"], "iot_class": "local_push", diff --git a/requirements_all.txt b/requirements_all.txt index e5c58f55dd2..891d6236635 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2504,4 +2504,4 @@ zigpy==0.38.0 zm-py==0.5.2 # homeassistant.components.zwave_js -zwave-js-server-python==0.31.1 +zwave-js-server-python==0.31.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 3601b26a5f3..9048888ef38 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1430,4 +1430,4 @@ zigpy-znp==0.5.4 zigpy==0.38.0 # homeassistant.components.zwave_js -zwave-js-server-python==0.31.1 +zwave-js-server-python==0.31.2 From 36bac936d14d879b556e94e14d6b7aa254bcc7ad Mon Sep 17 00:00:00 2001 From: Chris Browet Date: Mon, 4 Oct 2021 17:10:41 +0200 Subject: [PATCH 051/162] Universal media player: consider unknown as inactive child state (#57029) --- homeassistant/components/universal/media_player.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/universal/media_player.py b/homeassistant/components/universal/media_player.py index 2e3e6892c1c..d658a44a117 100644 --- a/homeassistant/components/universal/media_player.py +++ b/homeassistant/components/universal/media_player.py @@ -87,6 +87,7 @@ from homeassistant.const import ( STATE_OFF, STATE_ON, STATE_UNAVAILABLE, + STATE_UNKNOWN, ) from homeassistant.core import EVENT_HOMEASSISTANT_START, callback from homeassistant.exceptions import TemplateError @@ -101,7 +102,7 @@ CONF_ATTRS = "attributes" CONF_CHILDREN = "children" CONF_COMMANDS = "commands" -OFF_STATES = [STATE_IDLE, STATE_OFF, STATE_UNAVAILABLE] +OFF_STATES = [STATE_IDLE, STATE_OFF, STATE_UNAVAILABLE, STATE_UNKNOWN] ATTRS_SCHEMA = cv.schema_with_slug_keys(cv.string) CMD_SCHEMA = cv.schema_with_slug_keys(cv.SERVICE_SCHEMA) From b106dab916c5f5ed1e53d4761709e3372abc28b1 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Mon, 4 Oct 2021 13:17:42 +0200 Subject: [PATCH 052/162] ESPHome fix zeroconf add_listener issue (#57031) --- homeassistant/components/esphome/__init__.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/esphome/__init__.py b/homeassistant/components/esphome/__init__.py index ed23aa7ec75..ee258317357 100644 --- a/homeassistant/components/esphome/__init__.py +++ b/homeassistant/components/esphome/__init__.py @@ -503,16 +503,14 @@ class ReconnectLogic(RecordUpdateListener): """ async with self._zc_lock: if not self._zc_listening: - await self._hass.async_add_executor_job( - self._zc.add_listener, self, None - ) + self._zc.async_add_listener(self, None) self._zc_listening = True async def _stop_zc_listen(self) -> None: """Stop listening for zeroconf updates.""" async with self._zc_lock: if self._zc_listening: - await self._hass.async_add_executor_job(self._zc.remove_listener, self) + self._zc.async_remove_listener(self) self._zc_listening = False @callback From 1fe4e08003e17951f24cf6dae0225d54fd0b4dc4 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Mon, 4 Oct 2021 13:23:11 +0200 Subject: [PATCH 053/162] Bump aioesphomeapi from 9.1.2 to 9.1.4 (#57036) --- homeassistant/components/esphome/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/esphome/manifest.json b/homeassistant/components/esphome/manifest.json index 28371e89d8e..33801431994 100644 --- a/homeassistant/components/esphome/manifest.json +++ b/homeassistant/components/esphome/manifest.json @@ -3,7 +3,7 @@ "name": "ESPHome", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/esphome", - "requirements": ["aioesphomeapi==9.1.2"], + "requirements": ["aioesphomeapi==9.1.4"], "zeroconf": ["_esphomelib._tcp.local."], "codeowners": ["@OttoWinter", "@jesserockz"], "after_dependencies": ["zeroconf", "tag"], diff --git a/requirements_all.txt b/requirements_all.txt index 891d6236635..894b0b9b3de 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -164,7 +164,7 @@ aioeagle==1.1.0 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==9.1.2 +aioesphomeapi==9.1.4 # homeassistant.components.flo aioflo==0.4.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9048888ef38..319509de017 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -109,7 +109,7 @@ aioeagle==1.1.0 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==9.1.2 +aioesphomeapi==9.1.4 # homeassistant.components.flo aioflo==0.4.1 From 7ddb399178fd85b7543eff9312c4190450269296 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 4 Oct 2021 15:09:42 +0200 Subject: [PATCH 054/162] Prevent opening of sockets in watttime tests (#57040) --- tests/components/watttime/test_config_flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/components/watttime/test_config_flow.py b/tests/components/watttime/test_config_flow.py index a3d2867eb2d..efee2429d59 100644 --- a/tests/components/watttime/test_config_flow.py +++ b/tests/components/watttime/test_config_flow.py @@ -81,7 +81,7 @@ async def test_duplicate_error(hass: HomeAssistant, client_login): assert result["reason"] == "already_configured" -async def test_show_form_coordinates(hass: HomeAssistant) -> None: +async def test_show_form_coordinates(hass: HomeAssistant, client_login) -> None: """Test showing the form to input custom latitude/longitude.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} From 62390b9531c224bd2ca8ce21f7c93dd3b9403d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Mon, 4 Oct 2021 17:27:24 +0200 Subject: [PATCH 055/162] Rewrite tuya config flow (#57043) Co-authored-by: Martin Hjelmare Co-authored-by: Franck Nijhof --- homeassistant/components/tuya/config_flow.py | 186 ++++++++--------- homeassistant/components/tuya/const.py | 28 ++- homeassistant/components/tuya/strings.json | 25 +-- .../components/tuya/translations/en.json | 73 +------ tests/components/tuya/test_config_flow.py | 195 +++++------------- 5 files changed, 168 insertions(+), 339 deletions(-) diff --git a/homeassistant/components/tuya/config_flow.py b/homeassistant/components/tuya/config_flow.py index 357910b5388..1b439d49007 100644 --- a/homeassistant/components/tuya/config_flow.py +++ b/homeassistant/components/tuya/config_flow.py @@ -1,10 +1,12 @@ -#!/usr/bin/env python3 """Config flow for Tuya.""" +from __future__ import annotations import logging +from typing import Any from tuya_iot import ProjectType, TuyaOpenAPI import voluptuous as vol +from voluptuous.schema_builder import UNDEFINED from homeassistant import config_entries @@ -16,131 +18,123 @@ from .const import ( CONF_ENDPOINT, CONF_PASSWORD, CONF_PROJECT_TYPE, + CONF_REGION, CONF_USERNAME, DOMAIN, - TUYA_APP_TYPE, - TUYA_ENDPOINT, - TUYA_PROJECT_TYPE, + SMARTLIFE_APP, + TUYA_REGIONS, + TUYA_RESPONSE_CODE, + TUYA_RESPONSE_MSG, + TUYA_RESPONSE_PLATFROM_URL, + TUYA_RESPONSE_RESULT, + TUYA_RESPONSE_SUCCESS, + TUYA_SMART_APP, ) -RESULT_SINGLE_INSTANCE = "single_instance_allowed" -RESULT_AUTH_FAILED = "invalid_auth" -TUYA_ENDPOINT_BASE = "https://openapi.tuyacn.com" -TUYA_ENDPOINT_OTHER = "https://openapi.tuyaus.com" -COUNTRY_CODE_CHINA = ["86", "+86", "China"] - _LOGGER = logging.getLogger(__name__) -# Project Type -DATA_SCHEMA_PROJECT_TYPE = vol.Schema( - {vol.Required(CONF_PROJECT_TYPE, default=0): vol.In(TUYA_PROJECT_TYPE)} -) - -# INDUSTY_SOLUTIONS Schema -DATA_SCHEMA_INDUSTRY_SOLUTIONS = vol.Schema( - { - vol.Required(CONF_ENDPOINT): vol.In(TUYA_ENDPOINT), - vol.Required(CONF_ACCESS_ID): str, - vol.Required(CONF_ACCESS_SECRET): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - } -) - -# SMART_HOME Schema -DATA_SCHEMA_SMART_HOME = vol.Schema( - { - vol.Required(CONF_ACCESS_ID): str, - vol.Required(CONF_ACCESS_SECRET): str, - vol.Required(CONF_APP_TYPE): vol.In(TUYA_APP_TYPE), - vol.Required(CONF_COUNTRY_CODE): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - } -) - class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Tuya Config Flow.""" - def __init__(self) -> None: - """Init tuya config flow.""" - super().__init__() - self.conf_project_type = None - @staticmethod - def _try_login(user_input): - project_type = ProjectType(user_input[CONF_PROJECT_TYPE]) - api = TuyaOpenAPI( - user_input[CONF_ENDPOINT] - if project_type == ProjectType.INDUSTY_SOLUTIONS - else "", - user_input[CONF_ACCESS_ID], - user_input[CONF_ACCESS_SECRET], - project_type, - ) - api.set_dev_channel("hass") + def _try_login(user_input: dict[str, Any]) -> tuple[dict[Any, Any], dict[str, Any]]: + """Try login.""" + response = {} - if project_type == ProjectType.INDUSTY_SOLUTIONS: - response = api.login(user_input[CONF_USERNAME], user_input[CONF_PASSWORD]) - else: - if user_input[CONF_COUNTRY_CODE] in COUNTRY_CODE_CHINA: - api.endpoint = TUYA_ENDPOINT_BASE + data = { + CONF_ENDPOINT: TUYA_REGIONS[user_input[CONF_REGION]], + CONF_PROJECT_TYPE: ProjectType.INDUSTY_SOLUTIONS, + CONF_ACCESS_ID: user_input[CONF_ACCESS_ID], + CONF_ACCESS_SECRET: user_input[CONF_ACCESS_SECRET], + CONF_USERNAME: user_input[CONF_USERNAME], + CONF_PASSWORD: user_input[CONF_PASSWORD], + CONF_COUNTRY_CODE: user_input[CONF_REGION], + } + + for app_type in ("", TUYA_SMART_APP, SMARTLIFE_APP): + data[CONF_APP_TYPE] = app_type + if data[CONF_APP_TYPE] == "": + data[CONF_PROJECT_TYPE] = ProjectType.INDUSTY_SOLUTIONS else: - api.endpoint = TUYA_ENDPOINT_OTHER + data[CONF_PROJECT_TYPE] = ProjectType.SMART_HOME + + api = TuyaOpenAPI( + endpoint=data[CONF_ENDPOINT], + access_id=data[CONF_ACCESS_ID], + access_secret=data[CONF_ACCESS_SECRET], + project_type=data[CONF_PROJECT_TYPE], + ) + api.set_dev_channel("hass") response = api.login( - user_input[CONF_USERNAME], - user_input[CONF_PASSWORD], - user_input[CONF_COUNTRY_CODE], - user_input[CONF_APP_TYPE], + username=data[CONF_USERNAME], + password=data[CONF_PASSWORD], + country_code=data[CONF_COUNTRY_CODE], + schema=data[CONF_APP_TYPE], ) - if response.get("success", False) and isinstance( - api.token_info.platform_url, str - ): - api.endpoint = api.token_info.platform_url - user_input[CONF_ENDPOINT] = api.token_info.platform_url - _LOGGER.debug("TuyaConfigFlow._try_login finish, response:, %s", response) - return response + _LOGGER.debug("Response %s", response) + + if response.get(TUYA_RESPONSE_SUCCESS, False): + break + + return response, data async def async_step_user(self, user_input=None): """Step user.""" - if user_input is None: - return self.async_show_form( - step_id="user", data_schema=DATA_SCHEMA_PROJECT_TYPE - ) - - self.conf_project_type = user_input[CONF_PROJECT_TYPE] - - return await self.async_step_login() - - async def async_step_login(self, user_input=None): - """Step login.""" errors = {} - if user_input is not None: - assert self.conf_project_type is not None - user_input[CONF_PROJECT_TYPE] = self.conf_project_type + placeholders = {} - response = await self.hass.async_add_executor_job( + if user_input is not None: + response, data = await self.hass.async_add_executor_job( self._try_login, user_input ) - if response.get("success", False): - _LOGGER.debug("TuyaConfigFlow.async_step_user login success") + if response.get(TUYA_RESPONSE_SUCCESS, False): + if endpoint := response.get(TUYA_RESPONSE_RESULT, {}).get( + TUYA_RESPONSE_PLATFROM_URL + ): + data[CONF_ENDPOINT] = endpoint + + data[CONF_PROJECT_TYPE] = data[CONF_PROJECT_TYPE].value + return self.async_create_entry( title=user_input[CONF_USERNAME], - data=user_input, + data=data, ) - errors["base"] = RESULT_AUTH_FAILED + errors["base"] = "login_error" + placeholders = { + TUYA_RESPONSE_CODE: response.get(TUYA_RESPONSE_CODE), + TUYA_RESPONSE_MSG: response.get(TUYA_RESPONSE_MSG), + } - if ProjectType(self.conf_project_type) == ProjectType.SMART_HOME: - return self.async_show_form( - step_id="login", data_schema=DATA_SCHEMA_SMART_HOME, errors=errors - ) + def _schema_default(key: str) -> str | UNDEFINED: + if not user_input: + return UNDEFINED + return user_input[key] return self.async_show_form( - step_id="login", - data_schema=DATA_SCHEMA_INDUSTRY_SOLUTIONS, + step_id="user", + data_schema=vol.Schema( + { + vol.Required( + CONF_REGION, default=_schema_default(CONF_REGION) + ): vol.In(TUYA_REGIONS.keys()), + vol.Required( + CONF_ACCESS_ID, default=_schema_default(CONF_ACCESS_ID) + ): str, + vol.Required( + CONF_ACCESS_SECRET, default=_schema_default(CONF_ACCESS_SECRET) + ): str, + vol.Required( + CONF_USERNAME, default=_schema_default(CONF_USERNAME) + ): str, + vol.Required( + CONF_PASSWORD, default=_schema_default(CONF_PASSWORD) + ): str, + } + ), errors=errors, + description_placeholders=placeholders, ) diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index e259dd9190b..f86180226ee 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -9,6 +9,7 @@ CONF_ACCESS_ID = "access_id" CONF_ACCESS_SECRET = "access_secret" CONF_USERNAME = "username" CONF_PASSWORD = "password" +CONF_REGION = "region" CONF_COUNTRY_CODE = "country_code" CONF_APP_TYPE = "tuya_app_type" @@ -19,19 +20,24 @@ TUYA_MQTT_LISTENER = "tuya_mqtt_listener" TUYA_HA_TUYA_MAP = "tuya_ha_tuya_map" TUYA_HA_DEVICES = "tuya_ha_devices" +TUYA_RESPONSE_CODE = "code" +TUYA_RESPONSE_RESULT = "result" +TUYA_RESPONSE_MSG = "msg" +TUYA_RESPONSE_SUCCESS = "success" +TUYA_RESPONSE_PLATFROM_URL = "platform_url" + TUYA_HA_SIGNAL_UPDATE_ENTITY = "tuya_entry_update" -TUYA_ENDPOINT = { - "https://openapi.tuyaus.com": "America", - "https://openapi.tuyacn.com": "China", - "https://openapi.tuyaeu.com": "Europe", - "https://openapi.tuyain.com": "India", - "https://openapi-ueaz.tuyaus.com": "EasternAmerica", - "https://openapi-weaz.tuyaeu.com": "WesternEurope", +TUYA_SMART_APP = "tuyaSmart" +SMARTLIFE_APP = "smartlife" + +TUYA_REGIONS = { + "America": "https://openapi.tuyaus.com", + "China": "https://openapi.tuyacn.com", + "Eastern America": "https://openapi-ueaz.tuyaus.com", + "Europe": "https://openapi.tuyaeu.com", + "India": "https://openapi.tuyain.com", + "Western Europe": "https://openapi-weaz.tuyaeu.com", } -TUYA_PROJECT_TYPE = {1: "Custom Development", 0: "Smart Home PaaS"} - -TUYA_APP_TYPE = {"tuyaSmart": "TuyaSmart", "smartlife": "Smart Life"} - PLATFORMS = ["climate", "fan", "light", "scene", "switch"] diff --git a/homeassistant/components/tuya/strings.json b/homeassistant/components/tuya/strings.json index 91ca045e1f5..044c068ac9c 100644 --- a/homeassistant/components/tuya/strings.json +++ b/homeassistant/components/tuya/strings.json @@ -1,29 +1,20 @@ { "config": { - "flow_title": "Tuya configuration", "step": { - "user":{ - "title":"Tuya Integration", - "data":{ - "tuya_project_type": "Tuya cloud project type" - } - }, - "login": { - "title": "Tuya", - "description": "Enter your Tuya credential", + "user": { + "description": "Enter your Tuya credentials", "data": { - "endpoint": "Availability Zone", - "access_id": "Access ID", - "access_secret": "Access Secret", - "tuya_app_type": "Mobile App", - "country_code": "Country Code", + "region": "Region", + "access_id": "Tuya IoT Access ID", + "access_secret": "Tuya IoT Access Secret", "username": "Account", - "password": "Password" + "password": "[%key:common::config_flow::data::password%]" } } }, "error": { - "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]" + "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", + "login_error": "Login error ({code}): {msg}" } } } \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/en.json b/homeassistant/components/tuya/translations/en.json index c7aaee977ee..a3630e66406 100644 --- a/homeassistant/components/tuya/translations/en.json +++ b/homeassistant/components/tuya/translations/en.json @@ -1,78 +1,19 @@ { "config": { - "abort": { - "cannot_connect": "Failed to connect", - "invalid_auth": "Invalid authentication", - "single_instance_allowed": "Already configured. Only a single configuration possible." - }, "error": { - "invalid_auth": "Invalid authentication" + "invalid_auth": "Invalid authentication", + "login_error": "Login error ({code}): {msg}" }, - "flow_title": "Tuya configuration", "step": { - "login": { - "data": { - "access_id": "Access ID", - "access_secret": "Access Secret", - "country_code": "Country Code", - "endpoint": "Availability Zone", - "password": "Password", - "tuya_app_type": "Mobile App", - "username": "Account" - }, - "description": "Enter your Tuya credential", - "title": "Tuya" - }, "user": { "data": { - "country_code": "Your account country code (e.g., 1 for USA or 86 for China)", + "access_id": "Tuya IoT Access ID", + "access_secret": "Tuya IoT Access Secret", "password": "Password", - "platform": "The app where your account is registered", - "tuya_project_type": "Tuya cloud project type", - "username": "Username" + "region": "Region", + "username": "Account" }, - "description": "Enter your Tuya credentials.", - "title": "Tuya Integration" - } - } - }, - "options": { - "abort": { - "cannot_connect": "Failed to connect" - }, - "error": { - "dev_multi_type": "Multiple selected devices to configure must be of the same type", - "dev_not_config": "Device type not configurable", - "dev_not_found": "Device not found" - }, - "step": { - "device": { - "data": { - "brightness_range_mode": "Brightness range used by device", - "curr_temp_divider": "Current Temperature value divider (0 = use default)", - "max_kelvin": "Max color temperature supported in kelvin", - "max_temp": "Max target temperature (use min and max = 0 for default)", - "min_kelvin": "Min color temperature supported in kelvin", - "min_temp": "Min target temperature (use min and max = 0 for default)", - "set_temp_divided": "Use divided Temperature value for set temperature command", - "support_color": "Force color support", - "temp_divider": "Temperature values divider (0 = use default)", - "temp_step_override": "Target Temperature step", - "tuya_max_coltemp": "Max color temperature reported by device", - "unit_of_measurement": "Temperature unit used by device" - }, - "description": "Configure options to adjust displayed information for {device_type} device `{device_name}`", - "title": "Configure Tuya Device" - }, - "init": { - "data": { - "discovery_interval": "Discovery device polling interval in seconds", - "list_devices": "Select the devices to configure or leave empty to save configuration", - "query_device": "Select device that will use query method for faster status update", - "query_interval": "Query device polling interval in seconds" - }, - "description": "Do not set pollings interval values too low or the calls will fail generating error message in the log", - "title": "Configure Tuya Options" + "description": "Enter your Tuya credentials" } } } diff --git a/tests/components/tuya/test_config_flow.py b/tests/components/tuya/test_config_flow.py index b01745ee8db..04fb8ebe009 100644 --- a/tests/components/tuya/test_config_flow.py +++ b/tests/components/tuya/test_config_flow.py @@ -1,93 +1,84 @@ """Tests for the Tuya config flow.""" -from unittest.mock import MagicMock, Mock, patch +from __future__ import annotations + +from typing import Any +from unittest.mock import MagicMock, patch import pytest from homeassistant import config_entries, data_entry_flow -from homeassistant.components.tuya.config_flow import RESULT_AUTH_FAILED from homeassistant.components.tuya.const import ( CONF_ACCESS_ID, CONF_ACCESS_SECRET, CONF_APP_TYPE, - CONF_COUNTRY_CODE, CONF_ENDPOINT, CONF_PASSWORD, CONF_PROJECT_TYPE, + CONF_REGION, CONF_USERNAME, DOMAIN, + SMARTLIFE_APP, + TUYA_REGIONS, + TUYA_SMART_APP, ) +from homeassistant.core import HomeAssistant MOCK_SMART_HOME_PROJECT_TYPE = 0 MOCK_INDUSTRY_PROJECT_TYPE = 1 +MOCK_REGION = "Europe" MOCK_ACCESS_ID = "myAccessId" MOCK_ACCESS_SECRET = "myAccessSecret" MOCK_USERNAME = "myUsername" MOCK_PASSWORD = "myPassword" -MOCK_COUNTRY_CODE_BASE = "86" -MOCK_COUNTRY_CODE_OTHER = "1" -MOCK_APP_TYPE = "smartlife" MOCK_ENDPOINT = "https://openapi-ueaz.tuyaus.com" -TUYA_SMART_HOME_PROJECT_DATA = { - CONF_PROJECT_TYPE: MOCK_SMART_HOME_PROJECT_TYPE, -} -TUYA_INDUSTRY_PROJECT_DATA = { - CONF_PROJECT_TYPE: MOCK_INDUSTRY_PROJECT_TYPE, -} - -TUYA_INPUT_INDUSTRY_DATA = { - CONF_ENDPOINT: MOCK_ENDPOINT, +TUYA_INPUT_DATA = { + CONF_REGION: MOCK_REGION, CONF_ACCESS_ID: MOCK_ACCESS_ID, CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, CONF_USERNAME: MOCK_USERNAME, CONF_PASSWORD: MOCK_PASSWORD, } -TUYA_IMPORT_SMART_HOME_DATA_BASE = { - CONF_ACCESS_ID: MOCK_ACCESS_ID, - CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, - CONF_USERNAME: MOCK_USERNAME, - CONF_PASSWORD: MOCK_PASSWORD, - CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE_BASE, - CONF_APP_TYPE: MOCK_APP_TYPE, -} - -TUYA_IMPORT_SMART_HOME_DATA_OTHER = { - CONF_ACCESS_ID: MOCK_ACCESS_ID, - CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, - CONF_USERNAME: MOCK_USERNAME, - CONF_PASSWORD: MOCK_PASSWORD, - CONF_COUNTRY_CODE: MOCK_COUNTRY_CODE_OTHER, - CONF_APP_TYPE: MOCK_APP_TYPE, -} - -TUYA_IMPORT_INDUSTRY_DATA = { - CONF_PROJECT_TYPE: MOCK_SMART_HOME_PROJECT_TYPE, - CONF_ENDPOINT: MOCK_ENDPOINT, - CONF_ACCESS_ID: MOCK_ACCESS_ID, - CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, - CONF_USERNAME: MOCK_USERNAME, - CONF_PASSWORD: MOCK_PASSWORD, +RESPONSE_SUCCESS = { + "success": True, + "code": 1024, + "result": {"platform_url": MOCK_ENDPOINT}, } +RESPONSE_ERROR = {"success": False, "code": 123, "msg": "Error"} @pytest.fixture(name="tuya") -def tuya_fixture() -> Mock: +def tuya_fixture() -> MagicMock: """Patch libraries.""" with patch("homeassistant.components.tuya.config_flow.TuyaOpenAPI") as tuya: yield tuya @pytest.fixture(name="tuya_setup", autouse=True) -def tuya_setup_fixture(): +def tuya_setup_fixture() -> None: """Mock tuya entry setup.""" with patch("homeassistant.components.tuya.async_setup_entry", return_value=True): yield -async def test_industry_user(hass, tuya): - """Test industry user config.""" +@pytest.mark.parametrize( + "app_type,side_effects, project_type", + [ + ("", [RESPONSE_SUCCESS], 1), + (TUYA_SMART_APP, [RESPONSE_ERROR, RESPONSE_SUCCESS], 0), + (SMARTLIFE_APP, [RESPONSE_ERROR, RESPONSE_ERROR, RESPONSE_SUCCESS], 0), + ], +) +async def test_user_flow( + hass: HomeAssistant, + tuya: MagicMock, + app_type: str, + side_effects: list[dict[str, Any]], + project_type: int, +): + """Test user flow.""" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} ) @@ -95,17 +86,9 @@ async def test_industry_user(hass, tuya): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + tuya().login = MagicMock(side_effect=side_effects) result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_INDUSTRY_PROJECT_DATA - ) - await hass.async_block_till_done() - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "login" - - tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_INPUT_INDUSTRY_DATA + result["flow_id"], user_input=TUYA_INPUT_DATA ) await hass.async_block_till_done() @@ -115,90 +98,10 @@ async def test_industry_user(hass, tuya): assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET assert result["data"][CONF_USERNAME] == MOCK_USERNAME assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD - assert not result["result"].unique_id - - -async def test_smart_home_user_base(hass, tuya): - """Test smart home user config base.""" - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": config_entries.SOURCE_USER} - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_SMART_HOME_PROJECT_DATA - ) - await hass.async_block_till_done() - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "login" - - tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_BASE - ) - await hass.async_block_till_done() - - assert result["errors"]["base"] == RESULT_AUTH_FAILED - - tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_BASE - ) - await hass.async_block_till_done() - - assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == MOCK_USERNAME - assert result["data"][CONF_ACCESS_ID] == MOCK_ACCESS_ID - assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET - assert result["data"][CONF_USERNAME] == MOCK_USERNAME - assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD - assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE_BASE - assert result["data"][CONF_APP_TYPE] == MOCK_APP_TYPE - assert not result["result"].unique_id - - -async def test_smart_home_user_other(hass, tuya): - """Test smart home user config other.""" - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": config_entries.SOURCE_USER} - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_SMART_HOME_PROJECT_DATA - ) - await hass.async_block_till_done() - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "login" - - tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_OTHER - ) - await hass.async_block_till_done() - - assert result["errors"]["base"] == RESULT_AUTH_FAILED - - tuya().login = MagicMock(return_value={"success": True, "errorCode": 1024}) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_IMPORT_SMART_HOME_DATA_OTHER - ) - await hass.async_block_till_done() - - assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY - assert result["title"] == MOCK_USERNAME - assert result["data"][CONF_ACCESS_ID] == MOCK_ACCESS_ID - assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET - assert result["data"][CONF_USERNAME] == MOCK_USERNAME - assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD - assert result["data"][CONF_COUNTRY_CODE] == MOCK_COUNTRY_CODE_OTHER - assert result["data"][CONF_APP_TYPE] == MOCK_APP_TYPE + assert result["data"][CONF_ENDPOINT] == MOCK_ENDPOINT + assert result["data"][CONF_ENDPOINT] != TUYA_REGIONS[TUYA_INPUT_DATA[CONF_REGION]] + assert result["data"][CONF_APP_TYPE] == app_type + assert result["data"][CONF_PROJECT_TYPE] == project_type assert not result["result"].unique_id @@ -212,18 +115,12 @@ async def test_error_on_invalid_credentials(hass, tuya): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" + tuya().login = MagicMock(return_value=RESPONSE_ERROR) result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_INDUSTRY_PROJECT_DATA + result["flow_id"], user_input=TUYA_INPUT_DATA ) await hass.async_block_till_done() - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "login" - - tuya().login = MagicMock(return_value={"success": False, "errorCode": 1024}) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], user_input=TUYA_INPUT_INDUSTRY_DATA - ) - await hass.async_block_till_done() - - assert result["errors"]["base"] == RESULT_AUTH_FAILED + assert result["errors"]["base"] == "login_error" + assert result["description_placeholders"]["code"] == RESPONSE_ERROR["code"] + assert result["description_placeholders"]["msg"] == RESPONSE_ERROR["msg"] From 688884ccfe7b4f4c1c53d4d79430d0baf7b37ce9 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 3 Oct 2021 00:13:50 +0000 Subject: [PATCH 056/162] [ci skip] Translation update --- .../apple_tv/translations/zh-Hans.json | 32 +++++++++++++++-- .../coolmaster/translations/he.json | 1 + .../components/dlna_dmr/translations/he.json | 18 ++++++++++ .../dlna_dmr/translations/zh-Hans.json | 12 +++++++ .../esphome/translations/zh-Hans.json | 18 ++++++++-- .../components/fan/translations/he.json | 8 +++++ .../components/flux_led/translations/de.json | 36 +++++++++++++++++++ .../components/flux_led/translations/en.json | 36 +++++++++++++++++++ .../huawei_lte/translations/zh-Hans.json | 36 ++++++++++++++++++- .../nmap_tracker/translations/zh-Hans.json | 5 ++- .../opengarage/translations/he.json | 22 ++++++++++++ .../opengarage/translations/zh-Hans.json | 12 +++++++ .../components/switchbot/translations/he.json | 1 + .../components/tplink/translations/he.json | 14 ++++++++ .../components/tuya/translations/he.json | 36 +++++++++++++++++-- .../xiaomi_aqara/translations/he.json | 29 ++++++++++++--- .../components/zwave_js/translations/he.json | 3 +- 17 files changed, 304 insertions(+), 15 deletions(-) create mode 100644 homeassistant/components/dlna_dmr/translations/he.json create mode 100644 homeassistant/components/dlna_dmr/translations/zh-Hans.json create mode 100644 homeassistant/components/flux_led/translations/de.json create mode 100644 homeassistant/components/flux_led/translations/en.json create mode 100644 homeassistant/components/opengarage/translations/he.json create mode 100644 homeassistant/components/opengarage/translations/zh-Hans.json diff --git a/homeassistant/components/apple_tv/translations/zh-Hans.json b/homeassistant/components/apple_tv/translations/zh-Hans.json index 54095a0a633..4b178c75fce 100644 --- a/homeassistant/components/apple_tv/translations/zh-Hans.json +++ b/homeassistant/components/apple_tv/translations/zh-Hans.json @@ -1,18 +1,46 @@ { "config": { + "abort": { + "already_configured_device": "\u8bbe\u5907\u5df2\u88ab\u914d\u7f6e", + "already_in_progress": "\u914d\u7f6e\u6d41\u7a0b\u5df2\u5728\u8fdb\u884c\u4e2d", + "backoff": "\u8bbe\u5907\u76ee\u524d\u6682\u4e0d\u63a5\u53d7\u914d\u5bf9\u8bf7\u6c42\uff08\u53ef\u80fd\u591a\u6b21\u8f93\u5165\u65e0\u6548 PIN \u7801\uff09\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002", + "invalid_config": "\u6b64\u8bbe\u5907\u7684\u914d\u7f6e\u4fe1\u606f\u4e0d\u5b8c\u6574\u3002\u8bf7\u5c1d\u8bd5\u91cd\u65b0\u6dfb\u52a0\u3002", + "no_devices_found": "\u672a\u5728\u6b64\u7f51\u7edc\u53d1\u73b0\u76f8\u5173\u8bbe\u5907", + "unknown": "\u672a\u77e5\u9519\u8bef" + }, + "error": { + "already_configured": "\u8bbe\u5907\u5df2\u88ab\u914d\u7f6e", + "invalid_auth": "\u51ed\u636e\u65e0\u6548", + "no_devices_found": "\u672a\u5728\u6b64\u7f51\u7edc\u53d1\u73b0\u76f8\u5173\u8bbe\u5907", + "no_usable_service": "\u5df2\u76f8\u5173\u627e\u5230\u8bbe\u5907\uff0c\u4f46\u65e0\u6cd5\u8bc6\u522b\u5e76\u4e0e\u5176\u5efa\u7acb\u8fde\u63a5\u3002\u82e5\u60a8\u4e00\u76f4\u6536\u5230\u6b64\u8b66\u544a\u6d88\u606f\uff0c\u8bf7\u5c1d\u8bd5\u4e3a\u5176\u6307\u5b9a\u56fa\u5b9a IP \u5730\u5740\u6216\u91cd\u65b0\u542f\u52a8\u60a8\u7684 Apple TV\u3002", + "unknown": "\u672a\u77e5\u9519\u8bef" + }, "step": { "confirm": { - "description": "\u60a8\u5373\u5c06\u6dfb\u52a0 Apple TV (\u540d\u79f0\u4e3a\u201c{name}\u201d)\u5230 Home Assistant\u3002 \n\n **\u8981\u5b8c\u6210\u6b64\u8fc7\u7a0b\uff0c\u53ef\u80fd\u9700\u8981\u8f93\u5165\u591a\u4e2a PIN \u7801\u3002** \n\n\u8bf7\u6ce8\u610f\uff0c\u6b64\u96c6\u6210*\u4e0d\u80fd*\u5173\u95ed Apple TV \u7684\u7535\u6e90\uff0c\u53ea\u4f1a\u5173\u95ed Home Assistant \u4e2d\u7684\u5a92\u4f53\u64ad\u653e\u5668\uff01" + "description": "\u60a8\u5373\u5c06\u6dfb\u52a0 Apple TV (\u540d\u79f0\u4e3a\u201c{name}\u201d)\u5230 Home Assistant\u3002 \n\n **\u8981\u5b8c\u6210\u6b64\u8fc7\u7a0b\uff0c\u53ef\u80fd\u9700\u8981\u8f93\u5165\u591a\u4e2a PIN \u7801\u3002** \n\n\u8bf7\u6ce8\u610f\uff0c\u6b64\u96c6\u6210*\u4e0d\u80fd*\u5173\u95ed Apple TV \u7684\u7535\u6e90\uff0c\u53ea\u4f1a\u5173\u95ed Home Assistant \u4e2d\u7684\u5a92\u4f53\u64ad\u653e\u5668\uff01", + "title": "\u786e\u8ba4\u6dfb\u52a0 Apple TV" }, "pair_no_pin": { + "description": "`{protocol}` \u670d\u52a1\u9700\u8981\u914d\u5bf9\u3002\u8bf7\u5728\u60a8\u7684 Apple TV \u4e0a\u8f93\u5165 PIN {pin}", "title": "\u914d\u5bf9\u4e2d" }, "pair_with_pin": { "data": { "pin": "PIN\u7801" - } + }, + "title": "\u914d\u5bf9\u4e2d" + }, + "reconfigure": { + "description": "\u8be5 Apple TV \u9047\u5230\u4e00\u4e9b\u8fde\u63a5\u95ee\u9898\uff0c\u987b\u91cd\u65b0\u914d\u7f6e\u3002", + "title": "\u8bbe\u5907\u91cd\u65b0\u914d\u7f6e" + }, + "service_problem": { + "title": "\u6dfb\u52a0\u670d\u52a1\u5931\u8d25" }, "user": { + "data": { + "device_input": "\u8bbe\u5907\u5730\u5740" + }, "description": "\u8981\u5f00\u59cb\uff0c\u8bf7\u8f93\u5165\u8981\u6dfb\u52a0\u7684 Apple TV \u7684\u8bbe\u5907\u540d\u79f0\u6216 IP \u5730\u5740\u3002\u5728\u7f51\u7edc\u4e0a\u81ea\u52a8\u53d1\u73b0\u7684\u8bbe\u5907\u4f1a\u663e\u793a\u5728\u4e0b\u65b9\u3002 \n\n\u5982\u679c\u6ca1\u6709\u53d1\u73b0\u8bbe\u5907\u6216\u9047\u5230\u4efb\u4f55\u95ee\u9898\uff0c\u8bf7\u5c1d\u8bd5\u6307\u5b9a\u8bbe\u5907 IP \u5730\u5740\u3002 \n\n {devices}", "title": "\u8bbe\u7f6e\u65b0\u7684 Apple TV" } diff --git a/homeassistant/components/coolmaster/translations/he.json b/homeassistant/components/coolmaster/translations/he.json index 5903faf3c72..1fd17b10134 100644 --- a/homeassistant/components/coolmaster/translations/he.json +++ b/homeassistant/components/coolmaster/translations/he.json @@ -7,6 +7,7 @@ "step": { "user": { "data": { + "fan_only": "\u05ea\u05de\u05d9\u05db\u05d4 \u05d1\u05de\u05e6\u05d1 \u05de\u05d0\u05d5\u05d5\u05e8\u05e8 \u05d1\u05dc\u05d1\u05d3", "host": "\u05de\u05d0\u05e8\u05d7" } } diff --git a/homeassistant/components/dlna_dmr/translations/he.json b/homeassistant/components/dlna_dmr/translations/he.json new file mode 100644 index 00000000000..fbdaa0403f4 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/he.json @@ -0,0 +1,18 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "flow_title": "{name}", + "step": { + "confirm": { + "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05d1\u05d4\u05d2\u05d3\u05e8\u05d4?" + }, + "user": { + "data": { + "url": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05ea\u05e8" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/dlna_dmr/translations/zh-Hans.json b/homeassistant/components/dlna_dmr/translations/zh-Hans.json new file mode 100644 index 00000000000..909a38b4b74 --- /dev/null +++ b/homeassistant/components/dlna_dmr/translations/zh-Hans.json @@ -0,0 +1,12 @@ +{ + "config": { + "error": { + "could_not_connect": "\u65e0\u6cd5\u8fde\u63a5\u5230 DLNA \u8bbe\u5907" + } + }, + "options": { + "error": { + "invalid_url": "\u65e0\u6548\u7f51\u5740" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/esphome/translations/zh-Hans.json b/homeassistant/components/esphome/translations/zh-Hans.json index b1911b90fde..d0c54f6afb1 100644 --- a/homeassistant/components/esphome/translations/zh-Hans.json +++ b/homeassistant/components/esphome/translations/zh-Hans.json @@ -2,11 +2,13 @@ "config": { "abort": { "already_configured": "\u8bbe\u5907\u5df2\u7ecf\u914d\u7f6e\u8fc7\u4e86", - "already_in_progress": "\u914d\u7f6e\u6d41\u7a0b\u5df2\u5728\u8fdb\u884c\u4e2d" + "already_in_progress": "\u914d\u7f6e\u6d41\u7a0b\u5df2\u5728\u8fdb\u884c\u4e2d", + "reauth_successful": "\u91cd\u9a8c\u8bc1\u6210\u529f" }, "error": { "connection_error": "\u65e0\u6cd5\u8fde\u63a5\u5230 ESP\u3002\u8bf7\u786e\u8ba4\u60a8\u7684 YAML \u6587\u4ef6\u4e2d\u5305\u542b 'api:' \u884c\u3002", "invalid_auth": "\u8eab\u4efd\u8ba4\u8bc1\u65e0\u6548", + "invalid_psk": "\u4f20\u8f93\u52a0\u5bc6\u5bc6\u94a5\u65e0\u6548\u3002\u8bf7\u786e\u4fdd\u5b83\u4e0e\u60a8\u7684\u914d\u7f6e\u4e00\u81f4\u3002", "resolve_error": "\u65e0\u6cd5\u89e3\u6790 ESP \u7684\u5730\u5740\u3002\u5982\u679c\u6b64\u9519\u8bef\u6301\u7eed\u5b58\u5728\uff0c\u8bf7\u8bbe\u7f6e\u9759\u6001IP\u5730\u5740\uff1ahttps://esphomelib.com/esphomeyaml/components/wifi.html#manual-ips" }, "flow_title": "ESPHome: {name}", @@ -21,9 +23,21 @@ "description": "\u662f\u5426\u8981\u5c06 ESPHome \u8282\u70b9 `{name}` \u6dfb\u52a0\u5230 Home Assistant\uff1f", "title": "\u53d1\u73b0\u4e86 ESPHome \u8282\u70b9" }, + "encryption_key": { + "data": { + "noise_psk": "\u52a0\u5bc6\u5bc6\u94a5" + }, + "description": "\u8bf7\u8f93\u5165\u60a8\u5728\u914d\u7f6e\u4e2d\u8bbe\u5907 {name} \u6240\u8bbe\u7f6e\u7684\u52a0\u5bc6\u5bc6\u94a5\u3002" + }, + "reauth_confirm": { + "data": { + "noise_psk": "\u52a0\u5bc6\u5bc6\u94a5" + }, + "description": "ESPHome \u8bbe\u5907 {name} \u5df2\u542f\u7528\u6216\u66f4\u6539\u4f20\u8f93\u52a0\u5bc6\u5bc6\u94a5\u3002\u8bf7\u8f93\u5165\u66f4\u65b0\u540e\u7684\u5bc6\u94a5\u4fe1\u606f\u3002" + }, "user": { "data": { - "host": "\u4e3b\u673a", + "host": "\u4e3b\u673a\u5730\u5740", "port": "\u7aef\u53e3" }, "description": "\u8bf7\u8f93\u5165\u60a8\u7684 [ESPHome](https://esphomelib.com/) \u8282\u70b9\u7684\u8fde\u63a5\u8bbe\u7f6e\u3002" diff --git a/homeassistant/components/fan/translations/he.json b/homeassistant/components/fan/translations/he.json index db876480dfc..92e38a79918 100644 --- a/homeassistant/components/fan/translations/he.json +++ b/homeassistant/components/fan/translations/he.json @@ -1,8 +1,16 @@ { "device_automation": { + "action_type": { + "turn_off": "\u05db\u05d9\u05d1\u05d5\u05d9 {entity_name}", + "turn_on": "\u05d4\u05e4\u05e2\u05dc\u05ea {entity_name}" + }, "condition_type": { "is_off": "{entity_name} \u05db\u05d1\u05d5\u05d9", "is_on": "{entity_name} \u05e4\u05d5\u05e2\u05dc" + }, + "trigger_type": { + "turned_off": "{entity_name} \u05db\u05d5\u05d1\u05d4", + "turned_on": "{entity_name} \u05d4\u05d5\u05e4\u05e2\u05dc" } }, "state": { diff --git a/homeassistant/components/flux_led/translations/de.json b/homeassistant/components/flux_led/translations/de.json new file mode 100644 index 00000000000..f036e7bd913 --- /dev/null +++ b/homeassistant/components/flux_led/translations/de.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Ger\u00e4t ist bereits konfiguriert", + "already_in_progress": "Der Konfigurationsablauf wird bereits ausgef\u00fchrt", + "no_devices_found": "Keine Ger\u00e4te im Netzwerk gefunden" + }, + "error": { + "cannot_connect": "Verbindung fehlgeschlagen" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "M\u00f6chtest du {model} {id} ({ipaddr})?" + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Wenn du den Host leer l\u00e4sst, wird die Erkennung verwendet, um Ger\u00e4te zu finden." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Benutzerdefinierter Effekt: Liste mit 1 bis 16 [R,G,B]-Farben. Beispiel: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Benutzerdefinierter Effekt: Geschwindigkeit in Prozent f\u00fcr den Effekt, der die Farbe wechselt.", + "custom_effect_transition": "Benutzerdefinierter Effekt: Art des \u00dcbergangs zwischen den Farben.", + "mode": "Der gew\u00e4hlte Helligkeitsmodus." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/en.json b/homeassistant/components/flux_led/translations/en.json new file mode 100644 index 00000000000..9a988408c30 --- /dev/null +++ b/homeassistant/components/flux_led/translations/en.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Device is already configured", + "already_in_progress": "Configuration flow is already in progress", + "no_devices_found": "No devices found on the network" + }, + "error": { + "cannot_connect": "Failed to connect" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "Do you want to setup {model} {id} ({ipaddr})?" + }, + "user": { + "data": { + "host": "Host" + }, + "description": "If you leave the host empty, discovery will be used to find devices." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Custom Effect: List of 1 to 16 [R,G,B] colors. Example: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Custom Effect: Speed in percents for the effect that switch colors.", + "custom_effect_transition": "Custom Effect: Type of transition between the colors.", + "mode": "The chosen brightness mode." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/huawei_lte/translations/zh-Hans.json b/homeassistant/components/huawei_lte/translations/zh-Hans.json index 4fb447403d6..a63ff964b62 100644 --- a/homeassistant/components/huawei_lte/translations/zh-Hans.json +++ b/homeassistant/components/huawei_lte/translations/zh-Hans.json @@ -1,8 +1,42 @@ { "config": { + "abort": { + "already_configured": "\u8bbe\u5907\u5df2\u88ab\u914d\u7f6e", + "already_in_progress": "\u914d\u7f6e\u6d41\u7a0b\u5df2\u5728\u8fdb\u884c", + "not_huawei_lte": "\u8be5\u8bbe\u5907\u4e0d\u662f\u534e\u4e3a LTE \u8bbe\u5907" + }, "error": { + "connection_timeout": "\u8fde\u63a5\u8d85\u65f6", + "incorrect_password": "\u5bc6\u7801\u9519\u8bef", "incorrect_username": "\u7528\u6237\u540d\u9519\u8bef", - "login_attempts_exceeded": "\u5df2\u8d85\u8fc7\u6700\u5927\u767b\u5f55\u6b21\u6570\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5" + "invalid_auth": "\u51ed\u8bc1\u65e0\u6548", + "invalid_url": "\u65e0\u6548\u7f51\u5740", + "login_attempts_exceeded": "\u5df2\u8d85\u8fc7\u6700\u5927\u767b\u5f55\u6b21\u6570\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5", + "response_error": "\u8bbe\u5907\u51fa\u73b0\u672a\u77e5\u9519\u8bef", + "unknown": "\u672a\u77e5\u9519\u8bef" + }, + "step": { + "user": { + "data": { + "url": "\u4e3b\u673a\u5730\u5740", + "username": "\u7528\u6237\u540d" + }, + "description": "\u8f93\u5165\u8bbe\u5907\u76f8\u5173\u4fe1\u606f\u4ee5\u4fbf\u8fde\u63a5\u81f3\u8be5\u8bbe\u5907", + "title": "\u914d\u7f6e\u534e\u4e3aLTE" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "name": "\u63a8\u9001\u670d\u52a1\u540d\u79f0\uff08\u66f4\u6539\u540e\u9700\u8981\u91cd\u8f7d\uff09", + "recipient": "\u77ed\u4fe1\u901a\u77e5\u6536\u4ef6\u4eba", + "track_new_devices": "\u8ddf\u8e2a\u65b0\u8bbe\u5907", + "track_wired_clients": "\u8ddf\u8e2a\u6709\u7ebf\u7f51\u7edc\u5ba2\u6237\u7aef", + "unauthenticated_mode": "\u672a\u7ecf\u8eab\u4efd\u9a8c\u8bc1\u7684\u6a21\u5f0f\uff08\u66f4\u6539\u540e\u9700\u8981\u91cd\u8f7d\uff09" + } + } } } } \ No newline at end of file diff --git a/homeassistant/components/nmap_tracker/translations/zh-Hans.json b/homeassistant/components/nmap_tracker/translations/zh-Hans.json index e0ca0563b7a..5b1be2f497d 100644 --- a/homeassistant/components/nmap_tracker/translations/zh-Hans.json +++ b/homeassistant/components/nmap_tracker/translations/zh-Hans.json @@ -22,10 +22,13 @@ "step": { "init": { "data": { + "consider_home": "\u7b49\u5f85\u591a\u5c11\u79d2\u540e\u5219\u5224\u5b9a\u8bbe\u5907\u79bb\u5f00", "exclude": "\u4ece\u626b\u63cf\u4e2d\u6392\u9664\u7684\u7f51\u7edc\u5730\u5740\uff08\u4ee5\u9017\u53f7\u5206\u9694\uff09", "home_interval": "\u626b\u63cf\u8bbe\u5907\u7684\u6700\u5c0f\u95f4\u9694\u5206\u949f\u6570\uff08\u7528\u4e8e\u8282\u7701\u7535\u91cf\uff09", "hosts": "\u8981\u626b\u63cf\u7684\u7f51\u7edc\u5730\u5740\uff08\u4ee5\u9017\u53f7\u5206\u9694\uff09", - "scan_options": "Nmap \u7684\u539f\u59cb\u53ef\u914d\u7f6e\u626b\u63cf\u9009\u9879" + "interval_seconds": "\u626b\u63cf\u95f4\u9694\uff08\u79d2\uff09", + "scan_options": "Nmap \u7684\u539f\u59cb\u53ef\u914d\u7f6e\u626b\u63cf\u9009\u9879", + "track_new_devices": "\u8ddf\u8e2a\u65b0\u8bbe\u5907" }, "description": "\u914d\u7f6e\u901a\u8fc7 Nmap \u626b\u63cf\u7684\u4e3b\u673a\u3002\u7f51\u7edc\u5730\u5740\u548c\u6392\u9664\u9879\u53ef\u4ee5\u662f IP \u5730\u5740 (192.168.1.1)\u3001IP \u5730\u5740\u5757 (192.168.0.0/24) \u6216 IP \u8303\u56f4 (192.168.1.0-32)\u3002" } diff --git a/homeassistant/components/opengarage/translations/he.json b/homeassistant/components/opengarage/translations/he.json new file mode 100644 index 00000000000..7f9a4197d54 --- /dev/null +++ b/homeassistant/components/opengarage/translations/he.json @@ -0,0 +1,22 @@ +{ + "config": { + "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4" + }, + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", + "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" + }, + "step": { + "user": { + "data": { + "device_key": "\u05de\u05e4\u05ea\u05d7 \u05d4\u05ea\u05e7\u05df", + "host": "\u05de\u05d0\u05e8\u05d7", + "port": "\u05e4\u05ea\u05d7\u05d4", + "verify_ssl": "\u05d0\u05d9\u05de\u05d5\u05ea \u05d0\u05d9\u05e9\u05d5\u05e8 SSL" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/opengarage/translations/zh-Hans.json b/homeassistant/components/opengarage/translations/zh-Hans.json new file mode 100644 index 00000000000..4f99ec0f978 --- /dev/null +++ b/homeassistant/components/opengarage/translations/zh-Hans.json @@ -0,0 +1,12 @@ +{ + "config": { + "abort": { + "already_configured": "\u8bbe\u5907\u5df2\u88ab\u914d\u7f6e" + }, + "error": { + "cannot_connect": "\u8fde\u63a5\u5931\u8d25", + "invalid_auth": "\u51ed\u8bc1\u65e0\u6548", + "unknown": "\u672a\u77e5\u9519\u8bef" + } + } +} \ No newline at end of file diff --git a/homeassistant/components/switchbot/translations/he.json b/homeassistant/components/switchbot/translations/he.json index 9e4d8129169..09f62069706 100644 --- a/homeassistant/components/switchbot/translations/he.json +++ b/homeassistant/components/switchbot/translations/he.json @@ -2,6 +2,7 @@ "config": { "abort": { "already_configured_device": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", "unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4" }, "error": { diff --git a/homeassistant/components/tplink/translations/he.json b/homeassistant/components/tplink/translations/he.json index 053fc43039a..621ee6bebc9 100644 --- a/homeassistant/components/tplink/translations/he.json +++ b/homeassistant/components/tplink/translations/he.json @@ -1,12 +1,26 @@ { "config": { "abort": { + "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", "no_devices_found": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05de\u05db\u05e9\u05d9\u05e8\u05d9\u05dd \u05d1\u05e8\u05e9\u05ea", "single_instance_allowed": "\u05ea\u05e6\u05d5\u05e8\u05ea\u05d5 \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4. \u05e8\u05e7 \u05ea\u05e6\u05d5\u05e8\u05d4 \u05d0\u05d7\u05ea \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea." }, + "error": { + "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" + }, "step": { "confirm": { "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d4\u05ea\u05e7\u05e0\u05d9\u05dd \u05d7\u05db\u05de\u05d9\u05dd \u05e9\u05dc TP-Link ?" + }, + "pick_device": { + "data": { + "device": "\u05d4\u05ea\u05e7\u05df" + } + }, + "user": { + "data": { + "host": "\u05de\u05d0\u05e8\u05d7" + } } } } diff --git a/homeassistant/components/tuya/translations/he.json b/homeassistant/components/tuya/translations/he.json index 44a7699e511..548e623533a 100644 --- a/homeassistant/components/tuya/translations/he.json +++ b/homeassistant/components/tuya/translations/he.json @@ -8,23 +8,53 @@ "error": { "invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9" }, - "flow_title": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d8\u05d5\u05d9\u05d4", + "flow_title": "\u05ea\u05e6\u05d5\u05e8\u05ea Tuya", "step": { + "login": { + "data": { + "access_id": "\u05de\u05d6\u05d4\u05d4 \u05d2\u05d9\u05e9\u05d4", + "access_secret": "\u05e1\u05d5\u05d3 \u05d2\u05d9\u05e9\u05d4", + "country_code": "\u05e7\u05d5\u05d3 \u05de\u05d3\u05d9\u05e0\u05d4", + "endpoint": "\u05d0\u05d6\u05d5\u05e8 \u05d6\u05de\u05d9\u05e0\u05d5\u05ea", + "password": "\u05e1\u05d9\u05e1\u05de\u05d4", + "tuya_app_type": "\u05d9\u05d9\u05e9\u05d5\u05dd \u05dc\u05e0\u05d9\u05d9\u05d3", + "username": "\u05d7\u05e9\u05d1\u05d5\u05df" + }, + "description": "\u05d4\u05d6\u05e0\u05ea \u05d0\u05d9\u05e9\u05d5\u05e8 \u05d4-Tuya \u05e9\u05dc\u05da", + "title": "Tuya" + }, "user": { "data": { "country_code": "\u05e7\u05d5\u05d3 \u05de\u05d3\u05d9\u05e0\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da (\u05dc\u05de\u05e9\u05dc, 1 \u05dc\u05d0\u05e8\u05d4\"\u05d1 \u05d0\u05d5 972 \u05dc\u05d9\u05e9\u05e8\u05d0\u05dc)", "password": "\u05e1\u05d9\u05e1\u05de\u05d4", "platform": "\u05d4\u05d9\u05d9\u05e9\u05d5\u05dd \u05d1\u05d5 \u05e8\u05e9\u05d5\u05dd \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05dc\u05da", + "tuya_project_type": "\u05e1\u05d5\u05d2 \u05e4\u05e8\u05d5\u05d9\u05d9\u05e7\u05d8 \u05d4\u05e2\u05e0\u05df \u05e9\u05dc Tuya", "username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9" }, - "description": "\u05d4\u05d6\u05df \u05d0\u05ea \u05d0\u05d9\u05e9\u05d5\u05e8\u05d9 \u05d8\u05d5\u05d9\u05d4 \u05e9\u05dc\u05da.", - "title": "Tuya" + "description": "\u05d4\u05d6\u05e0\u05ea \u05d0\u05d9\u05e9\u05d5\u05e8\u05d9 \u05d4-Tuya \u05e9\u05dc\u05da.", + "title": "\u05e9\u05d9\u05dc\u05d5\u05d1 Tuya" } } }, "options": { "abort": { "cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4" + }, + "error": { + "dev_multi_type": "\u05d4\u05ea\u05e7\u05e0\u05d9\u05dd \u05e0\u05d1\u05d7\u05e8\u05d9\u05dd \u05de\u05e8\u05d5\u05d1\u05d9\u05dd \u05dc\u05e7\u05d1\u05d9\u05e2\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05d7\u05d9\u05d9\u05d1\u05d9\u05dd \u05dc\u05d4\u05d9\u05d5\u05ea \u05de\u05d0\u05d5\u05ea\u05d5 \u05e1\u05d5\u05d2", + "dev_not_config": "\u05e1\u05d5\u05d2 \u05d4\u05d4\u05ea\u05e7\u05df \u05d0\u05d9\u05e0\u05d5 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05d2\u05d3\u05e8\u05d4", + "dev_not_found": "\u05d4\u05d4\u05ea\u05e7\u05df \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "\u05d8\u05d5\u05d5\u05d7 \u05d1\u05d4\u05d9\u05e8\u05d5\u05ea \u05d4\u05de\u05e9\u05de\u05e9 \u05d0\u05ea \u05d4\u05d4\u05ea\u05e7\u05df", + "max_kelvin": "\u05d8\u05de\u05e4\u05e8\u05d8\u05d5\u05e8\u05ea \u05e6\u05d1\u05e2 \u05de\u05e8\u05d1\u05d9\u05ea \u05d4\u05e0\u05ea\u05de\u05db\u05ea \u05d1\u05e7\u05dc\u05d5\u05d5\u05d9\u05df", + "min_kelvin": "\u05d8\u05de\u05e4\u05e8\u05d8\u05d5\u05e8\u05ea \u05e6\u05d1\u05e2 \u05de\u05d9\u05e0\u05d9\u05de\u05dc\u05d9\u05ea \u05d4\u05e0\u05ea\u05de\u05db\u05ea \u05d1\u05e7\u05dc\u05d5\u05d5\u05d9\u05df", + "support_color": "\u05db\u05e4\u05d4 \u05ea\u05de\u05d9\u05db\u05d4 \u05d1\u05e6\u05d1\u05e2", + "unit_of_measurement": "\u05d9\u05d7\u05d9\u05d3\u05ea \u05d8\u05de\u05e4\u05e8\u05d8\u05d5\u05e8\u05d4 \u05d4\u05de\u05e9\u05de\u05e9\u05ea \u05d0\u05ea \u05d4\u05d4\u05ea\u05e7\u05df" + } + } } } } \ No newline at end of file diff --git a/homeassistant/components/xiaomi_aqara/translations/he.json b/homeassistant/components/xiaomi_aqara/translations/he.json index 5a12ddc3b9e..7450bbd463c 100644 --- a/homeassistant/components/xiaomi_aqara/translations/he.json +++ b/homeassistant/components/xiaomi_aqara/translations/he.json @@ -2,22 +2,41 @@ "config": { "abort": { "already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d4\u05ea\u05e7\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4", - "already_in_progress": "\u05d6\u05e8\u05d9\u05de\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05db\u05d1\u05e8 \u05de\u05ea\u05d1\u05e6\u05e2\u05ea" + "already_in_progress": "\u05d6\u05e8\u05d9\u05de\u05ea \u05d4\u05ea\u05e6\u05d5\u05e8\u05d4 \u05db\u05d1\u05e8 \u05de\u05ea\u05d1\u05e6\u05e2\u05ea", + "not_xiaomi_aqara": "\u05dc\u05d0 \u05e9\u05e2\u05e8 \u05e9\u05d9\u05d0\u05d5\u05de\u05d9 \u05d0\u05e7\u05d0\u05e8\u05d4, \u05d4\u05ea\u05e7\u05df \u05e9\u05d4\u05ea\u05d2\u05dc\u05d4 \u05dc\u05d0 \u05ea\u05d0\u05dd \u05dc\u05e9\u05e2\u05e8\u05d9\u05dd \u05d9\u05d3\u05d5\u05e2\u05d9\u05dd" + }, + "error": { + "discovery_error": "\u05d2\u05d9\u05dc\u05d5\u05d9 \u05e9\u05e2\u05e8 \u05e9\u05d9\u05d5\u05d0\u05de\u05d9 \u05d0\u05e7\u05d0\u05e8\u05d4 \u05e0\u05db\u05e9\u05dc, \u05e0\u05e1\u05d4 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1-IP \u05e9\u05dc \u05d4\u05d4\u05ea\u05e7\u05df \u05d1\u05d5 \u05e4\u05d5\u05e2\u05dc HomeAssistant \u05db\u05de\u05de\u05e9\u05e7", + "invalid_host": "\u05e9\u05dd \u05de\u05d0\u05e8\u05d7 \u05d0\u05d5 \u05db\u05ea\u05d5\u05d1\u05ea IP \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9\u05d9\u05dd, \u05e8\u05d0\u05d4 https://www.home-assistant.io/integrations/xiaomi_aqara/#connection-problem", + "invalid_interface": "\u05de\u05de\u05e9\u05e7 \u05e8\u05e9\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "invalid_key": "\u05de\u05e4\u05ea\u05d7 \u05e9\u05e2\u05e8 \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9", + "invalid_mac": "\u05db\u05ea\u05d5\u05d1\u05ea Mac \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9\u05ea" }, "flow_title": "{name}", "step": { "select": { "data": { "select_ip": "\u05db\u05ea\u05d5\u05d1\u05ea IP" - } + }, + "description": "\u05d9\u05e9 \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05d4\u05d4\u05ea\u05e7\u05e0\u05d4 \u05e9\u05d5\u05d1 \u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d7\u05d1\u05e8 \u05e9\u05e2\u05e8\u05d9\u05dd \u05e0\u05d5\u05e1\u05e4\u05d9\u05dd", + "title": "\u05d1\u05d7\u05d9\u05e8\u05ea \u05e9\u05e2\u05e8 \u05e9\u05d9\u05d0\u05d5\u05de\u05d9 \u05d0\u05e7\u05d0\u05e8\u05d4 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d7\u05d1\u05e8" }, "settings": { - "description": "\u05e0\u05d9\u05ea\u05df \u05dc\u05d0\u05d7\u05d6\u05e8 \u05d0\u05ea \u05d4\u05de\u05e4\u05ea\u05d7 (\u05e1\u05d9\u05e1\u05de\u05d4) \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05d3\u05e8\u05db\u05d4 \u05d6\u05d5: https://www.domoticz.com/wiki/Xiaomi_Gateway_(Aqara)#Adding_the_Xiaomi_Gateway_to_Domoticz. \u05d0\u05dd \u05d4\u05de\u05e4\u05ea\u05d7 \u05d0\u05d9\u05e0\u05d5 \u05de\u05e1\u05d5\u05e4\u05e7, \u05e8\u05e7 \u05d7\u05d9\u05d9\u05e9\u05e0\u05d9\u05dd \u05d9\u05d4\u05d9\u05d5 \u05e0\u05d2\u05d9\u05e9\u05d9\u05dd" + "data": { + "key": "\u05de\u05e4\u05ea\u05d7 \u05d4\u05e9\u05e2\u05e8 \u05e9\u05dc\u05da", + "name": "\u05e9\u05dd \u05d4\u05e9\u05e2\u05e8" + }, + "description": "\u05e0\u05d9\u05ea\u05df \u05dc\u05d0\u05d7\u05d6\u05e8 \u05d0\u05ea \u05d4\u05de\u05e4\u05ea\u05d7 (\u05e1\u05d9\u05e1\u05de\u05d4) \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05d3\u05e8\u05db\u05d4 \u05d6\u05d5: https://www.domoticz.com/wiki/Xiaomi_Gateway_(Aqara)#Adding_the_Xiaomi_Gateway_to_Domoticz. \u05d0\u05dd \u05d4\u05de\u05e4\u05ea\u05d7 \u05d0\u05d9\u05e0\u05d5 \u05de\u05e1\u05d5\u05e4\u05e7, \u05e8\u05e7 \u05d7\u05d9\u05d9\u05e9\u05e0\u05d9\u05dd \u05d9\u05d4\u05d9\u05d5 \u05e0\u05d2\u05d9\u05e9\u05d9\u05dd", + "title": "\u05e9\u05e2\u05e8 \u05e9\u05d9\u05d0\u05d5\u05de\u05d9 \u05d0\u05e7\u05d0\u05e8\u05d4, \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9\u05d5\u05ea" }, "user": { "data": { - "host": "\u05db\u05ea\u05d5\u05d1\u05ea IP (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)" - } + "host": "\u05db\u05ea\u05d5\u05d1\u05ea IP (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)", + "interface": "\u05de\u05de\u05e9\u05e7 \u05d4\u05e8\u05e9\u05ea \u05d1\u05d5 \u05d9\u05e9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9", + "mac": "\u05db\u05ea\u05d5\u05d1\u05ea Mac (\u05d0\u05d5\u05e4\u05e6\u05d9\u05d5\u05e0\u05dc\u05d9)" + }, + "description": "\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05dc\u05e9\u05e2\u05e8 \u05e9\u05d9\u05d5\u05d0\u05de\u05d9 \u05d0\u05e7\u05d0\u05e8\u05d4 \u05e9\u05dc\u05da, \u05d0\u05dd \u05db\u05ea\u05d5\u05d1\u05d5\u05ea \u05d4-IP \u05d5\u05d4-MAC \u05d9\u05d5\u05d5\u05ea\u05e8\u05d5 \u05e8\u05d9\u05e7\u05d5\u05ea, \u05e0\u05e2\u05e9\u05d4 \u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05d2\u05d9\u05dc\u05d5\u05d9 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9", + "title": "\u05e9\u05e2\u05e8 \u05e9\u05d9\u05d0\u05d5\u05de\u05d9 \u05d0\u05e7\u05d0\u05e8\u05d4" } } } diff --git a/homeassistant/components/zwave_js/translations/he.json b/homeassistant/components/zwave_js/translations/he.json index fae03188b81..041e1cafec6 100644 --- a/homeassistant/components/zwave_js/translations/he.json +++ b/homeassistant/components/zwave_js/translations/he.json @@ -64,5 +64,6 @@ "description": "\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d4\u05e8\u05d7\u05d1\u05d4 \u05de\u05e4\u05e7\u05d7 Z-Wave JS?" } } - } + }, + "title": "Z-Wave JS" } \ No newline at end of file From da6169656632c9bcc1500d9b40e84c29f16a74ec Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 4 Oct 2021 00:11:57 +0000 Subject: [PATCH 057/162] [ci skip] Translation update --- .../components/flux_led/translations/ca.json | 36 +++++++++++++++++++ .../components/flux_led/translations/et.json | 36 +++++++++++++++++++ .../components/flux_led/translations/hu.json | 36 +++++++++++++++++++ .../components/flux_led/translations/it.json | 36 +++++++++++++++++++ .../components/flux_led/translations/ru.json | 36 +++++++++++++++++++ .../components/tuya/translations/hu.json | 14 ++++++++ .../components/zwave_js/translations/hu.json | 8 +++++ 7 files changed, 202 insertions(+) create mode 100644 homeassistant/components/flux_led/translations/ca.json create mode 100644 homeassistant/components/flux_led/translations/et.json create mode 100644 homeassistant/components/flux_led/translations/hu.json create mode 100644 homeassistant/components/flux_led/translations/it.json create mode 100644 homeassistant/components/flux_led/translations/ru.json diff --git a/homeassistant/components/flux_led/translations/ca.json b/homeassistant/components/flux_led/translations/ca.json new file mode 100644 index 00000000000..25314edc1b8 --- /dev/null +++ b/homeassistant/components/flux_led/translations/ca.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "El dispositiu ja est\u00e0 configurat", + "already_in_progress": "El flux de configuraci\u00f3 ja est\u00e0 en curs", + "no_devices_found": "No s'han trobat dispositius a la xarxa" + }, + "error": { + "cannot_connect": "Ha fallat la connexi\u00f3" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "Vols configurar {model} {id} ({ipaddr})?" + }, + "user": { + "data": { + "host": "Amfitri\u00f3" + }, + "description": "Si deixes l'amfitri\u00f3 buit, s'utilitzar\u00e0 el descobriment per cercar dispositius." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Efecte personalitzat: llista d'1 a 16 colors [R,G,B]. Exemple: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Efecte personalitzat: velocitat en percentatges de l'efecte de canvi de color.", + "custom_effect_transition": "Efecte personalitzat: tipus de transici\u00f3 entre colors.", + "mode": "Mode de brillantor escollit." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/et.json b/homeassistant/components/flux_led/translations/et.json new file mode 100644 index 00000000000..0c2e1f444cb --- /dev/null +++ b/homeassistant/components/flux_led/translations/et.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Seade on juba h\u00e4\u00e4lestatud", + "already_in_progress": "Seadistamine on juba k\u00e4imas", + "no_devices_found": "V\u00f5rgust seadmeid ei leitud" + }, + "error": { + "cannot_connect": "\u00dchendamine nurjus" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "Kas seadistada {model} {id} ({ipaddr})?" + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Kui j\u00e4tad hosti t\u00fchjaks kasutatakse seadmete leidmiseks avastamist." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Kohandatud efekt: Loetelu 1 kuni 16 [R,G,B] v\u00e4rvist. N\u00e4ide: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Kohandatud efekt: v\u00e4rvide vahetamise efekti kiirus protsentides.", + "custom_effect_transition": "Kohandatud efekt: v\u00e4rvide vahelise \u00fclemineku t\u00fc\u00fcp.", + "mode": "Valitud heleduse re\u017eiim." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/hu.json b/homeassistant/components/flux_led/translations/hu.json new file mode 100644 index 00000000000..3cfef2c9eb6 --- /dev/null +++ b/homeassistant/components/flux_led/translations/hu.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van", + "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", + "no_devices_found": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a h\u00e1l\u00f3zaton" + }, + "error": { + "cannot_connect": "Sikertelen csatlakoz\u00e1s" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani a(z) {model} {id} ({ipaddr}) webhelyet?" + }, + "user": { + "data": { + "host": "C\u00edm" + }, + "description": "Ha nem ad meg c\u00edmet, akkor az eszk\u00f6z\u00f6k keres\u00e9se a felder\u00edt\u00e9ssel t\u00f6rt\u00e9nik." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Egy\u00e9ni effektus: 1-16 [R,G,B] sz\u00edn list\u00e1ja. P\u00e9lda: [255,0,255], [60,128,0]", + "custom_effect_speed_pct": "Egy\u00e9ni effektus: A sz\u00edneket v\u00e1lt\u00f3 hat\u00e1s sz\u00e1zal\u00e9kos ar\u00e1nya.", + "custom_effect_transition": "Egy\u00e9ni hat\u00e1s: A sz\u00ednek k\u00f6z\u00f6tti \u00e1tmenet t\u00edpusa.", + "mode": "A v\u00e1lasztott f\u00e9nyer\u0151 m\u00f3d." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/it.json b/homeassistant/components/flux_led/translations/it.json new file mode 100644 index 00000000000..91654fb3542 --- /dev/null +++ b/homeassistant/components/flux_led/translations/it.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato", + "already_in_progress": "Il flusso di configurazione \u00e8 gi\u00e0 in corso", + "no_devices_found": "Nessun dispositivo trovato sulla rete" + }, + "error": { + "cannot_connect": "Impossibile connettersi" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "Vuoi configurare {model} {id} ({ipaddr})?" + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Se lasci vuoto l'host, il rilevamento verr\u00e0 utilizzato per trovare i dispositivi." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Effetto personalizzato: Lista da 1 a 16 colori [R,G,B]. Esempio: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Effetto personalizzato: Velocit\u00e0 in percentuale per l'effetto che cambia colore.", + "custom_effect_transition": "Effetto personalizzato: Tipo di transizione tra i colori.", + "mode": "La modalit\u00e0 di luminosit\u00e0 scelta." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/ru.json b/homeassistant/components/flux_led/translations/ru.json new file mode 100644 index 00000000000..e0f7a73baab --- /dev/null +++ b/homeassistant/components/flux_led/translations/ru.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant.", + "already_in_progress": "\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.", + "no_devices_found": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432 \u0441\u0435\u0442\u0438." + }, + "error": { + "cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f." + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "\u0425\u043e\u0442\u0438\u0442\u0435 \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 {model} {id} ({ipaddr})?" + }, + "user": { + "data": { + "host": "\u0425\u043e\u0441\u0442" + }, + "description": "\u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0445\u043e\u0441\u0442\u0430, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442: \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442 1 \u0434\u043e 16 [R,G,B] \u0446\u0432\u0435\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u043e\u0432 (\u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u0445).", + "custom_effect_transition": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442: \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u0446\u0432\u0435\u0442\u0430\u043c\u0438.", + "mode": "\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u044f\u0440\u043a\u043e\u0441\u0442\u0438." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/tuya/translations/hu.json b/homeassistant/components/tuya/translations/hu.json index b90d2a2ff81..d721a8cd133 100644 --- a/homeassistant/components/tuya/translations/hu.json +++ b/homeassistant/components/tuya/translations/hu.json @@ -10,11 +10,25 @@ }, "flow_title": "Tuya konfigur\u00e1ci\u00f3", "step": { + "login": { + "data": { + "access_id": "Hozz\u00e1f\u00e9r\u00e9si azonos\u00edt\u00f3", + "access_secret": "Hozz\u00e1f\u00e9r\u00e9si token", + "country_code": "Orsz\u00e1g k\u00f3d", + "endpoint": "El\u00e9rhet\u0151s\u00e9gi z\u00f3na", + "password": "Jelsz\u00f3", + "tuya_app_type": "Mobil app", + "username": "Fi\u00f3k" + }, + "description": "Adja meg Tuya hiteles\u00edt\u0151 adatait.", + "title": "Tuya" + }, "user": { "data": { "country_code": "A fi\u00f3k orsz\u00e1gk\u00f3dja (pl. 1 USA, 36 Magyarorsz\u00e1g, vagy 86 K\u00edna)", "password": "Jelsz\u00f3", "platform": "Az alkalmaz\u00e1s, ahol a fi\u00f3k regisztr\u00e1lt", + "tuya_project_type": "Tuya felh\u0151 projekt t\u00edpusa", "username": "Felhaszn\u00e1l\u00f3n\u00e9v" }, "description": "Adja meg Tuya hiteles\u00edt\u0151 adatait.", diff --git a/homeassistant/components/zwave_js/translations/hu.json b/homeassistant/components/zwave_js/translations/hu.json index bf541fce26a..715881fb329 100644 --- a/homeassistant/components/zwave_js/translations/hu.json +++ b/homeassistant/components/zwave_js/translations/hu.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "H\u00e1l\u00f3zati kulcs", + "s0_legacy_key": "S0 kulcs (r\u00e9gi)", + "s2_access_control_key": "S2 Hozz\u00e1f\u00e9r\u00e9s kulcs", + "s2_authenticated_key": "S2 hiteles\u00edtett kulcs", + "s2_unauthenticated_key": "S2 nem hiteles\u00edtett kulcs", "usb_path": "USB eszk\u00f6z el\u00e9r\u00e9si \u00fat" }, "title": "Adja meg a Z-Wave JS kieg\u00e9sz\u00edt\u0151 konfigur\u00e1ci\u00f3j\u00e1t" @@ -109,6 +113,10 @@ "emulate_hardware": "Hardver emul\u00e1ci\u00f3", "log_level": "Napl\u00f3szint", "network_key": "H\u00e1l\u00f3zati kulcs", + "s0_legacy_key": "S0 kulcs (r\u00e9gi)", + "s2_access_control_key": "S2 hozz\u00e1f\u00e9r\u00e9si ", + "s2_authenticated_key": "S2 hiteles\u00edtett kulcs", + "s2_unauthenticated_key": "S2 nem hiteles\u00edtett kulcs", "usb_path": "USB eszk\u00f6z \u00fatvonala" }, "title": "Adja meg a Z-Wave JS kieg\u00e9sz\u00edt\u0151 konfigur\u00e1ci\u00f3j\u00e1t" From 491abf0608a3d3b48e1563de659c67003973cafc Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 4 Oct 2021 08:35:42 -0700 Subject: [PATCH 058/162] Bumped version to 2021.10.0b5 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index d803b673e41..4dbf3ea2785 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b4" +PATCH_VERSION: Final = "0b5" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From b086266508a49f4ca7eb7679abc4dc66362c1cb3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 4 Oct 2021 08:38:24 -0700 Subject: [PATCH 059/162] [ci skip] Translation update --- .../components/adguard/translations/hu.json | 2 +- .../components/almond/translations/hu.json | 2 +- .../components/ambee/translations/hu.json | 2 +- .../components/broadlink/translations/hu.json | 2 +- .../components/brother/translations/hu.json | 2 +- .../components/cast/translations/hu.json | 2 +- .../components/deconz/translations/hu.json | 4 +- .../components/esphome/translations/hu.json | 2 +- .../components/flux_led/translations/nl.json | 36 ++++++++++ .../components/flux_led/translations/no.json | 36 ++++++++++ .../flux_led/translations/zh-Hant.json | 36 ++++++++++ .../homekit_controller/translations/hu.json | 2 +- .../components/hue/translations/hu.json | 2 +- .../components/kodi/translations/hu.json | 2 +- .../mobile_app/translations/hu.json | 2 +- .../modern_forms/translations/hu.json | 2 +- .../components/motioneye/translations/hu.json | 2 +- .../components/mqtt/translations/hu.json | 2 +- .../components/roon/translations/hu.json | 2 +- .../components/samsungtv/translations/hu.json | 4 +- .../components/smappee/translations/hu.json | 2 +- .../components/tuya/translations/en.json | 65 ++++++++++++++++++- .../components/tuya/translations/nl.json | 1 + .../components/tuya/translations/no.json | 16 ++++- .../components/vera/translations/hu.json | 4 +- .../components/vizio/translations/hu.json | 2 +- .../components/volumio/translations/hu.json | 2 +- .../components/wled/translations/hu.json | 4 +- .../components/zwave_js/translations/nl.json | 8 +++ .../components/zwave_js/translations/no.json | 8 +++ 30 files changed, 230 insertions(+), 28 deletions(-) create mode 100644 homeassistant/components/flux_led/translations/nl.json create mode 100644 homeassistant/components/flux_led/translations/no.json create mode 100644 homeassistant/components/flux_led/translations/zh-Hant.json diff --git a/homeassistant/components/adguard/translations/hu.json b/homeassistant/components/adguard/translations/hu.json index 3939de8aea5..b04d67fbb89 100644 --- a/homeassistant/components/adguard/translations/hu.json +++ b/homeassistant/components/adguard/translations/hu.json @@ -9,7 +9,7 @@ }, "step": { "hassio_confirm": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot AdGuard Home-hoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot AdGuard Home-hoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", "title": "Az AdGuard Home a Home Assistant kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel" }, "user": { diff --git a/homeassistant/components/almond/translations/hu.json b/homeassistant/components/almond/translations/hu.json index 27932696561..d75290b4fd1 100644 --- a/homeassistant/components/almond/translations/hu.json +++ b/homeassistant/components/almond/translations/hu.json @@ -8,7 +8,7 @@ }, "step": { "hassio_confirm": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot az Almondhoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot Almondhoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", "title": "Almond - Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal" }, "pick_implementation": { diff --git a/homeassistant/components/ambee/translations/hu.json b/homeassistant/components/ambee/translations/hu.json index 299d97914bc..6cb59bba925 100644 --- a/homeassistant/components/ambee/translations/hu.json +++ b/homeassistant/components/ambee/translations/hu.json @@ -21,7 +21,7 @@ "longitude": "Hossz\u00fas\u00e1g", "name": "N\u00e9v" }, - "description": "\u00c1ll\u00edtsa be Ambee-t Home Assistant-tal val\u00f3 integr\u00e1ci\u00f3hoz." + "description": "Integr\u00e1lja \u00f6ssze Ambeet Home Assistanttal." } } } diff --git a/homeassistant/components/broadlink/translations/hu.json b/homeassistant/components/broadlink/translations/hu.json index 3d792f43597..d3a59a03cea 100644 --- a/homeassistant/components/broadlink/translations/hu.json +++ b/homeassistant/components/broadlink/translations/hu.json @@ -32,7 +32,7 @@ "data": { "unlock": "Igen, csin\u00e1ld." }, - "description": "{name} ({model} a {host} c\u00edmen) z\u00e1rolva van. Ez hiteles\u00edt\u00e9si probl\u00e9m\u00e1khoz vezethet Home Assistant-ban. Szeretn\u00e9 feloldani?", + "description": "{name} ({model} a {host} c\u00edmen) z\u00e1rolva van. Ez hiteles\u00edt\u00e9si probl\u00e9m\u00e1khoz vezethet Home Assistantban. Szeretn\u00e9 feloldani?", "title": "Az eszk\u00f6z felold\u00e1sa (opcion\u00e1lis)" }, "user": { diff --git a/homeassistant/components/brother/translations/hu.json b/homeassistant/components/brother/translations/hu.json index 9d733e4cda6..f0218dc2647 100644 --- a/homeassistant/components/brother/translations/hu.json +++ b/homeassistant/components/brother/translations/hu.json @@ -22,7 +22,7 @@ "data": { "type": "A nyomtat\u00f3 t\u00edpusa" }, - "description": "Hozz\u00e1 szeretn\u00e9 adni a {model} Brother nyomtat\u00f3t, amelynek sorsz\u00e1ma: `{serial_number}`, Home Assistant-hoz?", + "description": "Hozz\u00e1 szeretn\u00e9 adni a {model} Brother nyomtat\u00f3t, amelynek sorsz\u00e1ma: `{serial_number}`, Home Assistanthoz?", "title": "Felfedezett Brother nyomtat\u00f3" } } diff --git a/homeassistant/components/cast/translations/hu.json b/homeassistant/components/cast/translations/hu.json index 2d74d3183c8..a4c8da3242e 100644 --- a/homeassistant/components/cast/translations/hu.json +++ b/homeassistant/components/cast/translations/hu.json @@ -29,7 +29,7 @@ "ignore_cec": "A CEC figyelmen k\u00edv\u00fcl hagy\u00e1sa", "uuid": "Enged\u00e9lyezett UUID-k" }, - "description": "Enged\u00e9lyezett UUID - vessz\u0151vel elv\u00e1lasztott lista a Cast-eszk\u00f6z\u00f6k UUID-j\u00e9b\u0151l, amelyeket hozz\u00e1 lehet adni Home Assistant-hoz. Csak akkor haszn\u00e1lja, ha nem akarja hozz\u00e1adni az \u00f6sszes rendelkez\u00e9sre \u00e1ll\u00f3 cast eszk\u00f6zt.\nCEC figyelmen k\u00edv\u00fcl hagy\u00e1sa - vessz\u0151vel elv\u00e1lasztott Chromecast-lista, amelynek figyelmen k\u00edv\u00fcl kell hagynia a CEC-adatokat az akt\u00edv bemenet meghat\u00e1roz\u00e1s\u00e1hoz. Ezt tov\u00e1bb\u00edtjuk a pychromecast.IGNORE_CEC c\u00edmre.", + "description": "Enged\u00e9lyezett UUID - vessz\u0151vel elv\u00e1lasztott lista a Cast-eszk\u00f6z\u00f6k UUID-j\u00e9b\u0151l, amelyeket hozz\u00e1 lehet adni Home Assistanthoz. Csak akkor haszn\u00e1lja, ha nem akarja hozz\u00e1adni az \u00f6sszes rendelkez\u00e9sre \u00e1ll\u00f3 cast eszk\u00f6zt.\nCEC figyelmen k\u00edv\u00fcl hagy\u00e1sa - vessz\u0151vel elv\u00e1lasztott Chromecast-lista, amelynek figyelmen k\u00edv\u00fcl kell hagynia a CEC-adatokat az akt\u00edv bemenet meghat\u00e1roz\u00e1s\u00e1hoz. Ezt tov\u00e1bb\u00edtjuk a pychromecast.IGNORE_CEC c\u00edmre.", "title": "Speci\u00e1lis Google Cast-konfigur\u00e1ci\u00f3" }, "basic_options": { diff --git a/homeassistant/components/deconz/translations/hu.json b/homeassistant/components/deconz/translations/hu.json index 664f3768a22..a78a6ef1961 100644 --- a/homeassistant/components/deconz/translations/hu.json +++ b/homeassistant/components/deconz/translations/hu.json @@ -14,11 +14,11 @@ "flow_title": "{host}", "step": { "hassio_confirm": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot, hogy csatlakozzon {addon} \u00e1ltal biztos\u00edtott deCONZ \u00e1tj\u00e1r\u00f3hoz?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot, hogy csatlakozzon {addon} \u00e1ltal biztos\u00edtott deCONZ \u00e1tj\u00e1r\u00f3hoz?", "title": "deCONZ Zigbee \u00e1tj\u00e1r\u00f3 Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal" }, "link": { - "description": "Enged\u00e9lyezze fel a deCONZ \u00e1tj\u00e1r\u00f3ban a Home Assistant-hoz val\u00f3 regisztr\u00e1l\u00e1st.\n\n1. V\u00e1lassza ki a deCONZ rendszer be\u00e1ll\u00edt\u00e1sait\n2. Nyomja meg az \"Authenticate app\" gombot", + "description": "Enged\u00e9lyezze fel a deCONZ \u00e1tj\u00e1r\u00f3ban a Home Assistanthoz val\u00f3 regisztr\u00e1l\u00e1st.\n\n1. V\u00e1lassza ki a deCONZ rendszer be\u00e1ll\u00edt\u00e1sait\n2. Nyomja meg az \"Authenticate app\" gombot", "title": "Kapcsol\u00f3d\u00e1s a deCONZ-hoz" }, "manual_input": { diff --git a/homeassistant/components/esphome/translations/hu.json b/homeassistant/components/esphome/translations/hu.json index d7ac503d83c..e65577f055e 100644 --- a/homeassistant/components/esphome/translations/hu.json +++ b/homeassistant/components/esphome/translations/hu.json @@ -20,7 +20,7 @@ "description": "K\u00e9rem, adja meg a konfigur\u00e1ci\u00f3ban {name} n\u00e9vhez be\u00e1ll\u00edtott jelsz\u00f3t." }, "discovery_confirm": { - "description": "Szeretn\u00e9 hozz\u00e1adni `{name}` ESPHome csom\u00f3pontot Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni `{name}` ESPHome csom\u00f3pontot Home Assistanthoz?", "title": "Felfedezett ESPHome csom\u00f3pont" }, "encryption_key": { diff --git a/homeassistant/components/flux_led/translations/nl.json b/homeassistant/components/flux_led/translations/nl.json new file mode 100644 index 00000000000..fd9e04bd475 --- /dev/null +++ b/homeassistant/components/flux_led/translations/nl.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Apparaat is al geconfigureerd", + "already_in_progress": "De configuratiestroom is al aan de gang", + "no_devices_found": "Geen apparaten gevonden op het netwerk" + }, + "error": { + "cannot_connect": "Kan geen verbinding maken" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "Wilt u {model} {id} ( {ipaddr} ) instellen?" + }, + "user": { + "data": { + "host": "Host" + }, + "description": "Als u de host leeg laat, wordt detectie gebruikt om apparaten te vinden." + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Aangepast effect: Lijst van 1 tot 16 [R,G,B] kleuren. Voorbeeld: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Aangepast effect: snelheid in procenten voor het effect dat van kleur verandert.", + "custom_effect_transition": "Aangepast effect: Type overgang tussen de kleuren.", + "mode": "De gekozen helderheidsstand." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/no.json b/homeassistant/components/flux_led/translations/no.json new file mode 100644 index 00000000000..ec105c1ac14 --- /dev/null +++ b/homeassistant/components/flux_led/translations/no.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "Enheten er allerede konfigurert", + "already_in_progress": "Konfigurasjonsflyten p\u00e5g\u00e5r allerede", + "no_devices_found": "Ingen enheter funnet p\u00e5 nettverket" + }, + "error": { + "cannot_connect": "Tilkobling mislyktes" + }, + "flow_title": "{model} {id} ( {ipaddr} )", + "step": { + "discovery_confirm": { + "description": "Vil du konfigurere {model} {id} ( {ipaddr} )?" + }, + "user": { + "data": { + "host": "Vert" + }, + "description": "Hvis du lar verten st\u00e5 tom, brukes automatisk oppdagelse til \u00e5 finne enheter" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "Egendefinert effekt: Liste med farger fra 1 til 16 [R,G,B]. Eksempel: [255,0,255],[60,128,0]", + "custom_effect_speed_pct": "Egendefinert effekt: Hastighet i prosent for effekten som bytter farger.", + "custom_effect_transition": "Egendefinert effekt: Overgangstype mellom fargene.", + "mode": "Den valgte lysstyrkemodusen." + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/flux_led/translations/zh-Hant.json b/homeassistant/components/flux_led/translations/zh-Hant.json new file mode 100644 index 00000000000..4e14b58ff18 --- /dev/null +++ b/homeassistant/components/flux_led/translations/zh-Hant.json @@ -0,0 +1,36 @@ +{ + "config": { + "abort": { + "already_configured": "\u88dd\u7f6e\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210", + "already_in_progress": "\u8a2d\u5b9a\u5df2\u7d93\u9032\u884c\u4e2d", + "no_devices_found": "\u7db2\u8def\u4e0a\u627e\u4e0d\u5230\u88dd\u7f6e" + }, + "error": { + "cannot_connect": "\u9023\u7dda\u5931\u6557" + }, + "flow_title": "{model} {id} ({ipaddr})", + "step": { + "discovery_confirm": { + "description": "\u662f\u5426\u8981\u8a2d\u5b9a {model} {id} ({ipaddr})\uff1f" + }, + "user": { + "data": { + "host": "\u4e3b\u6a5f\u7aef" + }, + "description": "\u5047\u5982\u4e3b\u6a5f\u7aef\u4f4d\u5740\u6b04\u4f4d\u70ba\u7a7a\u767d\uff0c\u5c07\u6703\u63a2\u7d22\u6240\u6709\u53ef\u7528\u88dd\u7f6e\u3002" + } + } + }, + "options": { + "step": { + "init": { + "data": { + "custom_effect_colors": "\u81ea\u8a02\u7279\u6548\uff1a1 \u5230 16 \u7a2e [R,G,B] \u984f\u8272\u3002\u4f8b\u5982\uff1a[255,0,255]\u3001[60,128,0]", + "custom_effect_speed_pct": "\u81ea\u8a02\u7279\u6548\uff1a\u984f\u8272\u5207\u63db\u7684\u901f\u5ea6\u767e\u5206\u6bd4\u3002", + "custom_effect_transition": "\u81ea\u8a02\u7279\u6548\uff1a\u984f\u8272\u9593\u7684\u8f49\u63db\u985e\u578b\u3002", + "mode": "\u9078\u64c7\u4eae\u5ea6\u6a21\u5f0f\u3002" + } + } + } + } +} \ No newline at end of file diff --git a/homeassistant/components/homekit_controller/translations/hu.json b/homeassistant/components/homekit_controller/translations/hu.json index aef97c7b3ba..7703925ae67 100644 --- a/homeassistant/components/homekit_controller/translations/hu.json +++ b/homeassistant/components/homekit_controller/translations/hu.json @@ -6,7 +6,7 @@ "already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.", "already_paired": "Ez a tartoz\u00e9k m\u00e1r p\u00e1ros\u00edtva van egy m\u00e1sik eszk\u00f6zzel. \u00c1ll\u00edtsa alaphelyzetbe a tartoz\u00e9kot, majd pr\u00f3b\u00e1lkozzon \u00fajra.", "ignored_model": "A HomeKit t\u00e1mogat\u00e1sa e modelln\u00e9l blokkolva van, mivel a szolg\u00e1ltat\u00e1shoz teljes nat\u00edv integr\u00e1ci\u00f3 \u00e9rhet\u0151 el.", - "invalid_config_entry": "Ez az eszk\u00f6z k\u00e9szen \u00e1ll a p\u00e1ros\u00edt\u00e1sra, de m\u00e1r van egy \u00fctk\u00f6z\u0151 konfigur\u00e1ci\u00f3s bejegyz\u00e9s Home Assistant-ben, amelyet el\u0151sz\u00f6r el kell t\u00e1vol\u00edtani.", + "invalid_config_entry": "Ez az eszk\u00f6z k\u00e9szen \u00e1ll a p\u00e1ros\u00edt\u00e1sra, de m\u00e1r van egy \u00fctk\u00f6z\u0151 konfigur\u00e1ci\u00f3s bejegyz\u00e9s Home Assistantban, amelyet el\u0151sz\u00f6r el kell t\u00e1vol\u00edtani.", "invalid_properties": "Az eszk\u00f6z \u00e1ltal bejelentett \u00e9rv\u00e9nytelen tulajdons\u00e1gok.", "no_devices": "Nem tal\u00e1lhat\u00f3 nem p\u00e1ros\u00edtott eszk\u00f6z" }, diff --git a/homeassistant/components/hue/translations/hu.json b/homeassistant/components/hue/translations/hu.json index 2f04c53163f..a114fc2c890 100644 --- a/homeassistant/components/hue/translations/hu.json +++ b/homeassistant/components/hue/translations/hu.json @@ -22,7 +22,7 @@ "title": "V\u00e1lasszon Hue bridge-t" }, "link": { - "description": "Nyomja meg a gombot a bridge-en a Philips Hue Home Assistant-ben val\u00f3 regisztr\u00e1l\u00e1s\u00e1hoz.\n\n![Location of button on bridge](/static/images/config_philips_hue.jpg)", + "description": "Nyomja meg a gombot a bridge-en a Philips Hue Home Assistantban val\u00f3 regisztr\u00e1l\u00e1s\u00e1hoz.\n\n![Gomb helye](/static/images/config_philips_hue.jpg)", "title": "Kapcsol\u00f3d\u00e1s a hubhoz" }, "manual": { diff --git a/homeassistant/components/kodi/translations/hu.json b/homeassistant/components/kodi/translations/hu.json index 017d33010ac..e561bd5d6a4 100644 --- a/homeassistant/components/kodi/translations/hu.json +++ b/homeassistant/components/kodi/translations/hu.json @@ -22,7 +22,7 @@ "description": "Adja meg a Kodi felhaszn\u00e1l\u00f3nevet \u00e9s jelsz\u00f3t. Ezek megtal\u00e1lhat\u00f3k a Rendszer/Be\u00e1ll\u00edt\u00e1sok/H\u00e1l\u00f3zat/Szolg\u00e1ltat\u00e1sok r\u00e9szben." }, "discovery_confirm": { - "description": "Szeretn\u00e9 hozz\u00e1adni a Kodi (`{name}`)-t Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni a Kodi (`{name}`)-t Home Assistanthoz?", "title": "Felfedezett Kodi" }, "user": { diff --git a/homeassistant/components/mobile_app/translations/hu.json b/homeassistant/components/mobile_app/translations/hu.json index 1dda8ce7223..a92f84958be 100644 --- a/homeassistant/components/mobile_app/translations/hu.json +++ b/homeassistant/components/mobile_app/translations/hu.json @@ -1,7 +1,7 @@ { "config": { "abort": { - "install_app": "Nyissa meg a mobil alkalmaz\u00e1st Home Assistant-tal val\u00f3 integr\u00e1ci\u00f3hoz. A kompatibilis alkalmaz\u00e1sok list\u00e1j\u00e1nak megtekint\u00e9s\u00e9hez ellen\u0151rizze [a le\u00edr\u00e1st]({apps_url})." + "install_app": "Nyissa meg a mobil alkalmaz\u00e1st Home Assistanttal val\u00f3 integr\u00e1ci\u00f3hoz. A kompatibilis alkalmaz\u00e1sok list\u00e1j\u00e1nak megtekint\u00e9s\u00e9hez ellen\u0151rizze [a le\u00edr\u00e1st]({apps_url})." }, "step": { "confirm": { diff --git a/homeassistant/components/modern_forms/translations/hu.json b/homeassistant/components/modern_forms/translations/hu.json index 5bea7c3054e..49f5da5339f 100644 --- a/homeassistant/components/modern_forms/translations/hu.json +++ b/homeassistant/components/modern_forms/translations/hu.json @@ -16,7 +16,7 @@ "data": { "host": "C\u00edm" }, - "description": "\u00c1ll\u00edtsa be Modern Forms-t, hogy integr\u00e1l\u00f3djon Home Assistant-ba." + "description": "Integr\u00e1lja \u00f6ssze Modern Formst Home Assistanttal." }, "zeroconf_confirm": { "description": "Hozz\u00e1 szeretn\u00e9 adni `{name}`nev\u0171 Modern Forms rajong\u00f3t Home Assistanthoz?", diff --git a/homeassistant/components/motioneye/translations/hu.json b/homeassistant/components/motioneye/translations/hu.json index c381d3954d4..0acc46509a4 100644 --- a/homeassistant/components/motioneye/translations/hu.json +++ b/homeassistant/components/motioneye/translations/hu.json @@ -12,7 +12,7 @@ }, "step": { "hassio_confirm": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot, hogy csatlakozzon {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal biztos\u00edtott motionEye szolg\u00e1ltat\u00e1shoz?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot motionEyehez val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", "title": "motionEye a Home Assistant kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel" }, "user": { diff --git a/homeassistant/components/mqtt/translations/hu.json b/homeassistant/components/mqtt/translations/hu.json index 471982756eb..9da3c6d9666 100644 --- a/homeassistant/components/mqtt/translations/hu.json +++ b/homeassistant/components/mqtt/translations/hu.json @@ -22,7 +22,7 @@ "data": { "discovery": "Felfedez\u00e9s enged\u00e9lyez\u00e9se" }, - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistant-ot MQTT br\u00f3kerhez val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot MQTT br\u00f3kerhez val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?", "title": "MQTT Br\u00f3ker - Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal" } } diff --git a/homeassistant/components/roon/translations/hu.json b/homeassistant/components/roon/translations/hu.json index 09bad262c45..7d2b63f0f4b 100644 --- a/homeassistant/components/roon/translations/hu.json +++ b/homeassistant/components/roon/translations/hu.json @@ -9,7 +9,7 @@ }, "step": { "link": { - "description": "Enged\u00e9lyeznie kell az Home Assistant-ot a Roonban. Miut\u00e1n r\u00e1kattintott a K\u00fcld\u00e9s gombra, nyissa meg a Roon Core alkalmaz\u00e1st, nyissa meg a Be\u00e1ll\u00edt\u00e1sokat, \u00e9s enged\u00e9lyezze a Home Assistant funkci\u00f3t a B\u0151v\u00edtm\u00e9nyek lapon.", + "description": "Enged\u00e9lyeznie kell az Home Assistantot a Roonban. Miut\u00e1n r\u00e1kattintott a K\u00fcld\u00e9s gombra, nyissa meg a Roon Core alkalmaz\u00e1st, nyissa meg a Be\u00e1ll\u00edt\u00e1sokat, \u00e9s enged\u00e9lyezze a Home Assistant funkci\u00f3t a B\u0151v\u00edtm\u00e9nyek lapon.", "title": "Enged\u00e9lyezze a Home Assistant alkalmaz\u00e1st Roon-ban" }, "user": { diff --git a/homeassistant/components/samsungtv/translations/hu.json b/homeassistant/components/samsungtv/translations/hu.json index 93c0b2bee6d..efdf5f4810b 100644 --- a/homeassistant/components/samsungtv/translations/hu.json +++ b/homeassistant/components/samsungtv/translations/hu.json @@ -17,7 +17,7 @@ "flow_title": "{device}", "step": { "confirm": { - "description": "Szeretn\u00e9 be\u00e1ll\u00edtani {device} k\u00e9sz\u00fcl\u00e9k\u00e9t? Ha kor\u00e1bban m\u00e9g sosem csatlakoztatta Home Assistant-hoz, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ami j\u00f3v\u00e1hagy\u00e1sra v\u00e1r.", + "description": "Szeretn\u00e9 be\u00e1ll\u00edtani {device} k\u00e9sz\u00fcl\u00e9k\u00e9t? Ha kor\u00e1bban m\u00e9g sosem csatlakoztatta Home Assistanthoz, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ami j\u00f3v\u00e1hagy\u00e1sra v\u00e1r.", "title": "Samsung TV" }, "reauth_confirm": { @@ -28,7 +28,7 @@ "host": "C\u00edm", "name": "N\u00e9v" }, - "description": "\u00cdrd be a Samsung TV adatait. Ha m\u00e9g soha nem csatlakozott Home Assistant-hez, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ahol hiteles\u00edt\u00e9st k\u00e9r." + "description": "\u00cdrja be a Samsung TV adatait. Ha m\u00e9g soha nem csatlakozott Home Assistanthoz, akkor meg kell jelennie egy felugr\u00f3 ablaknak a TV k\u00e9perny\u0151j\u00e9n, ahol meg kell adni az enged\u00e9lyt." } } } diff --git a/homeassistant/components/smappee/translations/hu.json b/homeassistant/components/smappee/translations/hu.json index 5b4a83a74b0..9c3d90ac43e 100644 --- a/homeassistant/components/smappee/translations/hu.json +++ b/homeassistant/components/smappee/translations/hu.json @@ -15,7 +15,7 @@ "data": { "environment": "K\u00f6rnyezet" }, - "description": "\u00c1ll\u00edtsa be a Smappee k\u00e9sz\u00fcl\u00e9ket az HomeAssistant-al val\u00f3 integr\u00e1ci\u00f3hoz." + "description": "Integr\u00e1lja \u00f6ssze Smappee k\u00e9sz\u00fcl\u00e9ket HomeAssistanttal." }, "local": { "data": { diff --git a/homeassistant/components/tuya/translations/en.json b/homeassistant/components/tuya/translations/en.json index a3630e66406..4b4b9a6d1dd 100644 --- a/homeassistant/components/tuya/translations/en.json +++ b/homeassistant/components/tuya/translations/en.json @@ -1,19 +1,82 @@ { "config": { + "abort": { + "cannot_connect": "Failed to connect", + "invalid_auth": "Invalid authentication", + "single_instance_allowed": "Already configured. Only a single configuration possible." + }, "error": { "invalid_auth": "Invalid authentication", "login_error": "Login error ({code}): {msg}" }, + "flow_title": "Tuya configuration", "step": { + "login": { + "data": { + "access_id": "Access ID", + "access_secret": "Access Secret", + "country_code": "Country Code", + "endpoint": "Availability Zone", + "password": "Password", + "tuya_app_type": "Mobile App", + "username": "Account" + }, + "description": "Enter your Tuya credential", + "title": "Tuya" + }, "user": { "data": { "access_id": "Tuya IoT Access ID", "access_secret": "Tuya IoT Access Secret", + "country_code": "Your account country code (e.g., 1 for USA or 86 for China)", "password": "Password", + "platform": "The app where your account is registered", "region": "Region", + "tuya_project_type": "Tuya cloud project type", "username": "Account" }, - "description": "Enter your Tuya credentials" + "description": "Enter your Tuya credentials", + "title": "Tuya Integration" + } + } + }, + "options": { + "abort": { + "cannot_connect": "Failed to connect" + }, + "error": { + "dev_multi_type": "Multiple selected devices to configure must be of the same type", + "dev_not_config": "Device type not configurable", + "dev_not_found": "Device not found" + }, + "step": { + "device": { + "data": { + "brightness_range_mode": "Brightness range used by device", + "curr_temp_divider": "Current Temperature value divider (0 = use default)", + "max_kelvin": "Max color temperature supported in kelvin", + "max_temp": "Max target temperature (use min and max = 0 for default)", + "min_kelvin": "Min color temperature supported in kelvin", + "min_temp": "Min target temperature (use min and max = 0 for default)", + "set_temp_divided": "Use divided Temperature value for set temperature command", + "support_color": "Force color support", + "temp_divider": "Temperature values divider (0 = use default)", + "temp_step_override": "Target Temperature step", + "tuya_max_coltemp": "Max color temperature reported by device", + "unit_of_measurement": "Temperature unit used by device" + }, + "description": "Configure options to adjust displayed information for {device_type} device `{device_name}`", + "title": "Configure Tuya Device" + }, + "init": { + "data": { + "discovery_interval": "Discovery device polling interval in seconds", + "list_devices": "Select the devices to configure or leave empty to save configuration", + "query_device": "Select device that will use query method for faster status update", + "query_interval": "Query device polling interval in seconds" + }, + "description": "Do not set pollings interval values too low or the calls will fail generating error message in the log", + "title": "Configure Tuya Options" } } } diff --git a/homeassistant/components/tuya/translations/nl.json b/homeassistant/components/tuya/translations/nl.json index be405db1a08..22a63800fd6 100644 --- a/homeassistant/components/tuya/translations/nl.json +++ b/homeassistant/components/tuya/translations/nl.json @@ -13,6 +13,7 @@ "login": { "data": { "access_id": "Toegangs-ID", + "access_secret": "Access Secret", "country_code": "Landcode", "endpoint": "Beschikbaarheidszone", "password": "Wachtwoord", diff --git a/homeassistant/components/tuya/translations/no.json b/homeassistant/components/tuya/translations/no.json index eedf24be696..b5fe4bc1851 100644 --- a/homeassistant/components/tuya/translations/no.json +++ b/homeassistant/components/tuya/translations/no.json @@ -10,15 +10,29 @@ }, "flow_title": "Tuya konfigurasjon", "step": { + "login": { + "data": { + "access_id": "Tilgangs -ID", + "access_secret": "Tilgangshemmelighet", + "country_code": "Landskode", + "endpoint": "Tilgjengelighetssone", + "password": "Passord", + "tuya_app_type": "Mobilapp", + "username": "Konto" + }, + "description": "Skriv inn Tuya-legitimasjonen din", + "title": "Tuya" + }, "user": { "data": { "country_code": "Din landskode for kontoen din (f.eks. 1 for USA eller 86 for Kina)", "password": "Passord", "platform": "Appen der kontoen din er registrert", + "tuya_project_type": "Tuya -skyprosjekttype", "username": "Brukernavn" }, "description": "Angi Tuya-legitimasjonen din.", - "title": "" + "title": "Tuya Integrasjon" } } }, diff --git a/homeassistant/components/vera/translations/hu.json b/homeassistant/components/vera/translations/hu.json index 4e9639b0258..d1d4910c97a 100644 --- a/homeassistant/components/vera/translations/hu.json +++ b/homeassistant/components/vera/translations/hu.json @@ -6,7 +6,7 @@ "step": { "user": { "data": { - "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa Home Assistant-b\u00f3l.", + "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa Home Assistantb\u00f3l.", "lights": "A Vera kapcsol\u00f3eszk\u00f6z-azonos\u00edt\u00f3k f\u00e9nyk\u00e9nt kezelhet\u0151k a Home Assistant alkalmaz\u00e1sban.", "vera_controller_url": "Vez\u00e9rl\u0151 URL" }, @@ -19,7 +19,7 @@ "step": { "init": { "data": { - "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa Home Assistant-b\u00f3l.", + "exclude": "Vera eszk\u00f6zazonos\u00edt\u00f3k kiz\u00e1r\u00e1sa Home Assistantb\u00f3l.", "lights": "A Vera kapcsol\u00f3eszk\u00f6z-azonos\u00edt\u00f3k f\u00e9nyk\u00e9nt kezelhet\u0151k a Home Assistant alkalmaz\u00e1sban." }, "description": "Az opcion\u00e1lis param\u00e9terekr\u0151l a vera dokument\u00e1ci\u00f3j\u00e1ban olvashat: https://www.home-assistant.io/integrations/vera/. Megjegyz\u00e9s: Az itt v\u00e9grehajtott v\u00e1ltoztat\u00e1sokhoz \u00fajra kell ind\u00edtani a h\u00e1zi asszisztens szervert. Az \u00e9rt\u00e9kek t\u00f6rl\u00e9s\u00e9hez adjon meg egy sz\u00f3k\u00f6zt.", diff --git a/homeassistant/components/vizio/translations/hu.json b/homeassistant/components/vizio/translations/hu.json index 3708bfbc379..bb619e359c0 100644 --- a/homeassistant/components/vizio/translations/hu.json +++ b/homeassistant/components/vizio/translations/hu.json @@ -19,7 +19,7 @@ "title": "V\u00e9gezze el a p\u00e1ros\u00edt\u00e1si folyamatot" }, "pairing_complete": { - "description": "A VIZIO SmartCast Eszk\u00f6z mostant\u00f3l csatlakozik Home Assistant-hoz.", + "description": "A VIZIO SmartCast Eszk\u00f6z mostant\u00f3l csatlakozik Home Assistanthoz.", "title": "P\u00e1ros\u00edt\u00e1s k\u00e9sz" }, "pairing_complete_import": { diff --git a/homeassistant/components/volumio/translations/hu.json b/homeassistant/components/volumio/translations/hu.json index 209a892af3d..b504275e03f 100644 --- a/homeassistant/components/volumio/translations/hu.json +++ b/homeassistant/components/volumio/translations/hu.json @@ -10,7 +10,7 @@ }, "step": { "discovery_confirm": { - "description": "Szeretn\u00e9 hozz\u00e1adni a Volumio (`{name}`)-t a Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni a Volumio (`{name}`)-t a Home Assistanthoz?", "title": "Felfedezett Volumio" }, "user": { diff --git a/homeassistant/components/wled/translations/hu.json b/homeassistant/components/wled/translations/hu.json index 2e0ac08d3cb..1fa29cfee48 100644 --- a/homeassistant/components/wled/translations/hu.json +++ b/homeassistant/components/wled/translations/hu.json @@ -13,10 +13,10 @@ "data": { "host": "C\u00edm" }, - "description": "\u00c1ll\u00edtsa be a WLED-et Home Assistant-ba val\u00f3 integr\u00e1l\u00e1shoz." + "description": "\u00c1ll\u00edtsa be a WLED-et Home Assistantba val\u00f3 integr\u00e1l\u00e1shoz." }, "zeroconf_confirm": { - "description": "Szeretn\u00e9 hozz\u00e1adni a(z) `{name}` WLED-et Home Assistant-hoz?", + "description": "Szeretn\u00e9 hozz\u00e1adni a(z) `{name}` WLED-et Home Assistanthoz?", "title": "Felfedezett WLED eszk\u00f6z" } } diff --git a/homeassistant/components/zwave_js/translations/nl.json b/homeassistant/components/zwave_js/translations/nl.json index b7a3a68fe6b..76718aa5346 100644 --- a/homeassistant/components/zwave_js/translations/nl.json +++ b/homeassistant/components/zwave_js/translations/nl.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "Netwerksleutel", + "s0_legacy_key": "S0 Sleutel (Legacy)", + "s2_access_control_key": "S2 Toegangscontrolesleutel", + "s2_authenticated_key": "S2 geverifieerde sleutel", + "s2_unauthenticated_key": "S2 niet-geverifieerde sleutel", "usb_path": "USB-apparaatpad" }, "title": "Voer de Z-Wave JS add-on configuratie in" @@ -109,6 +113,10 @@ "emulate_hardware": "Emulate Hardware", "log_level": "Log level", "network_key": "Netwerksleutel", + "s0_legacy_key": "S0 Sleutel (Legacy)", + "s2_access_control_key": "S2 Toegangscontrolesleutel", + "s2_authenticated_key": "S2 geverifieerde sleutel", + "s2_unauthenticated_key": "S2 niet-geverifieerde sleutel", "usb_path": "USB-apparaatpad" }, "title": "Voer de configuratie van de Z-Wave JS-add-on in" diff --git a/homeassistant/components/zwave_js/translations/no.json b/homeassistant/components/zwave_js/translations/no.json index 9ddf12a3b85..f08f5bd07cb 100644 --- a/homeassistant/components/zwave_js/translations/no.json +++ b/homeassistant/components/zwave_js/translations/no.json @@ -27,6 +27,10 @@ "configure_addon": { "data": { "network_key": "Nettverksn\u00f8kkel", + "s0_legacy_key": "S0-n\u00f8kkel (eldre)", + "s2_access_control_key": "N\u00f8kkel for S2-tilgangskontroll", + "s2_authenticated_key": "S2 Autentisert n\u00f8kkel", + "s2_unauthenticated_key": "S2 Uautentisert n\u00f8kkel", "usb_path": "USB enhetsbane" }, "title": "Angi konfigurasjon for Z-Wave JS-tillegg" @@ -109,6 +113,10 @@ "emulate_hardware": "Emuler maskinvare", "log_level": "Loggniv\u00e5", "network_key": "Nettverksn\u00f8kkel", + "s0_legacy_key": "S0-n\u00f8kkel (eldre)", + "s2_access_control_key": "N\u00f8kkel for S2-tilgangskontroll", + "s2_authenticated_key": "S2 Autentisert n\u00f8kkel", + "s2_unauthenticated_key": "S2 Uautentisert n\u00f8kkel", "usb_path": "USB enhetsbane" }, "title": "Angi konfigurasjon for Z-Wave JS-tillegg" From f82fe9d8bba09375683908a8cab72a675aeadb91 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 4 Oct 2021 18:47:44 +0200 Subject: [PATCH 060/162] Improve sensor statistics validation (#56892) --- homeassistant/components/sensor/recorder.py | 59 ++- .../components/recorder/test_websocket_api.py | 202 +------- tests/components/sensor/test_recorder.py | 437 +++++++++++++++++- 3 files changed, 486 insertions(+), 212 deletions(-) diff --git a/homeassistant/components/sensor/recorder.py b/homeassistant/components/sensor/recorder.py index fd6cf5e0f2f..c485622af80 100644 --- a/homeassistant/components/sensor/recorder.py +++ b/homeassistant/components/sensor/recorder.py @@ -637,35 +637,70 @@ def validate_statistics( """Validate statistics.""" validation_result = defaultdict(list) - sensor_states = _get_sensor_states(hass) + sensor_states = hass.states.all(DOMAIN) + metadatas = statistics.get_metadata(hass, [i.entity_id for i in sensor_states]) for state in sensor_states: entity_id = state.entity_id device_class = state.attributes.get(ATTR_DEVICE_CLASS) + state_class = state.attributes.get(ATTR_STATE_CLASS) state_unit = state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) - if device_class not in UNIT_CONVERSIONS: - metadata = statistics.get_metadata(hass, (entity_id,)) - if not metadata: - continue - metadata_unit = metadata[entity_id][1]["unit_of_measurement"] - if state_unit != metadata_unit: + if metadata := metadatas.get(entity_id): + if not is_entity_recorded(hass, state.entity_id): + # Sensor was previously recorded, but no longer is validation_result[entity_id].append( statistics.ValidationIssue( - "units_changed", + "entity_not_recorded", + {"statistic_id": entity_id}, + ) + ) + + if state_class not in STATE_CLASSES: + # Sensor no longer has a valid state class + validation_result[entity_id].append( + statistics.ValidationIssue( + "unsupported_state_class", + {"statistic_id": entity_id, "state_class": state_class}, + ) + ) + + metadata_unit = metadata[1]["unit_of_measurement"] + if device_class not in UNIT_CONVERSIONS: + if state_unit != metadata_unit: + # The unit has changed + validation_result[entity_id].append( + statistics.ValidationIssue( + "units_changed", + { + "statistic_id": entity_id, + "state_unit": state_unit, + "metadata_unit": metadata_unit, + }, + ) + ) + elif metadata_unit != DEVICE_CLASS_UNITS[device_class]: + # The unit in metadata is not supported for this device class + validation_result[entity_id].append( + statistics.ValidationIssue( + "unsupported_unit_metadata", { "statistic_id": entity_id, - "state_unit": state_unit, + "device_class": device_class, "metadata_unit": metadata_unit, + "supported_unit": DEVICE_CLASS_UNITS[device_class], }, ) ) - continue - if state_unit not in UNIT_CONVERSIONS[device_class]: + if ( + device_class in UNIT_CONVERSIONS + and state_unit not in UNIT_CONVERSIONS[device_class] + ): + # The unit in the state is not supported for this device class validation_result[entity_id].append( statistics.ValidationIssue( - "unsupported_unit", + "unsupported_unit_state", { "statistic_id": entity_id, "device_class": device_class, diff --git a/tests/components/recorder/test_websocket_api.py b/tests/components/recorder/test_websocket_api.py index 4f54a43ca6e..e60659aaab2 100644 --- a/tests/components/recorder/test_websocket_api.py +++ b/tests/components/recorder/test_websocket_api.py @@ -6,34 +6,19 @@ import pytest from pytest import approx from homeassistant.components.recorder.const import DATA_INSTANCE -from homeassistant.components.recorder.models import StatisticsMeta -from homeassistant.components.recorder.util import session_scope from homeassistant.setup import async_setup_component import homeassistant.util.dt as dt_util -from homeassistant.util.unit_system import IMPERIAL_SYSTEM, METRIC_SYSTEM +from homeassistant.util.unit_system import METRIC_SYSTEM from .common import trigger_db_commit from tests.common import init_recorder_component -BATTERY_SENSOR_ATTRIBUTES = { - "device_class": "battery", - "state_class": "measurement", - "unit_of_measurement": "%", -} POWER_SENSOR_ATTRIBUTES = { "device_class": "power", "state_class": "measurement", "unit_of_measurement": "kW", } -NONE_SENSOR_ATTRIBUTES = { - "state_class": "measurement", -} -PRESSURE_SENSOR_ATTRIBUTES = { - "device_class": "pressure", - "state_class": "measurement", - "unit_of_measurement": "hPa", -} TEMPERATURE_SENSOR_ATTRIBUTES = { "device_class": "temperature", "state_class": "measurement", @@ -41,21 +26,8 @@ TEMPERATURE_SENSOR_ATTRIBUTES = { } -@pytest.mark.parametrize( - "units, attributes, unit", - [ - (IMPERIAL_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), - (METRIC_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), - (IMPERIAL_SYSTEM, TEMPERATURE_SENSOR_ATTRIBUTES, "°F"), - (METRIC_SYSTEM, TEMPERATURE_SENSOR_ATTRIBUTES, "°C"), - (IMPERIAL_SYSTEM, PRESSURE_SENSOR_ATTRIBUTES, "psi"), - (METRIC_SYSTEM, PRESSURE_SENSOR_ATTRIBUTES, "Pa"), - ], -) -async def test_validate_statistics_supported_device_class( - hass, hass_ws_client, units, attributes, unit -): - """Test list_statistic_ids.""" +async def test_validate_statistics(hass, hass_ws_client): + """Test validate_statistics can be called.""" id = 1 def next_id(): @@ -71,177 +43,9 @@ async def test_validate_statistics_supported_device_class( assert response["success"] assert response["result"] == expected_result - now = dt_util.utcnow() - - hass.config.units = units - await hass.async_add_executor_job(init_recorder_component, hass) - await async_setup_component(hass, "sensor", {}) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - client = await hass_ws_client() - # No statistics, no state - empty response - await assert_validation_result(client, {}) - - # No statistics, valid state - empty response - hass.states.async_set( - "sensor.test", 10, attributes={**attributes, **{"unit_of_measurement": unit}} - ) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_validation_result(client, {}) - - # No statistics, invalid state - expect error - hass.states.async_set( - "sensor.test", 11, attributes={**attributes, **{"unit_of_measurement": "dogs"}} - ) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - expected = { - "sensor.test": [ - { - "data": { - "device_class": attributes["device_class"], - "state_unit": "dogs", - "statistic_id": "sensor.test", - }, - "type": "unsupported_unit", - } - ], - } - await assert_validation_result(client, expected) - - # Statistics has run, invalid state - expect error - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) - hass.states.async_set( - "sensor.test", 12, attributes={**attributes, **{"unit_of_measurement": "dogs"}} - ) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_validation_result(client, expected) - - # Valid state - empty response - hass.states.async_set( - "sensor.test", 13, attributes={**attributes, **{"unit_of_measurement": unit}} - ) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_validation_result(client, {}) - - # Valid state, statistic runs again - empty response - hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_validation_result(client, {}) - - # Remove the state - empty response - hass.states.async_remove("sensor.test") - await assert_validation_result(client, {}) - - -@pytest.mark.parametrize( - "attributes", - [BATTERY_SENSOR_ATTRIBUTES, NONE_SENSOR_ATTRIBUTES], -) -async def test_validate_statistics_unsupported_device_class( - hass, hass_ws_client, attributes -): - """Test list_statistic_ids.""" - id = 1 - - def next_id(): - nonlocal id - id += 1 - return id - - async def assert_validation_result(client, expected_result): - await client.send_json( - {"id": next_id(), "type": "recorder/validate_statistics"} - ) - response = await client.receive_json() - assert response["success"] - assert response["result"] == expected_result - - async def assert_statistic_ids(expected_result): - with session_scope(hass=hass) as session: - db_states = list(session.query(StatisticsMeta)) - assert len(db_states) == len(expected_result) - for i in range(len(db_states)): - assert db_states[i].statistic_id == expected_result[i]["statistic_id"] - assert ( - db_states[i].unit_of_measurement - == expected_result[i]["unit_of_measurement"] - ) - - now = dt_util.utcnow() - await hass.async_add_executor_job(init_recorder_component, hass) - await async_setup_component(hass, "sensor", {}) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) client = await hass_ws_client() - rec = hass.data[DATA_INSTANCE] - - # No statistics, no state - empty response - await assert_validation_result(client, {}) - - # No statistics, original unit - empty response - hass.states.async_set("sensor.test", 10, attributes=attributes) - await assert_validation_result(client, {}) - - # No statistics, changed unit - empty response - hass.states.async_set( - "sensor.test", 11, attributes={**attributes, **{"unit_of_measurement": "dogs"}} - ) - await assert_validation_result(client, {}) - - # Run statistics, no statistics will be generated because of conflicting units - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - rec.do_adhoc_statistics(start=now) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_statistic_ids([]) - - # No statistics, changed unit - empty response - hass.states.async_set( - "sensor.test", 12, attributes={**attributes, **{"unit_of_measurement": "dogs"}} - ) - await assert_validation_result(client, {}) - - # Run statistics one hour later, only the "dogs" state will be considered - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - rec.do_adhoc_statistics(start=now + timedelta(hours=1)) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_statistic_ids( - [{"statistic_id": "sensor.test", "unit_of_measurement": "dogs"}] - ) - await assert_validation_result(client, {}) - - # Change back to original unit - expect error - hass.states.async_set("sensor.test", 13, attributes=attributes) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - expected = { - "sensor.test": [ - { - "data": { - "metadata_unit": "dogs", - "state_unit": attributes.get("unit_of_measurement"), - "statistic_id": "sensor.test", - }, - "type": "units_changed", - } - ], - } - await assert_validation_result(client, expected) - - # Changed unit - empty response - hass.states.async_set( - "sensor.test", 14, attributes={**attributes, **{"unit_of_measurement": "dogs"}} - ) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_validation_result(client, {}) - - # Valid state, statistic runs again - empty response - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) - await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) - await assert_validation_result(client, {}) - - # Remove the state - empty response - hass.states.async_remove("sensor.test") await assert_validation_result(client, {}) diff --git a/tests/components/sensor/test_recorder.py b/tests/components/sensor/test_recorder.py index f13dc5084bb..9ae4b467da5 100644 --- a/tests/components/sensor/test_recorder.py +++ b/tests/components/sensor/test_recorder.py @@ -11,24 +11,37 @@ from pytest import approx from homeassistant import loader from homeassistant.components.recorder import history from homeassistant.components.recorder.const import DATA_INSTANCE -from homeassistant.components.recorder.models import process_timestamp_to_utc_isoformat +from homeassistant.components.recorder.models import ( + StatisticsMeta, + process_timestamp_to_utc_isoformat, +) from homeassistant.components.recorder.statistics import ( get_metadata, list_statistic_ids, statistics_during_period, ) +from homeassistant.components.recorder.util import session_scope from homeassistant.const import STATE_UNAVAILABLE from homeassistant.setup import setup_component import homeassistant.util.dt as dt_util from homeassistant.util.unit_system import IMPERIAL_SYSTEM, METRIC_SYSTEM +from tests.common import async_setup_component, init_recorder_component from tests.components.recorder.common import wait_recording_done +BATTERY_SENSOR_ATTRIBUTES = { + "device_class": "battery", + "state_class": "measurement", + "unit_of_measurement": "%", +} ENERGY_SENSOR_ATTRIBUTES = { "device_class": "energy", "state_class": "measurement", "unit_of_measurement": "kWh", } +NONE_SENSOR_ATTRIBUTES = { + "state_class": "measurement", +} POWER_SENSOR_ATTRIBUTES = { "device_class": "power", "state_class": "measurement", @@ -2080,6 +2093,428 @@ def record_states(hass, zero, entity_id, attributes, seq=None): return four, states +@pytest.mark.parametrize( + "units, attributes, unit", + [ + (IMPERIAL_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), + (METRIC_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), + (IMPERIAL_SYSTEM, TEMPERATURE_SENSOR_ATTRIBUTES, "°F"), + (METRIC_SYSTEM, TEMPERATURE_SENSOR_ATTRIBUTES, "°C"), + (IMPERIAL_SYSTEM, PRESSURE_SENSOR_ATTRIBUTES, "psi"), + (METRIC_SYSTEM, PRESSURE_SENSOR_ATTRIBUTES, "Pa"), + ], +) +async def test_validate_statistics_supported_device_class( + hass, hass_ws_client, units, attributes, unit +): + """Test validate_statistics.""" + id = 1 + + def next_id(): + nonlocal id + id += 1 + return id + + async def assert_validation_result(client, expected_result): + await client.send_json( + {"id": next_id(), "type": "recorder/validate_statistics"} + ) + response = await client.receive_json() + assert response["success"] + assert response["result"] == expected_result + + now = dt_util.utcnow() + + hass.config.units = units + await hass.async_add_executor_job(init_recorder_component, hass) + await async_setup_component(hass, "sensor", {}) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + client = await hass_ws_client() + + # No statistics, no state - empty response + await assert_validation_result(client, {}) + + # No statistics, valid state - empty response + hass.states.async_set( + "sensor.test", 10, attributes={**attributes, **{"unit_of_measurement": unit}} + ) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # No statistics, invalid state - expect error + hass.states.async_set( + "sensor.test", 11, attributes={**attributes, **{"unit_of_measurement": "dogs"}} + ) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + expected = { + "sensor.test": [ + { + "data": { + "device_class": attributes["device_class"], + "state_unit": "dogs", + "statistic_id": "sensor.test", + }, + "type": "unsupported_unit_state", + } + ], + } + await assert_validation_result(client, expected) + + # Statistics has run, invalid state - expect error + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) + hass.states.async_set( + "sensor.test", 12, attributes={**attributes, **{"unit_of_measurement": "dogs"}} + ) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, expected) + + # Valid state - empty response + hass.states.async_set( + "sensor.test", 13, attributes={**attributes, **{"unit_of_measurement": unit}} + ) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # Valid state, statistic runs again - empty response + hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # Remove the state - empty response + hass.states.async_remove("sensor.test") + await assert_validation_result(client, {}) + + +@pytest.mark.parametrize( + "units, attributes, unit", + [ + (IMPERIAL_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), + ], +) +async def test_validate_statistics_supported_device_class_2( + hass, hass_ws_client, units, attributes, unit +): + """Test validate_statistics.""" + id = 1 + + def next_id(): + nonlocal id + id += 1 + return id + + async def assert_validation_result(client, expected_result): + await client.send_json( + {"id": next_id(), "type": "recorder/validate_statistics"} + ) + response = await client.receive_json() + assert response["success"] + assert response["result"] == expected_result + + now = dt_util.utcnow() + + hass.config.units = units + await hass.async_add_executor_job(init_recorder_component, hass) + await async_setup_component(hass, "sensor", {}) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + client = await hass_ws_client() + + # No statistics, no state - empty response + await assert_validation_result(client, {}) + + # No statistics, valid state - empty response + initial_attributes = {"state_class": "measurement"} + hass.states.async_set("sensor.test", 10, attributes=initial_attributes) + await hass.async_block_till_done() + await assert_validation_result(client, {}) + + # Statistics has run, device class set - expect error + hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + hass.states.async_set("sensor.test", 12, attributes=attributes) + await hass.async_block_till_done() + expected = { + "sensor.test": [ + { + "data": { + "device_class": attributes["device_class"], + "metadata_unit": None, + "statistic_id": "sensor.test", + "supported_unit": unit, + }, + "type": "unsupported_unit_metadata", + } + ], + } + await assert_validation_result(client, expected) + + # Invalid state too, expect double errors + hass.states.async_set( + "sensor.test", 13, attributes={**attributes, **{"unit_of_measurement": "dogs"}} + ) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + expected = { + "sensor.test": [ + { + "data": { + "device_class": attributes["device_class"], + "metadata_unit": None, + "statistic_id": "sensor.test", + "supported_unit": unit, + }, + "type": "unsupported_unit_metadata", + }, + { + "data": { + "device_class": attributes["device_class"], + "state_unit": "dogs", + "statistic_id": "sensor.test", + }, + "type": "unsupported_unit_state", + }, + ], + } + await assert_validation_result(client, expected) + + +@pytest.mark.parametrize( + "units, attributes, unit", + [ + (IMPERIAL_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), + ], +) +async def test_validate_statistics_unsupported_state_class( + hass, hass_ws_client, units, attributes, unit +): + """Test validate_statistics.""" + id = 1 + + def next_id(): + nonlocal id + id += 1 + return id + + async def assert_validation_result(client, expected_result): + await client.send_json( + {"id": next_id(), "type": "recorder/validate_statistics"} + ) + response = await client.receive_json() + assert response["success"] + assert response["result"] == expected_result + + now = dt_util.utcnow() + + hass.config.units = units + await hass.async_add_executor_job(init_recorder_component, hass) + await async_setup_component(hass, "sensor", {}) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + client = await hass_ws_client() + + # No statistics, no state - empty response + await assert_validation_result(client, {}) + + # No statistics, valid state - empty response + hass.states.async_set("sensor.test", 10, attributes=attributes) + await hass.async_block_till_done() + await assert_validation_result(client, {}) + + # Statistics has run, empty response + hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # State update with invalid state class, expect error + _attributes = dict(attributes) + _attributes.pop("state_class") + hass.states.async_set("sensor.test", 12, attributes=_attributes) + await hass.async_block_till_done() + expected = { + "sensor.test": [ + { + "data": { + "state_class": None, + "statistic_id": "sensor.test", + }, + "type": "unsupported_state_class", + } + ], + } + await assert_validation_result(client, expected) + + +@pytest.mark.parametrize( + "units, attributes, unit", + [ + (IMPERIAL_SYSTEM, POWER_SENSOR_ATTRIBUTES, "W"), + ], +) +async def test_validate_statistics_sensor_not_recorded( + hass, hass_ws_client, units, attributes, unit +): + """Test validate_statistics.""" + id = 1 + + def next_id(): + nonlocal id + id += 1 + return id + + async def assert_validation_result(client, expected_result): + await client.send_json( + {"id": next_id(), "type": "recorder/validate_statistics"} + ) + response = await client.receive_json() + assert response["success"] + assert response["result"] == expected_result + + now = dt_util.utcnow() + + hass.config.units = units + await hass.async_add_executor_job(init_recorder_component, hass) + await async_setup_component(hass, "sensor", {}) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + client = await hass_ws_client() + + # No statistics, no state - empty response + await assert_validation_result(client, {}) + + # No statistics, valid state - empty response + hass.states.async_set("sensor.test", 10, attributes=attributes) + await hass.async_block_till_done() + await assert_validation_result(client, {}) + + # Statistics has run, empty response + hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # Sensor no longer recorded, expect error + expected = { + "sensor.test": [ + { + "data": {"statistic_id": "sensor.test"}, + "type": "entity_not_recorded", + } + ], + } + with patch( + "homeassistant.components.sensor.recorder.is_entity_recorded", + return_value=False, + ): + await assert_validation_result(client, expected) + + +@pytest.mark.parametrize( + "attributes", + [BATTERY_SENSOR_ATTRIBUTES, NONE_SENSOR_ATTRIBUTES], +) +async def test_validate_statistics_unsupported_device_class( + hass, hass_ws_client, attributes +): + """Test validate_statistics.""" + id = 1 + + def next_id(): + nonlocal id + id += 1 + return id + + async def assert_validation_result(client, expected_result): + await client.send_json( + {"id": next_id(), "type": "recorder/validate_statistics"} + ) + response = await client.receive_json() + assert response["success"] + assert response["result"] == expected_result + + async def assert_statistic_ids(expected_result): + with session_scope(hass=hass) as session: + db_states = list(session.query(StatisticsMeta)) + assert len(db_states) == len(expected_result) + for i in range(len(db_states)): + assert db_states[i].statistic_id == expected_result[i]["statistic_id"] + assert ( + db_states[i].unit_of_measurement + == expected_result[i]["unit_of_measurement"] + ) + + now = dt_util.utcnow() + + await hass.async_add_executor_job(init_recorder_component, hass) + await async_setup_component(hass, "sensor", {}) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + client = await hass_ws_client() + rec = hass.data[DATA_INSTANCE] + + # No statistics, no state - empty response + await assert_validation_result(client, {}) + + # No statistics, original unit - empty response + hass.states.async_set("sensor.test", 10, attributes=attributes) + await assert_validation_result(client, {}) + + # No statistics, changed unit - empty response + hass.states.async_set( + "sensor.test", 11, attributes={**attributes, **{"unit_of_measurement": "dogs"}} + ) + await assert_validation_result(client, {}) + + # Run statistics, no statistics will be generated because of conflicting units + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + rec.do_adhoc_statistics(start=now) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_statistic_ids([]) + + # No statistics, changed unit - empty response + hass.states.async_set( + "sensor.test", 12, attributes={**attributes, **{"unit_of_measurement": "dogs"}} + ) + await assert_validation_result(client, {}) + + # Run statistics one hour later, only the "dogs" state will be considered + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + rec.do_adhoc_statistics(start=now + timedelta(hours=1)) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_statistic_ids( + [{"statistic_id": "sensor.test", "unit_of_measurement": "dogs"}] + ) + await assert_validation_result(client, {}) + + # Change back to original unit - expect error + hass.states.async_set("sensor.test", 13, attributes=attributes) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + expected = { + "sensor.test": [ + { + "data": { + "metadata_unit": "dogs", + "state_unit": attributes.get("unit_of_measurement"), + "statistic_id": "sensor.test", + }, + "type": "units_changed", + } + ], + } + await assert_validation_result(client, expected) + + # Changed unit - empty response + hass.states.async_set( + "sensor.test", 14, attributes={**attributes, **{"unit_of_measurement": "dogs"}} + ) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # Valid state, statistic runs again - empty response + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + hass.data[DATA_INSTANCE].do_adhoc_statistics(start=now) + await hass.async_add_executor_job(hass.data[DATA_INSTANCE].block_till_done) + await assert_validation_result(client, {}) + + # Remove the state - empty response + hass.states.async_remove("sensor.test") + await assert_validation_result(client, {}) + + def record_meter_states(hass, zero, entity_id, _attributes, seq): """Record some test states. From fb9a119fc73fcbd966e30e16ecc45e6484748846 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 4 Oct 2021 07:52:08 -1000 Subject: [PATCH 061/162] Update esphome reconnect logic to use newer RecordUpdateListener logic (#57057) --- homeassistant/components/esphome/__init__.py | 54 +++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/esphome/__init__.py b/homeassistant/components/esphome/__init__.py index ee258317357..de301e0c1bb 100644 --- a/homeassistant/components/esphome/__init__.py +++ b/homeassistant/components/esphome/__init__.py @@ -24,7 +24,7 @@ from aioesphomeapi import ( UserServiceArgType, ) import voluptuous as vol -from zeroconf import DNSPointer, DNSRecord, RecordUpdateListener, Zeroconf +from zeroconf import DNSPointer, RecordUpdate, RecordUpdateListener, Zeroconf from homeassistant import const from homeassistant.components import zeroconf @@ -518,34 +518,40 @@ class ReconnectLogic(RecordUpdateListener): """Stop as an async callback function.""" self._hass.async_create_task(self.stop()) - @callback - def _set_reconnect(self) -> None: - self._reconnect_event.set() + def async_update_records( + self, zc: Zeroconf, now: float, records: list[RecordUpdate] + ) -> None: + """Listen to zeroconf updated mDNS records. - def update_record(self, zc: Zeroconf, now: float, record: DNSRecord) -> None: - """Listen to zeroconf updated mDNS records.""" - if not isinstance(record, DNSPointer): - # We only consider PTR records and match using the alias name - return - if self._entry_data is None or self._entry_data.device_info is None: - # Either the entry was already teared down or we haven't received device info yet + This is a mDNS record from the device and could mean it just woke up. + """ + # Check if already connected, no lock needed for this access and + # bail if either the entry was already teared down or we haven't received device info yet + if ( + self._connected + or self._reconnect_event.is_set() + or self._entry_data is None + or self._entry_data.device_info is None + ): return filter_alias = f"{self._entry_data.device_info.name}._esphomelib._tcp.local." - if record.alias != filter_alias: - return - # This is a mDNS record from the device and could mean it just woke up - # Check if already connected, no lock needed for this access - if self._connected: - return + for record_update in records: + # We only consider PTR records and match using the alias name + if ( + not isinstance(record_update.new, DNSPointer) + or record_update.new.alias != filter_alias + ): + continue - # Tell reconnection logic to retry connection attempt now (even before reconnect timer finishes) - _LOGGER.debug( - "%s: Triggering reconnect because of received mDNS record %s", - self._host, - record, - ) - self._hass.add_job(self._set_reconnect) + # Tell reconnection logic to retry connection attempt now (even before reconnect timer finishes) + _LOGGER.debug( + "%s: Triggering reconnect because of received mDNS record %s", + self._host, + record_update.new, + ) + self._reconnect_event.set() + return async def _async_setup_device_registry( From 74aa57e764b61da33e344ff17aa0259841e4a289 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Mon, 4 Oct 2021 23:46:46 +0300 Subject: [PATCH 062/162] Fix: Shelly Gen2 - filter unsupported sensors (#57065) --- .../components/shelly/binary_sensor.py | 16 +++++----------- homeassistant/components/shelly/entity.py | 19 +++++++++++++++---- homeassistant/components/shelly/sensor.py | 17 +++++++++++------ 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/shelly/binary_sensor.py b/homeassistant/components/shelly/binary_sensor.py index 16ffe8b4ee5..46e5468c079 100644 --- a/homeassistant/components/shelly/binary_sensor.py +++ b/homeassistant/components/shelly/binary_sensor.py @@ -122,34 +122,28 @@ REST_SENSORS: Final = { RPC_SENSORS: Final = { "input": RpcAttributeDescription( key="input", + sub_key="state", name="Input", - value=lambda status, _: status["state"], device_class=DEVICE_CLASS_POWER, default_enabled=False, removal_condition=is_rpc_momentary_input, ), "cloud": RpcAttributeDescription( key="cloud", + sub_key="connected", name="Cloud", - value=lambda status, _: status["connected"], device_class=DEVICE_CLASS_CONNECTIVITY, default_enabled=False, ), "fwupdate": RpcAttributeDescription( key="sys", + sub_key="available_updates", name="Firmware Update", device_class=DEVICE_CLASS_UPDATE, - value=lambda status, _: status["available_updates"], default_enabled=False, extra_state_attributes=lambda status: { - "latest_stable_version": status["available_updates"].get( - "stable", - {"version": ""}, - )["version"], - "beta_version": status["available_updates"].get( - "beta", - {"version": ""}, - )["version"], + "latest_stable_version": status.get("stable", {"version": ""})["version"], + "beta_version": status.get("beta", {"version": ""})["version"], }, ), } diff --git a/homeassistant/components/shelly/entity.py b/homeassistant/components/shelly/entity.py index f12633bd0e3..0fe25884f00 100644 --- a/homeassistant/components/shelly/entity.py +++ b/homeassistant/components/shelly/entity.py @@ -166,6 +166,10 @@ async def async_setup_entry_rpc( key_instances = get_rpc_key_instances(wrapper.device.status, description.key) for key in key_instances: + # Filter non-existing sensors + if description.sub_key not in wrapper.device.status[key]: + continue + # Filter and remove entities that according to settings should not create an entity if description.removal_condition and description.removal_condition( wrapper.device.config, key @@ -240,10 +244,11 @@ class RpcAttributeDescription: """Class to describe a RPC sensor.""" key: str + sub_key: str name: str icon: str | None = None unit: str | None = None - value: Callable[[dict, Any], Any] | None = None + value: Callable[[Any, Any], Any] | None = None device_class: str | None = None state_class: str | None = None default_enabled: bool = True @@ -549,6 +554,7 @@ class ShellyRpcAttributeEntity(ShellyRpcEntity, entity.Entity): ) -> None: """Initialize sensor.""" super().__init__(wrapper, key) + self.sub_key = description.sub_key self.attribute = attribute self.description = description @@ -564,8 +570,11 @@ class ShellyRpcAttributeEntity(ShellyRpcEntity, entity.Entity): """Value of sensor.""" if callable(self.description.value): self._last_value = self.description.value( - self.wrapper.device.status[self.key], self._last_value + self.wrapper.device.status[self.key][self.sub_key], self._last_value ) + else: + self._last_value = self.wrapper.device.status[self.key][self.sub_key] + return self._last_value @property @@ -576,7 +585,9 @@ class ShellyRpcAttributeEntity(ShellyRpcEntity, entity.Entity): if not available or not self.description.available: return available - return self.description.available(self.wrapper.device.status[self.key]) + return self.description.available( + self.wrapper.device.status[self.key][self.sub_key] + ) @property def extra_state_attributes(self) -> dict[str, Any] | None: @@ -585,7 +596,7 @@ class ShellyRpcAttributeEntity(ShellyRpcEntity, entity.Entity): return None return self.description.extra_state_attributes( - self.wrapper.device.status[self.key] + self.wrapper.device.status[self.key][self.sub_key] ) diff --git a/homeassistant/components/shelly/sensor.py b/homeassistant/components/shelly/sensor.py index 09e91946cf3..9ee0712aaef 100644 --- a/homeassistant/components/shelly/sensor.py +++ b/homeassistant/components/shelly/sensor.py @@ -242,51 +242,56 @@ REST_SENSORS: Final = { RPC_SENSORS: Final = { "power": RpcAttributeDescription( key="switch", + sub_key="apower", name="Power", unit=POWER_WATT, - value=lambda status, _: round(float(status["apower"]), 1), + value=lambda status, _: round(float(status), 1), device_class=sensor.DEVICE_CLASS_POWER, state_class=sensor.STATE_CLASS_MEASUREMENT, ), "voltage": RpcAttributeDescription( key="switch", + sub_key="voltage", name="Voltage", unit=ELECTRIC_POTENTIAL_VOLT, - value=lambda status, _: round(float(status["voltage"]), 1), + value=lambda status, _: round(float(status), 1), device_class=sensor.DEVICE_CLASS_VOLTAGE, state_class=sensor.STATE_CLASS_MEASUREMENT, default_enabled=False, ), "energy": RpcAttributeDescription( key="switch", + sub_key="aenergy", name="Energy", unit=ENERGY_KILO_WATT_HOUR, - value=lambda status, _: round(status["aenergy"]["total"] / 1000, 2), + value=lambda status, _: round(status["total"] / 1000, 2), device_class=sensor.DEVICE_CLASS_ENERGY, state_class=sensor.STATE_CLASS_TOTAL_INCREASING, ), "temperature": RpcAttributeDescription( key="switch", + sub_key="temperature", name="Temperature", unit=TEMP_CELSIUS, - value=lambda status, _: round(status["temperature"]["tC"], 1), + value=lambda status, _: round(status["tC"], 1), device_class=sensor.DEVICE_CLASS_TEMPERATURE, state_class=sensor.STATE_CLASS_MEASUREMENT, default_enabled=False, ), "rssi": RpcAttributeDescription( key="wifi", + sub_key="rssi", name="RSSI", unit=SIGNAL_STRENGTH_DECIBELS_MILLIWATT, - value=lambda status, _: status["rssi"], device_class=sensor.DEVICE_CLASS_SIGNAL_STRENGTH, state_class=sensor.STATE_CLASS_MEASUREMENT, default_enabled=False, ), "uptime": RpcAttributeDescription( key="sys", + sub_key="uptime", name="Uptime", - value=lambda status, last: get_device_uptime(status["uptime"], last), + value=get_device_uptime, device_class=sensor.DEVICE_CLASS_TIMESTAMP, default_enabled=False, ), From d42350f986113be8527d0c8c0d6e29a69bdde5ae Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 5 Oct 2021 05:52:17 +0200 Subject: [PATCH 063/162] Update frontend to 20211004.0 (#57073) --- homeassistant/components/frontend/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index d6d38faab27..3b047fbe245 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -3,7 +3,7 @@ "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", "requirements": [ - "home-assistant-frontend==20211002.0" + "home-assistant-frontend==20211004.0" ], "dependencies": [ "api", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index d69ae6d5e43..a496bc80169 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -15,7 +15,7 @@ ciso8601==2.2.0 cryptography==3.4.8 emoji==1.5.0 hass-nabucasa==0.50.0 -home-assistant-frontend==20211002.0 +home-assistant-frontend==20211004.0 httpx==0.19.0 ifaddr==0.1.7 jinja2==3.0.1 diff --git a/requirements_all.txt b/requirements_all.txt index 894b0b9b3de..fbb57f6d7a4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -810,7 +810,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211002.0 +home-assistant-frontend==20211004.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 319509de017..7bea04e9cee 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -485,7 +485,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211002.0 +home-assistant-frontend==20211004.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From f0b22e2f40753a1a78cf042bbb6bc13648377034 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 4 Oct 2021 20:52:40 -0700 Subject: [PATCH 064/162] Fix energy gas price validation (#57075) --- homeassistant/components/energy/validate.py | 38 ++++++++++++++++----- tests/components/energy/test_validate.py | 29 ++++++++++++++-- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/energy/validate.py b/homeassistant/components/energy/validate.py index d03883d046b..24d060b4352 100644 --- a/homeassistant/components/energy/validate.py +++ b/homeassistant/components/energy/validate.py @@ -24,13 +24,21 @@ ENERGY_USAGE_DEVICE_CLASSES = (sensor.DEVICE_CLASS_ENERGY,) ENERGY_USAGE_UNITS = { sensor.DEVICE_CLASS_ENERGY: (ENERGY_KILO_WATT_HOUR, ENERGY_WATT_HOUR) } +ENERGY_PRICE_UNITS = tuple( + f"/{unit}" for units in ENERGY_USAGE_UNITS.values() for unit in units +) ENERGY_UNIT_ERROR = "entity_unexpected_unit_energy" +ENERGY_PRICE_UNIT_ERROR = "entity_unexpected_unit_energy_price" GAS_USAGE_DEVICE_CLASSES = (sensor.DEVICE_CLASS_ENERGY, sensor.DEVICE_CLASS_GAS) GAS_USAGE_UNITS = { sensor.DEVICE_CLASS_ENERGY: (ENERGY_WATT_HOUR, ENERGY_KILO_WATT_HOUR), sensor.DEVICE_CLASS_GAS: (VOLUME_CUBIC_METERS, VOLUME_CUBIC_FEET), } +GAS_PRICE_UNITS = tuple( + f"/{unit}" for units in GAS_USAGE_UNITS.values() for unit in units +) GAS_UNIT_ERROR = "entity_unexpected_unit_gas" +GAS_PRICE_UNIT_ERROR = "entity_unexpected_unit_gas_price" @dataclasses.dataclass @@ -152,7 +160,11 @@ def _async_validate_usage_stat( @callback def _async_validate_price_entity( - hass: HomeAssistant, entity_id: str, result: list[ValidationIssue] + hass: HomeAssistant, + entity_id: str, + result: list[ValidationIssue], + allowed_units: tuple[str, ...], + unit_error: str, ) -> None: """Validate that the price entity is correct.""" state = hass.states.get(entity_id) @@ -176,10 +188,8 @@ def _async_validate_price_entity( unit = state.attributes.get("unit_of_measurement") - if unit is None or not unit.endswith( - (f"/{ENERGY_KILO_WATT_HOUR}", f"/{ENERGY_WATT_HOUR}") - ): - result.append(ValidationIssue("entity_unexpected_unit_price", entity_id, unit)) + if unit is None or not unit.endswith(allowed_units): + result.append(ValidationIssue(unit_error, entity_id, unit)) @callback @@ -274,7 +284,11 @@ async def async_validate(hass: HomeAssistant) -> EnergyPreferencesValidation: _async_validate_cost_stat(hass, flow["stat_cost"], source_result) elif flow.get("entity_energy_price") is not None: _async_validate_price_entity( - hass, flow["entity_energy_price"], source_result + hass, + flow["entity_energy_price"], + source_result, + ENERGY_PRICE_UNITS, + ENERGY_PRICE_UNIT_ERROR, ) if ( @@ -303,7 +317,11 @@ async def async_validate(hass: HomeAssistant) -> EnergyPreferencesValidation: ) elif flow.get("entity_energy_price") is not None: _async_validate_price_entity( - hass, flow["entity_energy_price"], source_result + hass, + flow["entity_energy_price"], + source_result, + ENERGY_PRICE_UNITS, + ENERGY_PRICE_UNIT_ERROR, ) if ( @@ -330,7 +348,11 @@ async def async_validate(hass: HomeAssistant) -> EnergyPreferencesValidation: _async_validate_cost_stat(hass, source["stat_cost"], source_result) elif source.get("entity_energy_price") is not None: _async_validate_price_entity( - hass, source["entity_energy_price"], source_result + hass, + source["entity_energy_price"], + source_result, + GAS_PRICE_UNITS, + GAS_PRICE_UNIT_ERROR, ) if ( diff --git a/tests/components/energy/test_validate.py b/tests/components/energy/test_validate.py index 1dd38047209..668f3113fea 100644 --- a/tests/components/energy/test_validate.py +++ b/tests/components/energy/test_validate.py @@ -473,7 +473,7 @@ async def test_validation_grid_price_not_exist(hass, mock_energy_manager): "123", "$/Ws", { - "type": "entity_unexpected_unit_price", + "type": "entity_unexpected_unit_energy_price", "identifier": "sensor.grid_price_1", "value": "$/Ws", }, @@ -551,11 +551,19 @@ async def test_validation_gas(hass, mock_energy_manager, mock_is_entity_recorded { "type": "gas", "stat_energy_from": "sensor.gas_consumption_4", - "stat_cost": "sensor.gas_cost_2", + "entity_energy_from": "sensor.gas_consumption_4", + "entity_energy_price": "sensor.gas_price_1", + }, + { + "type": "gas", + "stat_energy_from": "sensor.gas_consumption_3", + "entity_energy_from": "sensor.gas_consumption_3", + "entity_energy_price": "sensor.gas_price_2", }, ] } ) + await hass.async_block_till_done() hass.states.async_set( "sensor.gas_consumption_1", "10.10", @@ -593,6 +601,16 @@ async def test_validation_gas(hass, mock_energy_manager, mock_is_entity_recorded "10.10", {"unit_of_measurement": "EUR/kWh", "state_class": "total_increasing"}, ) + hass.states.async_set( + "sensor.gas_price_1", + "10.10", + {"unit_of_measurement": "EUR/m³", "state_class": "total_increasing"}, + ) + hass.states.async_set( + "sensor.gas_price_2", + "10.10", + {"unit_of_measurement": "EUR/invalid", "state_class": "total_increasing"}, + ) assert (await validate.async_validate(hass)).as_dict() == { "energy_sources": [ @@ -622,6 +640,13 @@ async def test_validation_gas(hass, mock_energy_manager, mock_is_entity_recorded "value": None, }, ], + [ + { + "type": "entity_unexpected_unit_gas_price", + "identifier": "sensor.gas_price_2", + "value": "EUR/invalid", + }, + ], ], "device_consumption": [], } From a457bb74462a4d2b742247ce1287d392c863e944 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Tue, 5 Oct 2021 00:12:33 +0000 Subject: [PATCH 065/162] [ci skip] Translation update --- .../components/switchbot/translations/it.json | 4 +++- homeassistant/components/tuya/translations/ca.json | 10 +++++++--- homeassistant/components/tuya/translations/et.json | 6 +++++- homeassistant/components/tuya/translations/it.json | 6 +++++- homeassistant/components/tuya/translations/nl.json | 6 +++++- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/switchbot/translations/it.json b/homeassistant/components/switchbot/translations/it.json index fc8296f6442..9529450232b 100644 --- a/homeassistant/components/switchbot/translations/it.json +++ b/homeassistant/components/switchbot/translations/it.json @@ -8,7 +8,9 @@ "unknown": "Errore imprevisto" }, "error": { - "cannot_connect": "Impossibile connettersi" + "cannot_connect": "Impossibile connettersi", + "one": "Vuoto", + "other": "Vuoti" }, "flow_title": "{name}", "step": { diff --git a/homeassistant/components/tuya/translations/ca.json b/homeassistant/components/tuya/translations/ca.json index 6759d322484..bff9b7a35b9 100644 --- a/homeassistant/components/tuya/translations/ca.json +++ b/homeassistant/components/tuya/translations/ca.json @@ -6,7 +6,8 @@ "single_instance_allowed": "Ja configurat. Nom\u00e9s \u00e9s possible una sola configuraci\u00f3." }, "error": { - "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida" + "invalid_auth": "Autenticaci\u00f3 inv\u00e0lida", + "login_error": "Error d'inici de sessi\u00f3 ({code}): {msg}" }, "flow_title": "Configuraci\u00f3 de Tuya", "step": { @@ -25,13 +26,16 @@ }, "user": { "data": { + "access_id": "ID d'acc\u00e9s de Tuya IoT", + "access_secret": "Secret d'acc\u00e9s de Tuya IoT", "country_code": "El teu codi de pa\u00eds (per exemple, 1 per l'EUA o 86 per la Xina)", "password": "Contrasenya", "platform": "L'aplicaci\u00f3 on es registra el teu compte", + "region": "Regi\u00f3", "tuya_project_type": "Tipus de projecte al n\u00favol de Tuya", - "username": "Nom d'usuari" + "username": "Compte" }, - "description": "Introdueix les teves credencial de Tuya.", + "description": "Introdueix les teves credencial de Tuya", "title": "Integraci\u00f3 Tuya" } } diff --git a/homeassistant/components/tuya/translations/et.json b/homeassistant/components/tuya/translations/et.json index 45b4e4d2639..96f081621b8 100644 --- a/homeassistant/components/tuya/translations/et.json +++ b/homeassistant/components/tuya/translations/et.json @@ -6,7 +6,8 @@ "single_instance_allowed": "Juba seadistatud. V\u00f5imalik on ainult \u00fcks sidumine." }, "error": { - "invalid_auth": "Tuvastamise viga" + "invalid_auth": "Tuvastamise viga", + "login_error": "Sisenemine nurjus ( {code} ): {msg}" }, "flow_title": "Tuya seaded", "step": { @@ -25,9 +26,12 @@ }, "user": { "data": { + "access_id": "Tuya IoT kasutajatunnus", + "access_secret": "Tuya IoT salas\u00f5na", "country_code": "Konto riigikood (nt 1 USA v\u00f5i 372 Eesti)", "password": "Salas\u00f5na", "platform": "\u00c4pp kus konto registreeriti", + "region": "Piirkond", "tuya_project_type": "Tuya pilveprojekti t\u00fc\u00fcp", "username": "Kasutajanimi" }, diff --git a/homeassistant/components/tuya/translations/it.json b/homeassistant/components/tuya/translations/it.json index 3baed47661c..9f3b7d498e3 100644 --- a/homeassistant/components/tuya/translations/it.json +++ b/homeassistant/components/tuya/translations/it.json @@ -6,7 +6,8 @@ "single_instance_allowed": "Gi\u00e0 configurato. \u00c8 possibile una sola configurazione." }, "error": { - "invalid_auth": "Autenticazione non valida" + "invalid_auth": "Autenticazione non valida", + "login_error": "Errore di accesso ({code}): {msg}" }, "flow_title": "Configurazione di Tuya", "step": { @@ -25,9 +26,12 @@ }, "user": { "data": { + "access_id": "ID accesso IoT Tuya", + "access_secret": "Secret IoT Tuya", "country_code": "Prefisso internazionale del tuo account (ad es. 1 per gli Stati Uniti o 86 per la Cina)", "password": "Password", "platform": "L'app in cui \u00e8 registrato il tuo account", + "region": "Area geografica", "tuya_project_type": "Tipo di progetto Tuya cloud", "username": "Nome utente" }, diff --git a/homeassistant/components/tuya/translations/nl.json b/homeassistant/components/tuya/translations/nl.json index 22a63800fd6..0ceb0c916cc 100644 --- a/homeassistant/components/tuya/translations/nl.json +++ b/homeassistant/components/tuya/translations/nl.json @@ -6,7 +6,8 @@ "single_instance_allowed": "Al geconfigureerd. Er is maar een configuratie mogelijk." }, "error": { - "invalid_auth": "Ongeldige authenticatie" + "invalid_auth": "Ongeldige authenticatie", + "login_error": "Aanmeldingsfout ({code}): {msg}" }, "flow_title": "Tuya-configuratie", "step": { @@ -25,9 +26,12 @@ }, "user": { "data": { + "access_id": "Tuya IoT-toegangs-ID", + "access_secret": "Tuya IoT Access Secret", "country_code": "De landcode van uw account (bijvoorbeeld 1 voor de VS of 86 voor China)", "password": "Wachtwoord", "platform": "De app waar uw account is geregistreerd", + "region": "Regio", "tuya_project_type": "Tuya cloud project type", "username": "Gebruikersnaam" }, From b289bb2f578b04ffb4a56e224a7082a909f397a9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 4 Oct 2021 21:07:16 -0700 Subject: [PATCH 066/162] Bumped version to 2021.10.0b6 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 4dbf3ea2785..01c031ce339 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b5" +PATCH_VERSION: Final = "0b6" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 70a6930a8a84d8997534b077bbcefac7a8297b99 Mon Sep 17 00:00:00 2001 From: indykoning <15870933+indykoning@users.noreply.github.com> Date: Tue, 5 Oct 2021 21:31:23 +0200 Subject: [PATCH 067/162] Fix Growatt login invalid auth response (#57071) --- .../components/growatt_server/config_flow.py | 13 +++++++++++-- homeassistant/components/growatt_server/const.py | 2 ++ homeassistant/components/growatt_server/sensor.py | 7 +++++-- tests/components/growatt_server/test_config_flow.py | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/growatt_server/config_flow.py b/homeassistant/components/growatt_server/config_flow.py index c4a97a81f0a..11f082f1eab 100644 --- a/homeassistant/components/growatt_server/config_flow.py +++ b/homeassistant/components/growatt_server/config_flow.py @@ -6,7 +6,13 @@ from homeassistant import config_entries from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_URL, CONF_USERNAME from homeassistant.core import callback -from .const import CONF_PLANT_ID, DEFAULT_URL, DOMAIN, SERVER_URLS +from .const import ( + CONF_PLANT_ID, + DEFAULT_URL, + DOMAIN, + LOGIN_INVALID_AUTH_CODE, + SERVER_URLS, +) class GrowattServerConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): @@ -45,7 +51,10 @@ class GrowattServerConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): self.api.login, user_input[CONF_USERNAME], user_input[CONF_PASSWORD] ) - if not login_response["success"] and login_response["errCode"] == "102": + if ( + not login_response["success"] + and login_response["msg"] == LOGIN_INVALID_AUTH_CODE + ): return self._async_show_user_form({"base": "invalid_auth"}) self.user_id = login_response["user"]["id"] diff --git a/homeassistant/components/growatt_server/const.py b/homeassistant/components/growatt_server/const.py index e0297de5eff..5425e26c806 100644 --- a/homeassistant/components/growatt_server/const.py +++ b/homeassistant/components/growatt_server/const.py @@ -16,3 +16,5 @@ DEFAULT_URL = SERVER_URLS[0] DOMAIN = "growatt_server" PLATFORMS = ["sensor"] + +LOGIN_INVALID_AUTH_CODE = "502" diff --git a/homeassistant/components/growatt_server/sensor.py b/homeassistant/components/growatt_server/sensor.py index 9f0fa509105..804d4157543 100644 --- a/homeassistant/components/growatt_server/sensor.py +++ b/homeassistant/components/growatt_server/sensor.py @@ -37,7 +37,7 @@ from homeassistant.const import ( ) from homeassistant.util import Throttle, dt -from .const import CONF_PLANT_ID, DEFAULT_PLANT_ID, DEFAULT_URL +from .const import CONF_PLANT_ID, DEFAULT_PLANT_ID, DEFAULT_URL, LOGIN_INVALID_AUTH_CODE _LOGGER = logging.getLogger(__name__) @@ -876,7 +876,10 @@ def get_device_list(api, config): # Log in to api and fetch first plant if no plant id is defined. login_response = api.login(config[CONF_USERNAME], config[CONF_PASSWORD]) - if not login_response["success"] and login_response["errCode"] == "102": + if ( + not login_response["success"] + and login_response["msg"] == LOGIN_INVALID_AUTH_CODE + ): _LOGGER.error("Username, Password or URL may be incorrect!") return user_id = login_response["user"]["id"] diff --git a/tests/components/growatt_server/test_config_flow.py b/tests/components/growatt_server/test_config_flow.py index db46ed36911..ba52e09296c 100644 --- a/tests/components/growatt_server/test_config_flow.py +++ b/tests/components/growatt_server/test_config_flow.py @@ -7,6 +7,7 @@ from homeassistant.components.growatt_server.const import ( CONF_PLANT_ID, DEFAULT_URL, DOMAIN, + LOGIN_INVALID_AUTH_CODE, ) from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME @@ -61,7 +62,7 @@ async def test_incorrect_login(hass): with patch( "growattServer.GrowattApi.login", - return_value={"errCode": "102", "success": False}, + return_value={"msg": LOGIN_INVALID_AUTH_CODE, "success": False}, ): result = await hass.config_entries.flow.async_configure( result["flow_id"], FIXTURE_USER_INPUT From 4d44beb9386f4605128c785f57f6d96ec3c9e082 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 5 Oct 2021 10:22:28 +0200 Subject: [PATCH 068/162] Prevent Tuya from accidentally logging credentials in debug mode (#57100) --- homeassistant/components/tuya/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py index c59e29ba348..ffaf36ece8e 100644 --- a/homeassistant/components/tuya/__init__.py +++ b/homeassistant/components/tuya/__init__.py @@ -44,9 +44,6 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Async setup hass config entry.""" - - _LOGGER.debug("tuya.__init__.async_setup_entry-->%s", entry.data) - hass.data[DOMAIN] = {entry.entry_id: {TUYA_HA_TUYA_MAP: {}, TUYA_HA_DEVICES: set()}} success = await _init_tuya_sdk(hass, entry) From d1f790fab0c241440aaf271dd2d279d46c5422f1 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 5 Oct 2021 12:59:51 +0200 Subject: [PATCH 069/162] Small code styling tweaks for Tuya (#57102) --- homeassistant/components/tuya/__init__.py | 5 +---- homeassistant/components/tuya/base.py | 6 ++---- homeassistant/components/tuya/climate.py | 8 ++++---- homeassistant/components/tuya/light.py | 3 +-- homeassistant/components/tuya/scene.py | 7 +------ 5 files changed, 9 insertions(+), 20 deletions(-) diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py index ffaf36ece8e..77e83793892 100644 --- a/homeassistant/components/tuya/__init__.py +++ b/homeassistant/components/tuya/__init__.py @@ -47,10 +47,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: hass.data[DOMAIN] = {entry.entry_id: {TUYA_HA_TUYA_MAP: {}, TUYA_HA_DEVICES: set()}} success = await _init_tuya_sdk(hass, entry) - if not success: - return False - - return True + return bool(success) async def _init_tuya_sdk(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/homeassistant/components/tuya/base.py b/homeassistant/components/tuya/base.py index 572c452a920..2e9840c60e1 100644 --- a/homeassistant/components/tuya/base.py +++ b/homeassistant/components/tuya/base.py @@ -25,10 +25,9 @@ class TuyaHaEntity(Entity): @staticmethod def remap(old_value, old_min, old_max, new_min, new_max): """Remap old_value to new_value.""" - new_value = ((old_value - old_min) / (old_max - old_min)) * ( + return ((old_value - old_min) / (old_max - old_min)) * ( new_max - new_min ) + new_min - return new_value @property def should_poll(self) -> bool: @@ -48,13 +47,12 @@ class TuyaHaEntity(Entity): @property def device_info(self): """Return a device description for device registry.""" - _device_info = { + return { "identifiers": {(DOMAIN, f"{self.tuya_device.id}")}, "manufacturer": "Tuya", "name": self.tuya_device.name, "model": self.tuya_device.product_name, } - return _device_info @property def available(self) -> bool: diff --git a/homeassistant/components/tuya/climate.py b/homeassistant/components/tuya/climate.py index 368a65b8499..810e8ad8aab 100644 --- a/homeassistant/components/tuya/climate.py +++ b/homeassistant/components/tuya/climate.py @@ -430,10 +430,10 @@ class TuyaHaClimate(TuyaHaEntity, ClimateEntity): @property def fan_modes(self) -> list[str]: """Return fan modes for select.""" - data = json.loads( - self.tuya_device.function.get(DPCODE_FAN_SPEED_ENUM, {}).values - ).get("range") - return data + fan_speed_device_function = self.tuya_device.function.get(DPCODE_FAN_SPEED_ENUM) + if not fan_speed_device_function: + return [] + return json.loads(fan_speed_device_function.values).get("range", []) @property def swing_mode(self) -> str: diff --git a/homeassistant/components/tuya/light.py b/homeassistant/components/tuya/light.py index 180e3a68450..6a119e71ba9 100644 --- a/homeassistant/components/tuya/light.py +++ b/homeassistant/components/tuya/light.py @@ -299,7 +299,7 @@ class TuyaHaLight(TuyaHaEntity, LightEntity): """Return the color_temp of the light.""" new_range = self._tuya_temp_range() tuya_color_temp = self.tuya_device.status.get(self.dp_code_temp, 0) - ha_color_temp = ( + return ( self.max_mireds - self.remap( tuya_color_temp, @@ -310,7 +310,6 @@ class TuyaHaLight(TuyaHaEntity, LightEntity): ) + self.min_mireds ) - return ha_color_temp @property def min_mireds(self) -> int: diff --git a/homeassistant/components/tuya/scene.py b/homeassistant/components/tuya/scene.py index c6010f9ef87..c90c6798b9b 100644 --- a/homeassistant/components/tuya/scene.py +++ b/homeassistant/components/tuya/scene.py @@ -20,14 +20,9 @@ async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback ) -> None: """Set up tuya scenes.""" - entities = [] - home_manager = hass.data[DOMAIN][entry.entry_id][TUYA_HOME_MANAGER] scenes = await hass.async_add_executor_job(home_manager.query_scenes) - for scene in scenes: - entities.append(TuyaHAScene(home_manager, scene)) - - async_add_entities(entities) + async_add_entities(TuyaHAScene(home_manager, scene) for scene in scenes) class TuyaHAScene(Scene): From b76e19c8c20328735e092064b0870e1a799a6ccc Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 5 Oct 2021 11:12:55 +0200 Subject: [PATCH 070/162] Remove Python shebang line from Tuya integration files (#57103) --- homeassistant/components/tuya/__init__.py | 1 - homeassistant/components/tuya/base.py | 1 - homeassistant/components/tuya/const.py | 1 - homeassistant/components/tuya/switch.py | 1 - 4 files changed, 4 deletions(-) diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py index 77e83793892..3602f9585af 100644 --- a/homeassistant/components/tuya/__init__.py +++ b/homeassistant/components/tuya/__init__.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """Support for Tuya Smart devices.""" import itertools diff --git a/homeassistant/components/tuya/base.py b/homeassistant/components/tuya/base.py index 2e9840c60e1..a1f65227e95 100644 --- a/homeassistant/components/tuya/base.py +++ b/homeassistant/components/tuya/base.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """Tuya Home Assistant Base Device Model.""" from __future__ import annotations diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index f86180226ee..dd18309d128 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """Constants for the Tuya integration.""" DOMAIN = "tuya" diff --git a/homeassistant/components/tuya/switch.py b/homeassistant/components/tuya/switch.py index ab34ebbdfc0..5bafbe1b7f6 100644 --- a/homeassistant/components/tuya/switch.py +++ b/homeassistant/components/tuya/switch.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """Support for Tuya switches.""" from __future__ import annotations From c5992e296745e1ec4e88ac2f120dae1acba3b4b4 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Tue, 5 Oct 2021 11:49:39 +0200 Subject: [PATCH 071/162] Bump aioesphomeapi from 9.1.4 to 9.1.5 (#57106) --- homeassistant/components/esphome/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/esphome/manifest.json b/homeassistant/components/esphome/manifest.json index 33801431994..307227be944 100644 --- a/homeassistant/components/esphome/manifest.json +++ b/homeassistant/components/esphome/manifest.json @@ -3,7 +3,7 @@ "name": "ESPHome", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/esphome", - "requirements": ["aioesphomeapi==9.1.4"], + "requirements": ["aioesphomeapi==9.1.5"], "zeroconf": ["_esphomelib._tcp.local."], "codeowners": ["@OttoWinter", "@jesserockz"], "after_dependencies": ["zeroconf", "tag"], diff --git a/requirements_all.txt b/requirements_all.txt index fbb57f6d7a4..e7864d3dfc4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -164,7 +164,7 @@ aioeagle==1.1.0 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==9.1.4 +aioesphomeapi==9.1.5 # homeassistant.components.flo aioflo==0.4.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7bea04e9cee..d42250b7213 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -109,7 +109,7 @@ aioeagle==1.1.0 aioemonitor==1.0.5 # homeassistant.components.esphome -aioesphomeapi==9.1.4 +aioesphomeapi==9.1.5 # homeassistant.components.flo aioflo==0.4.1 From 5b550689e0483a7f0fd58680cbbd268593ebdd5c Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 4 Oct 2021 15:44:17 -0700 Subject: [PATCH 072/162] Update Tuya code owners (#57078) --- CODEOWNERS | 2 +- homeassistant/components/tuya/manifest.json | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 515aec64774..a43b38e509d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -544,7 +544,7 @@ homeassistant/components/trafikverket_train/* @endor-force homeassistant/components/trafikverket_weatherstation/* @endor-force homeassistant/components/transmission/* @engrbm87 @JPHutchins homeassistant/components/tts/* @pvizeli -homeassistant/components/tuya/* @Tuya +homeassistant/components/tuya/* @Tuya @zlinoliver @METISU homeassistant/components/twentemilieu/* @frenck homeassistant/components/twinkly/* @dr1rrb homeassistant/components/ubus/* @noltari diff --git a/homeassistant/components/tuya/manifest.json b/homeassistant/components/tuya/manifest.json index 85370bdfcac..0097e7635ec 100644 --- a/homeassistant/components/tuya/manifest.json +++ b/homeassistant/components/tuya/manifest.json @@ -2,12 +2,8 @@ "domain": "tuya", "name": "Tuya", "documentation": "https://github.com/tuya/tuya-home-assistant", - "requirements": [ - "tuya-iot-py-sdk==0.4.1" - ], - "codeowners": [ - "@Tuya" - ], + "requirements": ["tuya-iot-py-sdk==0.4.1"], + "codeowners": ["@Tuya", "@zlinoliver", "@METISU"], "config_flow": true, "iot_class": "cloud_push" -} \ No newline at end of file +} From a13a6bc9c9e31bcccf51b281023de4c0c9f93bee Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 5 Oct 2021 19:21:55 +0200 Subject: [PATCH 073/162] Bump tuya-iot-py-sdk to 0.5.0 (#57110) Co-authored-by: Martin Hjelmare --- homeassistant/components/tuya/__init__.py | 26 +++++++++++++------- homeassistant/components/tuya/config_flow.py | 16 ++++++------ homeassistant/components/tuya/const.py | 1 + homeassistant/components/tuya/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/tuya/test_config_flow.py | 8 +++--- 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py index 3602f9585af..df4689268cf 100644 --- a/homeassistant/components/tuya/__init__.py +++ b/homeassistant/components/tuya/__init__.py @@ -4,7 +4,7 @@ import itertools import logging from tuya_iot import ( - ProjectType, + AuthType, TuyaDevice, TuyaDeviceListener, TuyaDeviceManager, @@ -22,6 +22,7 @@ from .const import ( CONF_ACCESS_ID, CONF_ACCESS_SECRET, CONF_APP_TYPE, + CONF_AUTH_TYPE, CONF_COUNTRY_CODE, CONF_ENDPOINT, CONF_PASSWORD, @@ -45,28 +46,35 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Async setup hass config entry.""" hass.data[DOMAIN] = {entry.entry_id: {TUYA_HA_TUYA_MAP: {}, TUYA_HA_DEVICES: set()}} + # Project type has been renamed to auth type in the upstream Tuya IoT SDK. + # This migrates existing config entries to reflect that name change. + if CONF_PROJECT_TYPE in entry.data: + data = {**entry.data, CONF_AUTH_TYPE: entry.data[CONF_PROJECT_TYPE]} + data.pop(CONF_PROJECT_TYPE) + hass.config_entries.async_update_entry(entry, data=data) + success = await _init_tuya_sdk(hass, entry) return bool(success) async def _init_tuya_sdk(hass: HomeAssistant, entry: ConfigEntry) -> bool: - project_type = ProjectType(entry.data[CONF_PROJECT_TYPE]) + auth_type = AuthType(entry.data[CONF_AUTH_TYPE]) api = TuyaOpenAPI( - entry.data[CONF_ENDPOINT], - entry.data[CONF_ACCESS_ID], - entry.data[CONF_ACCESS_SECRET], - project_type, + endpoint=entry.data[CONF_ENDPOINT], + access_id=entry.data[CONF_ACCESS_ID], + access_secret=entry.data[CONF_ACCESS_SECRET], + auth_type=auth_type, ) api.set_dev_channel("hass") - if project_type == ProjectType.INDUSTY_SOLUTIONS: + if auth_type == AuthType.CUSTOM: response = await hass.async_add_executor_job( - api.login, entry.data[CONF_USERNAME], entry.data[CONF_PASSWORD] + api.connect, entry.data[CONF_USERNAME], entry.data[CONF_PASSWORD] ) else: response = await hass.async_add_executor_job( - api.login, + api.connect, entry.data[CONF_USERNAME], entry.data[CONF_PASSWORD], entry.data[CONF_COUNTRY_CODE], diff --git a/homeassistant/components/tuya/config_flow.py b/homeassistant/components/tuya/config_flow.py index 1b439d49007..8fffed3cd9f 100644 --- a/homeassistant/components/tuya/config_flow.py +++ b/homeassistant/components/tuya/config_flow.py @@ -4,7 +4,7 @@ from __future__ import annotations import logging from typing import Any -from tuya_iot import ProjectType, TuyaOpenAPI +from tuya_iot import AuthType, TuyaOpenAPI import voluptuous as vol from voluptuous.schema_builder import UNDEFINED @@ -14,10 +14,10 @@ from .const import ( CONF_ACCESS_ID, CONF_ACCESS_SECRET, CONF_APP_TYPE, + CONF_AUTH_TYPE, CONF_COUNTRY_CODE, CONF_ENDPOINT, CONF_PASSWORD, - CONF_PROJECT_TYPE, CONF_REGION, CONF_USERNAME, DOMAIN, @@ -44,7 +44,7 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): data = { CONF_ENDPOINT: TUYA_REGIONS[user_input[CONF_REGION]], - CONF_PROJECT_TYPE: ProjectType.INDUSTY_SOLUTIONS, + CONF_AUTH_TYPE: AuthType.CUSTOM, CONF_ACCESS_ID: user_input[CONF_ACCESS_ID], CONF_ACCESS_SECRET: user_input[CONF_ACCESS_SECRET], CONF_USERNAME: user_input[CONF_USERNAME], @@ -55,19 +55,19 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): for app_type in ("", TUYA_SMART_APP, SMARTLIFE_APP): data[CONF_APP_TYPE] = app_type if data[CONF_APP_TYPE] == "": - data[CONF_PROJECT_TYPE] = ProjectType.INDUSTY_SOLUTIONS + data[CONF_AUTH_TYPE] = AuthType.CUSTOM else: - data[CONF_PROJECT_TYPE] = ProjectType.SMART_HOME + data[CONF_AUTH_TYPE] = AuthType.SMART_HOME api = TuyaOpenAPI( endpoint=data[CONF_ENDPOINT], access_id=data[CONF_ACCESS_ID], access_secret=data[CONF_ACCESS_SECRET], - project_type=data[CONF_PROJECT_TYPE], + auth_type=data[CONF_AUTH_TYPE], ) api.set_dev_channel("hass") - response = api.login( + response = api.connect( username=data[CONF_USERNAME], password=data[CONF_PASSWORD], country_code=data[CONF_COUNTRY_CODE], @@ -97,7 +97,7 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): ): data[CONF_ENDPOINT] = endpoint - data[CONF_PROJECT_TYPE] = data[CONF_PROJECT_TYPE].value + data[CONF_AUTH_TYPE] = data[CONF_AUTH_TYPE].value return self.async_create_entry( title=user_input[CONF_USERNAME], diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index dd18309d128..7c6440d7e48 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -2,6 +2,7 @@ DOMAIN = "tuya" +CONF_AUTH_TYPE = "auth_type" CONF_PROJECT_TYPE = "tuya_project_type" CONF_ENDPOINT = "endpoint" CONF_ACCESS_ID = "access_id" diff --git a/homeassistant/components/tuya/manifest.json b/homeassistant/components/tuya/manifest.json index 0097e7635ec..20df33f4573 100644 --- a/homeassistant/components/tuya/manifest.json +++ b/homeassistant/components/tuya/manifest.json @@ -2,7 +2,7 @@ "domain": "tuya", "name": "Tuya", "documentation": "https://github.com/tuya/tuya-home-assistant", - "requirements": ["tuya-iot-py-sdk==0.4.1"], + "requirements": ["tuya-iot-py-sdk==0.5.0"], "codeowners": ["@Tuya", "@zlinoliver", "@METISU"], "config_flow": true, "iot_class": "cloud_push" diff --git a/requirements_all.txt b/requirements_all.txt index e7864d3dfc4..9fa20c0fcea 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2332,7 +2332,7 @@ tp-connected==0.0.4 transmissionrpc==0.11 # homeassistant.components.tuya -tuya-iot-py-sdk==0.4.1 +tuya-iot-py-sdk==0.5.0 # homeassistant.components.twentemilieu twentemilieu==0.3.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d42250b7213..98c9e90d6c4 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1315,7 +1315,7 @@ total_connect_client==0.57 transmissionrpc==0.11 # homeassistant.components.tuya -tuya-iot-py-sdk==0.4.1 +tuya-iot-py-sdk==0.5.0 # homeassistant.components.twentemilieu twentemilieu==0.3.0 diff --git a/tests/components/tuya/test_config_flow.py b/tests/components/tuya/test_config_flow.py index 04fb8ebe009..745bcfde661 100644 --- a/tests/components/tuya/test_config_flow.py +++ b/tests/components/tuya/test_config_flow.py @@ -11,9 +11,9 @@ from homeassistant.components.tuya.const import ( CONF_ACCESS_ID, CONF_ACCESS_SECRET, CONF_APP_TYPE, + CONF_AUTH_TYPE, CONF_ENDPOINT, CONF_PASSWORD, - CONF_PROJECT_TYPE, CONF_REGION, CONF_USERNAME, DOMAIN, @@ -86,7 +86,7 @@ async def test_user_flow( assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" - tuya().login = MagicMock(side_effect=side_effects) + tuya().connect = MagicMock(side_effect=side_effects) result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=TUYA_INPUT_DATA ) @@ -101,7 +101,7 @@ async def test_user_flow( assert result["data"][CONF_ENDPOINT] == MOCK_ENDPOINT assert result["data"][CONF_ENDPOINT] != TUYA_REGIONS[TUYA_INPUT_DATA[CONF_REGION]] assert result["data"][CONF_APP_TYPE] == app_type - assert result["data"][CONF_PROJECT_TYPE] == project_type + assert result["data"][CONF_AUTH_TYPE] == project_type assert not result["result"].unique_id @@ -115,7 +115,7 @@ async def test_error_on_invalid_credentials(hass, tuya): assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["step_id"] == "user" - tuya().login = MagicMock(return_value=RESPONSE_ERROR) + tuya().connect = MagicMock(return_value=RESPONSE_ERROR) result = await hass.config_entries.flow.async_configure( result["flow_id"], user_input=TUYA_INPUT_DATA ) From ecdbb5ff17bde7d3601afae15156de1bbd75199b Mon Sep 17 00:00:00 2001 From: jrester <31157644+jrester@users.noreply.github.com> Date: Tue, 5 Oct 2021 19:40:37 +0200 Subject: [PATCH 074/162] Update tesla_powerwall to 0.3.11 (#57112) --- homeassistant/components/powerwall/binary_sensor.py | 8 ++++++-- homeassistant/components/powerwall/manifest.json | 2 +- homeassistant/components/powerwall/sensor.py | 3 ++- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/powerwall/binary_sensor.py b/homeassistant/components/powerwall/binary_sensor.py index 1cacaa5fc42..1b097b93408 100644 --- a/homeassistant/components/powerwall/binary_sensor.py +++ b/homeassistant/components/powerwall/binary_sensor.py @@ -1,5 +1,5 @@ """Support for powerwall binary sensors.""" -from tesla_powerwall import GridStatus +from tesla_powerwall import GridStatus, MeterType from homeassistant.components.binary_sensor import ( DEVICE_CLASS_BATTERY_CHARGING, @@ -142,4 +142,8 @@ class PowerWallChargingStatusSensor(PowerWallEntity, BinarySensorEntity): def is_on(self): """Powerwall is charging.""" # is_sending_to returns true for values greater than 100 watts - return self.coordinator.data[POWERWALL_API_METERS].battery.is_sending_to() + return ( + self.coordinator.data[POWERWALL_API_METERS] + .get_meter(MeterType.BATTERY) + .is_sending_to() + ) diff --git a/homeassistant/components/powerwall/manifest.json b/homeassistant/components/powerwall/manifest.json index 5cee6c1fd19..802d1fdf5e3 100644 --- a/homeassistant/components/powerwall/manifest.json +++ b/homeassistant/components/powerwall/manifest.json @@ -3,7 +3,7 @@ "name": "Tesla Powerwall", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/powerwall", - "requirements": ["tesla-powerwall==0.3.10"], + "requirements": ["tesla-powerwall==0.3.11"], "codeowners": ["@bdraco", "@jrester"], "dhcp": [ { diff --git a/homeassistant/components/powerwall/sensor.py b/homeassistant/components/powerwall/sensor.py index 940dcad8647..8c45a142206 100644 --- a/homeassistant/components/powerwall/sensor.py +++ b/homeassistant/components/powerwall/sensor.py @@ -53,7 +53,8 @@ async def async_setup_entry(hass, config_entry, async_add_entities): powerwalls_serial_numbers = powerwall_data[POWERWALL_API_SERIAL_NUMBERS] entities = [] - for meter in MeterType: + # coordinator.data[POWERWALL_API_METERS].meters holds all meters that are available + for meter in coordinator.data[POWERWALL_API_METERS].meters: entities.append( PowerWallEnergySensor( meter, diff --git a/requirements_all.txt b/requirements_all.txt index 9fa20c0fcea..7f00e889051 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2299,7 +2299,7 @@ temperusb==1.5.3 # tensorflow==2.3.0 # homeassistant.components.powerwall -tesla-powerwall==0.3.10 +tesla-powerwall==0.3.11 # homeassistant.components.tensorflow # tf-models-official==2.3.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 98c9e90d6c4..86168f69065 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1303,7 +1303,7 @@ systembridge==2.1.0 tellduslive==0.10.11 # homeassistant.components.powerwall -tesla-powerwall==0.3.10 +tesla-powerwall==0.3.11 # homeassistant.components.toon toonapi==0.2.1 From 0e00075628f1b64bf31a35e3e403820e44e76ed6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Oct 2021 10:42:45 -0700 Subject: [PATCH 075/162] Bump aiohue to 2.6.3 (#57125) --- homeassistant/components/hue/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/hue/manifest.json b/homeassistant/components/hue/manifest.json index 954ad1f7a7b..6640ffc9fae 100644 --- a/homeassistant/components/hue/manifest.json +++ b/homeassistant/components/hue/manifest.json @@ -3,7 +3,7 @@ "name": "Philips Hue", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/hue", - "requirements": ["aiohue==2.6.2"], + "requirements": ["aiohue==2.6.3"], "ssdp": [ { "manufacturer": "Royal Philips Electronics", diff --git a/requirements_all.txt b/requirements_all.txt index 7f00e889051..cfab25fd3ba 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -189,7 +189,7 @@ aiohomekit==0.6.3 aiohttp_cors==0.7.0 # homeassistant.components.hue -aiohue==2.6.2 +aiohue==2.6.3 # homeassistant.components.imap aioimaplib==0.9.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 86168f69065..66955cfe593 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -128,7 +128,7 @@ aiohomekit==0.6.3 aiohttp_cors==0.7.0 # homeassistant.components.hue -aiohue==2.6.2 +aiohue==2.6.3 # homeassistant.components.apache_kafka aiokafka==0.6.0 From 657037553a4e77006d170c7ae9b862d1208f62d0 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 5 Oct 2021 10:41:56 -1000 Subject: [PATCH 076/162] Fix yeelight connection when bulb stops responding to SSDP (#57138) --- homeassistant/components/yeelight/__init__.py | 21 +++--- tests/components/yeelight/test_init.py | 67 +++++++++++-------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index e7f7b06f58f..a1dce44893b 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -181,6 +181,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: DATA_CUSTOM_EFFECTS: conf.get(CONF_CUSTOM_EFFECTS, {}), DATA_CONFIG_ENTRIES: {}, } + # Make sure the scanner is always started in case we are + # going to retry via ConfigEntryNotReady and the bulb has changed + # ip + scanner = YeelightScanner.async_get(hass) + await scanner.async_setup() # Import manually configured devices for host, device_config in config.get(DOMAIN, {}).get(CONF_DEVICES, {}).items(): @@ -281,11 +286,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: try: device = await _async_get_device(hass, entry.data[CONF_HOST], entry) except BULB_EXCEPTIONS as ex: - # If CONF_ID is not valid we cannot fallback to discovery - # so we must retry by raising ConfigEntryNotReady - if not entry.data.get(CONF_ID): - raise ConfigEntryNotReady from ex - # Otherwise fall through to discovery + # Always retry later since bulbs can stop responding to SSDP + # sometimes even though they are online. If it has changed + # IP we will update it via discovery to the config flow + raise ConfigEntryNotReady from ex else: # Since device is passed this cannot throw an exception anymore await _async_initialize(hass, entry, entry.data[CONF_HOST], device=device) @@ -298,7 +302,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: except BULB_EXCEPTIONS: _LOGGER.exception("Failed to connect to bulb at %s", host) - # discovery scanner = YeelightScanner.async_get(hass) await scanner.async_register_callback(entry.data[CONF_ID], _async_from_discovery) return True @@ -501,7 +504,9 @@ class YeelightScanner: _LOGGER.debug("Discovered via SSDP: %s", response) unique_id = response["id"] host = urlparse(response["location"]).hostname - if unique_id not in self._unique_id_capabilities: + current_entry = self._unique_id_capabilities.get(unique_id) + # Make sure we handle ip changes + if not current_entry or host != urlparse(current_entry["location"]).hostname: _LOGGER.debug("Yeelight discovered with %s", response) self._async_discovered_by_ssdp(response) self._host_capabilities[host] = response @@ -571,7 +576,7 @@ class YeelightDevice: self._bulb_device = bulb self.capabilities = {} self._device_type = None - self._available = False + self._available = True self._initialized = False self._did_first_update = False self._name = None diff --git a/tests/components/yeelight/test_init.py b/tests/components/yeelight/test_init.py index aed2025ab5d..3ad99fa34ac 100644 --- a/tests/components/yeelight/test_init.py +++ b/tests/components/yeelight/test_init.py @@ -9,8 +9,6 @@ from homeassistant.components.yeelight import ( CONF_MODEL, CONF_NIGHTLIGHT_SWITCH, CONF_NIGHTLIGHT_SWITCH_TYPE, - DATA_CONFIG_ENTRIES, - DATA_DEVICE, DOMAIN, NIGHTLIGHT_SWITCH_TYPE_LIGHT, STATE_CHANGE_TIME, @@ -57,41 +55,41 @@ async def test_ip_changes_fallback_discovery(hass: HomeAssistant): ) config_entry.add_to_hass(hass) - mocked_bulb = _mocked_bulb(True) - mocked_bulb.bulb_type = BulbType.WhiteTempMood - mocked_bulb.async_listen = AsyncMock(side_effect=[BulbException, None, None, None]) + mocked_fail_bulb = _mocked_bulb(cannot_connect=True) + mocked_fail_bulb.bulb_type = BulbType.WhiteTempMood + with patch( + f"{MODULE}.AsyncBulb", return_value=mocked_fail_bulb + ), _patch_discovery(): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + assert config_entry.state is ConfigEntryState.SETUP_RETRY + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=2)) + await hass.async_block_till_done() + + # The discovery should update the ip address + assert config_entry.data[CONF_HOST] == IP_ADDRESS + assert config_entry.state is ConfigEntryState.SETUP_RETRY + mocked_bulb = _mocked_bulb() with patch(f"{MODULE}.AsyncBulb", return_value=mocked_bulb), _patch_discovery(): - assert await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=10)) await hass.async_block_till_done() + assert config_entry.state is ConfigEntryState.LOADED binary_sensor_entity_id = ENTITY_BINARY_SENSOR_TEMPLATE.format( f"yeelight_color_{SHORT_ID}" ) - - type(mocked_bulb).async_get_properties = AsyncMock(None) - - await hass.data[DOMAIN][DATA_CONFIG_ENTRIES][config_entry.entry_id][ - DATA_DEVICE - ].async_update() - await hass.async_block_till_done() - await hass.async_block_till_done() - entity_registry = er.async_get(hass) assert entity_registry.async_get(binary_sensor_entity_id) is not None - with patch(f"{MODULE}.AsyncBulb", return_value=mocked_bulb), _patch_discovery(): - # The discovery should update the ip address - async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=2)) - await hass.async_block_till_done() - assert config_entry.data[CONF_HOST] == IP_ADDRESS - # Make sure we can still reload with the new ip right after we change it with patch(f"{MODULE}.AsyncBulb", return_value=mocked_bulb), _patch_discovery(): await hass.config_entries.async_reload(config_entry.entry_id) await hass.async_block_till_done() + assert config_entry.state is ConfigEntryState.LOADED + entity_registry = er.async_get(hass) assert entity_registry.async_get(binary_sensor_entity_id) is not None @@ -328,13 +326,21 @@ async def test_bulb_off_while_adding_in_ha(hass: HomeAssistant): ) config_entry.add_to_hass(hass) - mocked_bulb = _mocked_bulb(True) + mocked_bulb = _mocked_bulb(cannot_connect=True) mocked_bulb.bulb_type = BulbType.WhiteTempMood with patch(f"{MODULE}.AsyncBulb", return_value=mocked_bulb), _patch_discovery( no_device=True ), _patch_discovery_timeout(), _patch_discovery_interval(): - assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + assert config_entry.state is ConfigEntryState.SETUP_RETRY + + with patch(f"{MODULE}.AsyncBulb", return_value=_mocked_bulb()), _patch_discovery( + no_device=True + ), _patch_discovery_timeout(), _patch_discovery_interval(): + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=2)) await hass.async_block_till_done() assert config_entry.state is ConfigEntryState.LOADED @@ -401,7 +407,7 @@ async def test_async_listen_error_has_host_with_id(hass: HomeAssistant): ): await hass.config_entries.async_setup(config_entry.entry_id) - assert config_entry.state is ConfigEntryState.LOADED + assert config_entry.state is ConfigEntryState.SETUP_RETRY async def test_async_listen_error_has_host_without_id(hass: HomeAssistant): @@ -433,9 +439,16 @@ async def test_async_setup_with_missing_id(hass: HomeAssistant): f"{MODULE}.AsyncBulb", return_value=_mocked_bulb(cannot_connect=True) ): await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert config_entry.state is ConfigEntryState.SETUP_RETRY + assert config_entry.data[CONF_ID] == ID - assert config_entry.state is ConfigEntryState.LOADED - assert config_entry.data[CONF_ID] == ID + with _patch_discovery(), _patch_discovery_timeout(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=_mocked_bulb() + ): + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=2)) + await hass.async_block_till_done() + assert config_entry.state is ConfigEntryState.LOADED async def test_connection_dropped_resyncs_properties(hass: HomeAssistant): From 78bb2f5b731a379ae7bfcb515e2ef23db46c29e0 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Oct 2021 13:32:48 -0700 Subject: [PATCH 077/162] Reinstate asking for country in Tuya flow (#57142) --- homeassistant/components/tuya/__init__.py | 17 +- homeassistant/components/tuya/config_flow.py | 37 ++- homeassistant/components/tuya/const.py | 270 +++++++++++++++++- homeassistant/components/tuya/strings.json | 4 +- .../components/tuya/translations/en.json | 67 +---- tests/components/tuya/test_config_flow.py | 17 +- 6 files changed, 312 insertions(+), 100 deletions(-) diff --git a/homeassistant/components/tuya/__init__.py b/homeassistant/components/tuya/__init__.py index df4689268cf..28c43d8df46 100644 --- a/homeassistant/components/tuya/__init__.py +++ b/homeassistant/components/tuya/__init__.py @@ -44,7 +44,10 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Async setup hass config entry.""" - hass.data[DOMAIN] = {entry.entry_id: {TUYA_HA_TUYA_MAP: {}, TUYA_HA_DEVICES: set()}} + hass.data.setdefault(DOMAIN, {})[entry.entry_id] = { + TUYA_HA_TUYA_MAP: {}, + TUYA_HA_DEVICES: set(), + } # Project type has been renamed to auth type in the upstream Tuya IoT SDK. # This migrates existing config entries to reflect that name change. @@ -54,6 +57,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: hass.config_entries.async_update_entry(entry, data=data) success = await _init_tuya_sdk(hass, entry) + + if not success: + hass.data[DOMAIN].pop(entry.entry_id) + + if not hass.data[DOMAIN]: + hass.data.pop(DOMAIN) + return bool(success) @@ -143,7 +153,10 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: hass.data[DOMAIN][entry.entry_id][TUYA_MQTT_LISTENER] ) - hass.data.pop(DOMAIN) + hass.data[DOMAIN].pop(entry.entry_id) + + if not hass.data[DOMAIN]: + hass.data.pop(DOMAIN) return unload diff --git a/homeassistant/components/tuya/config_flow.py b/homeassistant/components/tuya/config_flow.py index 8fffed3cd9f..bcde364ae1b 100644 --- a/homeassistant/components/tuya/config_flow.py +++ b/homeassistant/components/tuya/config_flow.py @@ -6,7 +6,6 @@ from typing import Any from tuya_iot import AuthType, TuyaOpenAPI import voluptuous as vol -from voluptuous.schema_builder import UNDEFINED from homeassistant import config_entries @@ -18,11 +17,10 @@ from .const import ( CONF_COUNTRY_CODE, CONF_ENDPOINT, CONF_PASSWORD, - CONF_REGION, CONF_USERNAME, DOMAIN, SMARTLIFE_APP, - TUYA_REGIONS, + TUYA_COUNTRIES, TUYA_RESPONSE_CODE, TUYA_RESPONSE_MSG, TUYA_RESPONSE_PLATFROM_URL, @@ -42,14 +40,20 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): """Try login.""" response = {} + country = [ + country + for country in TUYA_COUNTRIES + if country.name == user_input[CONF_COUNTRY_CODE] + ][0] + data = { - CONF_ENDPOINT: TUYA_REGIONS[user_input[CONF_REGION]], + CONF_ENDPOINT: country.endpoint, CONF_AUTH_TYPE: AuthType.CUSTOM, CONF_ACCESS_ID: user_input[CONF_ACCESS_ID], CONF_ACCESS_SECRET: user_input[CONF_ACCESS_SECRET], CONF_USERNAME: user_input[CONF_USERNAME], CONF_PASSWORD: user_input[CONF_PASSWORD], - CONF_COUNTRY_CODE: user_input[CONF_REGION], + CONF_COUNTRY_CODE: country.country_code, } for app_type in ("", TUYA_SMART_APP, SMARTLIFE_APP): @@ -109,29 +113,32 @@ class TuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): TUYA_RESPONSE_MSG: response.get(TUYA_RESPONSE_MSG), } - def _schema_default(key: str) -> str | UNDEFINED: - if not user_input: - return UNDEFINED - return user_input[key] + if user_input is None: + user_input = {} return self.async_show_form( step_id="user", data_schema=vol.Schema( { vol.Required( - CONF_REGION, default=_schema_default(CONF_REGION) - ): vol.In(TUYA_REGIONS.keys()), + CONF_COUNTRY_CODE, + default=user_input.get(CONF_COUNTRY_CODE, "United States"), + ): vol.In( + # We don't pass a dict {code:name} because country codes can be duplicate. + [country.name for country in TUYA_COUNTRIES] + ), vol.Required( - CONF_ACCESS_ID, default=_schema_default(CONF_ACCESS_ID) + CONF_ACCESS_ID, default=user_input.get(CONF_ACCESS_ID, "") ): str, vol.Required( - CONF_ACCESS_SECRET, default=_schema_default(CONF_ACCESS_SECRET) + CONF_ACCESS_SECRET, + default=user_input.get(CONF_ACCESS_SECRET, ""), ): str, vol.Required( - CONF_USERNAME, default=_schema_default(CONF_USERNAME) + CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") ): str, vol.Required( - CONF_PASSWORD, default=_schema_default(CONF_PASSWORD) + CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } ), diff --git a/homeassistant/components/tuya/const.py b/homeassistant/components/tuya/const.py index 7c6440d7e48..44b66b576e3 100644 --- a/homeassistant/components/tuya/const.py +++ b/homeassistant/components/tuya/const.py @@ -1,4 +1,5 @@ """Constants for the Tuya integration.""" +from dataclasses import dataclass DOMAIN = "tuya" @@ -9,7 +10,6 @@ CONF_ACCESS_ID = "access_id" CONF_ACCESS_SECRET = "access_secret" CONF_USERNAME = "username" CONF_PASSWORD = "password" -CONF_REGION = "region" CONF_COUNTRY_CODE = "country_code" CONF_APP_TYPE = "tuya_app_type" @@ -31,13 +31,265 @@ TUYA_HA_SIGNAL_UPDATE_ENTITY = "tuya_entry_update" TUYA_SMART_APP = "tuyaSmart" SMARTLIFE_APP = "smartlife" -TUYA_REGIONS = { - "America": "https://openapi.tuyaus.com", - "China": "https://openapi.tuyacn.com", - "Eastern America": "https://openapi-ueaz.tuyaus.com", - "Europe": "https://openapi.tuyaeu.com", - "India": "https://openapi.tuyain.com", - "Western Europe": "https://openapi-weaz.tuyaeu.com", -} +ENDPOINT_AMERICA = "https://openapi.tuyaus.com" +ENDPOINT_CHINA = "https://openapi.tuyacn.com" +ENDPOINT_EASTERN_AMERICA = "https://openapi-ueaz.tuyaus.com" +ENDPOINT_EUROPE = "https://openapi.tuyaeu.com" +ENDPOINT_INDIA = "https://openapi.tuyain.com" +ENDPOINT_WESTERN_EUROPE = "https://openapi-weaz.tuyaeu.com" PLATFORMS = ["climate", "fan", "light", "scene", "switch"] + + +@dataclass +class Country: + """Describe a supported country.""" + + name: str + country_code: str + endpoint: str = ENDPOINT_AMERICA + + +# https://developer.tuya.com/en/docs/iot/oem-app-data-center-distributed?id=Kafi0ku9l07qb#title-4-China%20Data%20Center +TUYA_COUNTRIES = [ + Country("Afghanistan", "93"), + Country("Albania", "355"), + Country("Algeria", "213"), + Country("American Samoa", "1-684"), + Country("Andorra", "376"), + Country("Angola", "244"), + Country("Anguilla", "1-264"), + Country("Antarctica", "672"), + Country("Antigua and Barbuda", "1-268"), + Country("Argentina", "54", ENDPOINT_EUROPE), + Country("Armenia", "374"), + Country("Aruba", "297"), + Country("Australia", "61"), + Country("Austria", "43", ENDPOINT_EUROPE), + Country("Azerbaijan", "994"), + Country("Bahamas", "1-242"), + Country("Bahrain", "973"), + Country("Bangladesh", "880"), + Country("Barbados", "1-246"), + Country("Belarus", "375"), + Country("Belgium", "32", ENDPOINT_EUROPE), + Country("Belize", "501"), + Country("Benin", "229"), + Country("Bermuda", "1-441"), + Country("Bhutan", "975"), + Country("Bolivia", "591"), + Country("Bosnia and Herzegovina", "387"), + Country("Botswana", "267"), + Country("Brazil", "55", ENDPOINT_EUROPE), + Country("British Indian Ocean Territory", "246"), + Country("British Virgin Islands", "1-284"), + Country("Brunei", "673"), + Country("Bulgaria", "359"), + Country("Burkina Faso", "226"), + Country("Burundi", "257"), + Country("Cambodia", "855"), + Country("Cameroon", "237"), + Country("Canada", "1", ENDPOINT_AMERICA), + Country("Cape Verde", "238"), + Country("Cayman Islands", "1-345"), + Country("Central African Republic", "236"), + Country("Chad", "235"), + Country("Chile", "56"), + Country("China", "86", ENDPOINT_CHINA), + Country("Christmas Island", "61"), + Country("Cocos Islands", "61"), + Country("Colombia", "57"), + Country("Comoros", "269"), + Country("Cook Islands", "682"), + Country("Costa Rica", "506"), + Country("Croatia", "385", ENDPOINT_EUROPE), + Country("Cuba", "53"), + Country("Curacao", "599"), + Country("Cyprus", "357", ENDPOINT_EUROPE), + Country("Czech Republic", "420", ENDPOINT_EUROPE), + Country("Democratic Republic of the Congo", "243"), + Country("Denmark", "45", ENDPOINT_EUROPE), + Country("Djibouti", "253"), + Country("Dominica", "1-767"), + Country("Dominican Republic", "1-809"), + Country("East Timor", "670"), + Country("Ecuador", "593"), + Country("Egypt", "20"), + Country("El Salvador", "503"), + Country("Equatorial Guinea", "240"), + Country("Eritrea", "291"), + Country("Estonia", "372", ENDPOINT_EUROPE), + Country("Ethiopia", "251"), + Country("Falkland Islands", "500"), + Country("Faroe Islands", "298"), + Country("Fiji", "679"), + Country("Finland", "358", ENDPOINT_EUROPE), + Country("France", "33", ENDPOINT_EUROPE), + Country("French Polynesia", "689"), + Country("Gabon", "241"), + Country("Gambia", "220"), + Country("Georgia", "995"), + Country("Germany", "49", ENDPOINT_EUROPE), + Country("Ghana", "233"), + Country("Gibraltar", "350"), + Country("Greece", "30", ENDPOINT_EUROPE), + Country("Greenland", "299"), + Country("Grenada", "1-473"), + Country("Guam", "1-671"), + Country("Guatemala", "502"), + Country("Guernsey", "44-1481"), + Country("Guinea", "224"), + Country("Guinea-Bissau", "245"), + Country("Guyana", "592"), + Country("Haiti", "509"), + Country("Honduras", "504"), + Country("Hong Kong", "852"), + Country("Hungary", "36", ENDPOINT_EUROPE), + Country("Iceland", "354", ENDPOINT_EUROPE), + Country("India", "91", ENDPOINT_INDIA), + Country("Indonesia", "62"), + Country("Iran", "98"), + Country("Iraq", "964"), + Country("Ireland", "353", ENDPOINT_EUROPE), + Country("Isle of Man", "44-1624"), + Country("Israel", "972"), + Country("Italy", "39", ENDPOINT_EUROPE), + Country("Ivory Coast", "225"), + Country("Jamaica", "1-876"), + Country("Japan", "81", ENDPOINT_EUROPE), + Country("Jersey", "44-1534"), + Country("Jordan", "962"), + Country("Kazakhstan", "7"), + Country("Kenya", "254"), + Country("Kiribati", "686"), + Country("Kosovo", "383"), + Country("Kuwait", "965"), + Country("Kyrgyzstan", "996"), + Country("Laos", "856"), + Country("Latvia", "371", ENDPOINT_EUROPE), + Country("Lebanon", "961"), + Country("Lesotho", "266"), + Country("Liberia", "231"), + Country("Libya", "218"), + Country("Liechtenstein", "423", ENDPOINT_EUROPE), + Country("Lithuania", "370", ENDPOINT_EUROPE), + Country("Luxembourg", "352", ENDPOINT_EUROPE), + Country("Macau", "853"), + Country("Macedonia", "389"), + Country("Madagascar", "261"), + Country("Malawi", "265"), + Country("Malaysia", "60"), + Country("Maldives", "960"), + Country("Mali", "223"), + Country("Malta", "356", ENDPOINT_EUROPE), + Country("Marshall Islands", "692"), + Country("Mauritania", "222"), + Country("Mauritius", "230"), + Country("Mayotte", "262"), + Country("Mexico", "52"), + Country("Micronesia", "691"), + Country("Moldova", "373"), + Country("Monaco", "377"), + Country("Mongolia", "976"), + Country("Montenegro", "382"), + Country("Montserrat", "1-664"), + Country("Morocco", "212"), + Country("Mozambique", "258"), + Country("Myanmar", "95"), + Country("Namibia", "264"), + Country("Nauru", "674"), + Country("Nepal", "977"), + Country("Netherlands", "31", ENDPOINT_EUROPE), + Country("Netherlands Antilles", "599"), + Country("New Caledonia", "687"), + Country("New Zealand", "64"), + Country("Nicaragua", "505"), + Country("Niger", "227"), + Country("Nigeria", "234"), + Country("Niue", "683"), + Country("North Korea", "850"), + Country("Northern Mariana Islands", "1-670"), + Country("Norway", "47"), + Country("Oman", "968"), + Country("Pakistan", "92"), + Country("Palau", "680"), + Country("Palestine", "970"), + Country("Panama", "507"), + Country("Papua New Guinea", "675"), + Country("Paraguay", "595"), + Country("Peru", "51"), + Country("Philippines", "63"), + Country("Pitcairn", "64"), + Country("Poland", "48", ENDPOINT_EUROPE), + Country("Portugal", "351", ENDPOINT_EUROPE), + Country("Puerto Rico", "1-787, 1-939"), + Country("Qatar", "974"), + Country("Republic of the Congo", "242"), + Country("Reunion", "262"), + Country("Romania", "40", ENDPOINT_EUROPE), + Country("Russia", "7", ENDPOINT_EUROPE), + Country("Rwanda", "250"), + Country("Saint Barthelemy", "590"), + Country("Saint Helena", "290"), + Country("Saint Kitts and Nevis", "1-869"), + Country("Saint Lucia", "1-758"), + Country("Saint Martin", "590"), + Country("Saint Pierre and Miquelon", "508"), + Country("Saint Vincent and the Grenadines", "1-784"), + Country("Samoa", "685"), + Country("San Marino", "378"), + Country("Sao Tome and Principe", "239"), + Country("Saudi Arabia", "966"), + Country("Senegal", "221"), + Country("Serbia", "381"), + Country("Seychelles", "248"), + Country("Sierra Leone", "232"), + Country("Singapore", "65"), + Country("Sint Maarten", "1-721"), + Country("Slovakia", "421", ENDPOINT_EUROPE), + Country("Slovenia", "386", ENDPOINT_EUROPE), + Country("Solomon Islands", "677"), + Country("Somalia", "252"), + Country("South Africa", "27"), + Country("South Korea", "82"), + Country("South Sudan", "211"), + Country("Spain", "34", ENDPOINT_EUROPE), + Country("Sri Lanka", "94"), + Country("Sudan", "249"), + Country("Suriname", "597"), + Country("Svalbard and Jan Mayen", "47", ENDPOINT_EUROPE), + Country("Swaziland", "268"), + Country("Sweden", "46", ENDPOINT_EUROPE), + Country("Switzerland", "41"), + Country("Syria", "963"), + Country("Taiwan", "886"), + Country("Tajikistan", "992"), + Country("Tanzania", "255"), + Country("Thailand", "66"), + Country("Togo", "228"), + Country("Tokelau", "690"), + Country("Tonga", "676"), + Country("Trinidad and Tobago", "1-868"), + Country("Tunisia", "216"), + Country("Turkey", "90"), + Country("Turkmenistan", "993"), + Country("Turks and Caicos Islands", "1-649"), + Country("Tuvalu", "688"), + Country("U.S. Virgin Islands", "1-340"), + Country("Uganda", "256"), + Country("Ukraine", "380"), + Country("United Arab Emirates", "971"), + Country("United Kingdom", "44", ENDPOINT_EUROPE), + Country("United States", "1", ENDPOINT_AMERICA), + Country("Uruguay", "598"), + Country("Uzbekistan", "998"), + Country("Vanuatu", "678"), + Country("Vatican", "379"), + Country("Venezuela", "58"), + Country("Vietnam", "84"), + Country("Wallis and Futuna", "681"), + Country("Western Sahara", "212"), + Country("Yemen", "967"), + Country("Zambia", "260"), + Country("Zimbabwe", "263"), +] diff --git a/homeassistant/components/tuya/strings.json b/homeassistant/components/tuya/strings.json index 044c068ac9c..0bb59615e6e 100644 --- a/homeassistant/components/tuya/strings.json +++ b/homeassistant/components/tuya/strings.json @@ -4,7 +4,7 @@ "user": { "description": "Enter your Tuya credentials", "data": { - "region": "Region", + "country_code": "Country", "access_id": "Tuya IoT Access ID", "access_secret": "Tuya IoT Access Secret", "username": "Account", @@ -17,4 +17,4 @@ "login_error": "Login error ({code}): {msg}" } } -} \ No newline at end of file +} diff --git a/homeassistant/components/tuya/translations/en.json b/homeassistant/components/tuya/translations/en.json index 4b4b9a6d1dd..e69872fd309 100644 --- a/homeassistant/components/tuya/translations/en.json +++ b/homeassistant/components/tuya/translations/en.json @@ -1,82 +1,19 @@ { "config": { - "abort": { - "cannot_connect": "Failed to connect", - "invalid_auth": "Invalid authentication", - "single_instance_allowed": "Already configured. Only a single configuration possible." - }, "error": { "invalid_auth": "Invalid authentication", "login_error": "Login error ({code}): {msg}" }, - "flow_title": "Tuya configuration", "step": { - "login": { - "data": { - "access_id": "Access ID", - "access_secret": "Access Secret", - "country_code": "Country Code", - "endpoint": "Availability Zone", - "password": "Password", - "tuya_app_type": "Mobile App", - "username": "Account" - }, - "description": "Enter your Tuya credential", - "title": "Tuya" - }, "user": { "data": { "access_id": "Tuya IoT Access ID", "access_secret": "Tuya IoT Access Secret", - "country_code": "Your account country code (e.g., 1 for USA or 86 for China)", + "country_code": "Country", "password": "Password", - "platform": "The app where your account is registered", - "region": "Region", - "tuya_project_type": "Tuya cloud project type", "username": "Account" }, - "description": "Enter your Tuya credentials", - "title": "Tuya Integration" - } - } - }, - "options": { - "abort": { - "cannot_connect": "Failed to connect" - }, - "error": { - "dev_multi_type": "Multiple selected devices to configure must be of the same type", - "dev_not_config": "Device type not configurable", - "dev_not_found": "Device not found" - }, - "step": { - "device": { - "data": { - "brightness_range_mode": "Brightness range used by device", - "curr_temp_divider": "Current Temperature value divider (0 = use default)", - "max_kelvin": "Max color temperature supported in kelvin", - "max_temp": "Max target temperature (use min and max = 0 for default)", - "min_kelvin": "Min color temperature supported in kelvin", - "min_temp": "Min target temperature (use min and max = 0 for default)", - "set_temp_divided": "Use divided Temperature value for set temperature command", - "support_color": "Force color support", - "temp_divider": "Temperature values divider (0 = use default)", - "temp_step_override": "Target Temperature step", - "tuya_max_coltemp": "Max color temperature reported by device", - "unit_of_measurement": "Temperature unit used by device" - }, - "description": "Configure options to adjust displayed information for {device_type} device `{device_name}`", - "title": "Configure Tuya Device" - }, - "init": { - "data": { - "discovery_interval": "Discovery device polling interval in seconds", - "list_devices": "Select the devices to configure or leave empty to save configuration", - "query_device": "Select device that will use query method for faster status update", - "query_interval": "Query device polling interval in seconds" - }, - "description": "Do not set pollings interval values too low or the calls will fail generating error message in the log", - "title": "Configure Tuya Options" + "description": "Enter your Tuya credentials" } } } diff --git a/tests/components/tuya/test_config_flow.py b/tests/components/tuya/test_config_flow.py index 745bcfde661..a5aee459bd7 100644 --- a/tests/components/tuya/test_config_flow.py +++ b/tests/components/tuya/test_config_flow.py @@ -12,13 +12,14 @@ from homeassistant.components.tuya.const import ( CONF_ACCESS_SECRET, CONF_APP_TYPE, CONF_AUTH_TYPE, + CONF_COUNTRY_CODE, CONF_ENDPOINT, CONF_PASSWORD, - CONF_REGION, CONF_USERNAME, DOMAIN, + ENDPOINT_INDIA, SMARTLIFE_APP, - TUYA_REGIONS, + TUYA_COUNTRIES, TUYA_SMART_APP, ) from homeassistant.core import HomeAssistant @@ -26,15 +27,15 @@ from homeassistant.core import HomeAssistant MOCK_SMART_HOME_PROJECT_TYPE = 0 MOCK_INDUSTRY_PROJECT_TYPE = 1 -MOCK_REGION = "Europe" +MOCK_COUNTRY = "India" MOCK_ACCESS_ID = "myAccessId" MOCK_ACCESS_SECRET = "myAccessSecret" MOCK_USERNAME = "myUsername" MOCK_PASSWORD = "myPassword" -MOCK_ENDPOINT = "https://openapi-ueaz.tuyaus.com" +MOCK_ENDPOINT = ENDPOINT_INDIA TUYA_INPUT_DATA = { - CONF_REGION: MOCK_REGION, + CONF_COUNTRY_CODE: MOCK_COUNTRY, CONF_ACCESS_ID: MOCK_ACCESS_ID, CONF_ACCESS_SECRET: MOCK_ACCESS_SECRET, CONF_USERNAME: MOCK_USERNAME, @@ -92,16 +93,18 @@ async def test_user_flow( ) await hass.async_block_till_done() + country = [country for country in TUYA_COUNTRIES if country.name == MOCK_COUNTRY][0] + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result["title"] == MOCK_USERNAME assert result["data"][CONF_ACCESS_ID] == MOCK_ACCESS_ID assert result["data"][CONF_ACCESS_SECRET] == MOCK_ACCESS_SECRET assert result["data"][CONF_USERNAME] == MOCK_USERNAME assert result["data"][CONF_PASSWORD] == MOCK_PASSWORD - assert result["data"][CONF_ENDPOINT] == MOCK_ENDPOINT - assert result["data"][CONF_ENDPOINT] != TUYA_REGIONS[TUYA_INPUT_DATA[CONF_REGION]] + assert result["data"][CONF_ENDPOINT] == country.endpoint assert result["data"][CONF_APP_TYPE] == app_type assert result["data"][CONF_AUTH_TYPE] == project_type + assert result["data"][CONF_COUNTRY_CODE] == country.country_code assert not result["result"].unique_id From dbde2f1b92f944eff83b4789d95ac2b54b82ca01 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Tue, 5 Oct 2021 16:33:23 -0400 Subject: [PATCH 078/162] Bump zwave-js-server-python to 0.31.3 (#57143) --- homeassistant/components/zwave_js/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/zwave_js/manifest.json b/homeassistant/components/zwave_js/manifest.json index e80549d815d..50e0a039488 100644 --- a/homeassistant/components/zwave_js/manifest.json +++ b/homeassistant/components/zwave_js/manifest.json @@ -3,7 +3,7 @@ "name": "Z-Wave JS", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/zwave_js", - "requirements": ["zwave-js-server-python==0.31.2"], + "requirements": ["zwave-js-server-python==0.31.3"], "codeowners": ["@home-assistant/z-wave"], "dependencies": ["usb", "http", "websocket_api"], "iot_class": "local_push", diff --git a/requirements_all.txt b/requirements_all.txt index cfab25fd3ba..c715088b8b7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2504,4 +2504,4 @@ zigpy==0.38.0 zm-py==0.5.2 # homeassistant.components.zwave_js -zwave-js-server-python==0.31.2 +zwave-js-server-python==0.31.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 66955cfe593..31a5c6a5d1c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1430,4 +1430,4 @@ zigpy-znp==0.5.4 zigpy==0.38.0 # homeassistant.components.zwave_js -zwave-js-server-python==0.31.2 +zwave-js-server-python==0.31.3 From 73bf53873646fd4baa11238c078cc959879d93e9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Oct 2021 13:45:52 -0700 Subject: [PATCH 079/162] Bumped version to 2021.10.0b7 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 01c031ce339..7e9d4c36286 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b6" +PATCH_VERSION: Final = "0b7" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 76a6edb4ed4b45c7c753e749da80883c64aeecfb Mon Sep 17 00:00:00 2001 From: Lawrence Date: Wed, 6 Oct 2021 14:34:23 +1100 Subject: [PATCH 080/162] Updated amberelectic attributes to reflect unit change to $/kWh (#57109) --- .../components/amberelectric/sensor.py | 33 +++++++++++-------- tests/components/amberelectric/test_sensor.py | 33 +++++++++---------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/homeassistant/components/amberelectric/sensor.py b/homeassistant/components/amberelectric/sensor.py index 0a47615046e..974de2d5c15 100644 --- a/homeassistant/components/amberelectric/sensor.py +++ b/homeassistant/components/amberelectric/sensor.py @@ -37,6 +37,11 @@ ICONS = { UNIT = f"{CURRENCY_DOLLAR}/{ENERGY_KILO_WATT_HOUR}" +def format_cents_to_dollars(cents: float) -> float: + """Return a formatted conversion from cents to dollars.""" + return round(cents / 100, 2) + + def friendly_channel_type(channel_type: str) -> str: """Return a human readable version of the channel type.""" if channel_type == "controlled_load": @@ -70,13 +75,13 @@ class AmberPriceSensor(AmberSensor): """Amber Price Sensor.""" @property - def native_value(self) -> str | None: + def native_value(self) -> float | None: """Return the current price in $/kWh.""" interval = self.coordinator.data[self.entity_description.key][self.channel_type] if interval.channel_type == ChannelType.FEED_IN: - return round(interval.per_kwh, 0) / 100 * -1 - return round(interval.per_kwh, 0) / 100 + return format_cents_to_dollars(interval.per_kwh) * -1 + return format_cents_to_dollars(interval.per_kwh) @property def device_state_attributes(self) -> Mapping[str, Any] | None: @@ -89,11 +94,11 @@ class AmberPriceSensor(AmberSensor): data["duration"] = interval.duration data["date"] = interval.date.isoformat() - data["per_kwh"] = round(interval.per_kwh) + data["per_kwh"] = format_cents_to_dollars(interval.per_kwh) if interval.channel_type == ChannelType.FEED_IN: data["per_kwh"] = data["per_kwh"] * -1 data["nem_date"] = interval.nem_time.isoformat() - data["spot_per_kwh"] = round(interval.spot_per_kwh) + data["spot_per_kwh"] = format_cents_to_dollars(interval.spot_per_kwh) data["start_time"] = interval.start_time.isoformat() data["end_time"] = interval.end_time.isoformat() data["renewables"] = round(interval.renewables) @@ -102,8 +107,8 @@ class AmberPriceSensor(AmberSensor): data["channel_type"] = interval.channel_type.value if interval.range is not None: - data["range_min"] = interval.range.min - data["range_max"] = interval.range.max + data["range_min"] = format_cents_to_dollars(interval.range.min) + data["range_max"] = format_cents_to_dollars(interval.range.max) return data @@ -112,7 +117,7 @@ class AmberForecastSensor(AmberSensor): """Amber Forecast Sensor.""" @property - def native_value(self) -> str | None: + def native_value(self) -> float | None: """Return the first forecast price in $/kWh.""" intervals = self.coordinator.data[self.entity_description.key].get( self.channel_type @@ -122,8 +127,8 @@ class AmberForecastSensor(AmberSensor): interval = intervals[0] if interval.channel_type == ChannelType.FEED_IN: - return round(interval.per_kwh, 0) / 100 * -1 - return round(interval.per_kwh, 0) / 100 + return format_cents_to_dollars(interval.per_kwh) * -1 + return format_cents_to_dollars(interval.per_kwh) @property def device_state_attributes(self) -> Mapping[str, Any] | None: @@ -146,18 +151,18 @@ class AmberForecastSensor(AmberSensor): datum["duration"] = interval.duration datum["date"] = interval.date.isoformat() datum["nem_date"] = interval.nem_time.isoformat() - datum["per_kwh"] = round(interval.per_kwh) + datum["per_kwh"] = format_cents_to_dollars(interval.per_kwh) if interval.channel_type == ChannelType.FEED_IN: datum["per_kwh"] = datum["per_kwh"] * -1 - datum["spot_per_kwh"] = round(interval.spot_per_kwh) + datum["spot_per_kwh"] = format_cents_to_dollars(interval.spot_per_kwh) datum["start_time"] = interval.start_time.isoformat() datum["end_time"] = interval.end_time.isoformat() datum["renewables"] = round(interval.renewables) datum["spike_status"] = interval.spike_status.value if interval.range is not None: - datum["range_min"] = interval.range.min - datum["range_max"] = interval.range.max + datum["range_min"] = format_cents_to_dollars(interval.range.min) + datum["range_max"] = format_cents_to_dollars(interval.range.max) data["forecasts"].append(datum) diff --git a/tests/components/amberelectric/test_sensor.py b/tests/components/amberelectric/test_sensor.py index 865121bd1ee..ccfcd82b3bd 100644 --- a/tests/components/amberelectric/test_sensor.py +++ b/tests/components/amberelectric/test_sensor.py @@ -108,9 +108,9 @@ async def test_general_price_sensor(hass: HomeAssistant, setup_general: Mock) -> attributes = price.attributes assert attributes["duration"] == 30 assert attributes["date"] == "2021-09-21" - assert attributes["per_kwh"] == 8 + assert attributes["per_kwh"] == 0.08 assert attributes["nem_date"] == "2021-09-21T08:30:00+10:00" - assert attributes["spot_per_kwh"] == 1 + assert attributes["spot_per_kwh"] == 0.01 assert attributes["start_time"] == "2021-09-21T08:00:00+10:00" assert attributes["end_time"] == "2021-09-21T08:30:00+10:00" assert attributes["renewables"] == 51 @@ -132,8 +132,8 @@ async def test_general_price_sensor(hass: HomeAssistant, setup_general: Mock) -> price = hass.states.get("sensor.mock_title_general_price") assert price attributes = price.attributes - assert attributes.get("range_min") == 7.8 - assert attributes.get("range_max") == 12.4 + assert attributes.get("range_min") == 0.08 + assert attributes.get("range_max") == 0.12 async def test_general_and_controlled_load_price_sensor( @@ -141,16 +141,15 @@ async def test_general_and_controlled_load_price_sensor( ) -> None: """Test the Controlled Price sensor.""" assert len(hass.states.async_all()) == 6 - print(hass.states) price = hass.states.get("sensor.mock_title_controlled_load_price") assert price assert price.state == "0.08" attributes = price.attributes assert attributes["duration"] == 30 assert attributes["date"] == "2021-09-21" - assert attributes["per_kwh"] == 8 + assert attributes["per_kwh"] == 0.08 assert attributes["nem_date"] == "2021-09-21T08:30:00+10:00" - assert attributes["spot_per_kwh"] == 1 + assert attributes["spot_per_kwh"] == 0.01 assert attributes["start_time"] == "2021-09-21T08:00:00+10:00" assert attributes["end_time"] == "2021-09-21T08:30:00+10:00" assert attributes["renewables"] == 51 @@ -172,9 +171,9 @@ async def test_general_and_feed_in_price_sensor( attributes = price.attributes assert attributes["duration"] == 30 assert attributes["date"] == "2021-09-21" - assert attributes["per_kwh"] == -8 + assert attributes["per_kwh"] == -0.08 assert attributes["nem_date"] == "2021-09-21T08:30:00+10:00" - assert attributes["spot_per_kwh"] == 1 + assert attributes["spot_per_kwh"] == 0.01 assert attributes["start_time"] == "2021-09-21T08:00:00+10:00" assert attributes["end_time"] == "2021-09-21T08:30:00+10:00" assert attributes["renewables"] == 51 @@ -199,9 +198,9 @@ async def test_general_forecast_sensor( first_forecast = attributes["forecasts"][0] assert first_forecast["duration"] == 30 assert first_forecast["date"] == "2021-09-21" - assert first_forecast["per_kwh"] == 9 + assert first_forecast["per_kwh"] == 0.09 assert first_forecast["nem_date"] == "2021-09-21T09:00:00+10:00" - assert first_forecast["spot_per_kwh"] == 1 + assert first_forecast["spot_per_kwh"] == 0.01 assert first_forecast["start_time"] == "2021-09-21T08:30:00+10:00" assert first_forecast["end_time"] == "2021-09-21T09:00:00+10:00" assert first_forecast["renewables"] == 50 @@ -222,8 +221,8 @@ async def test_general_forecast_sensor( assert price attributes = price.attributes first_forecast = attributes["forecasts"][0] - assert first_forecast.get("range_min") == 7.8 - assert first_forecast.get("range_max") == 12.4 + assert first_forecast.get("range_min") == 0.08 + assert first_forecast.get("range_max") == 0.12 async def test_controlled_load_forecast_sensor( @@ -241,9 +240,9 @@ async def test_controlled_load_forecast_sensor( first_forecast = attributes["forecasts"][0] assert first_forecast["duration"] == 30 assert first_forecast["date"] == "2021-09-21" - assert first_forecast["per_kwh"] == 9 + assert first_forecast["per_kwh"] == 0.09 assert first_forecast["nem_date"] == "2021-09-21T09:00:00+10:00" - assert first_forecast["spot_per_kwh"] == 1 + assert first_forecast["spot_per_kwh"] == 0.01 assert first_forecast["start_time"] == "2021-09-21T08:30:00+10:00" assert first_forecast["end_time"] == "2021-09-21T09:00:00+10:00" assert first_forecast["renewables"] == 50 @@ -265,9 +264,9 @@ async def test_feed_in_forecast_sensor( first_forecast = attributes["forecasts"][0] assert first_forecast["duration"] == 30 assert first_forecast["date"] == "2021-09-21" - assert first_forecast["per_kwh"] == -9 + assert first_forecast["per_kwh"] == -0.09 assert first_forecast["nem_date"] == "2021-09-21T09:00:00+10:00" - assert first_forecast["spot_per_kwh"] == 1 + assert first_forecast["spot_per_kwh"] == 0.01 assert first_forecast["start_time"] == "2021-09-21T08:30:00+10:00" assert first_forecast["end_time"] == "2021-09-21T09:00:00+10:00" assert first_forecast["renewables"] == 50 From 8394157c0aef68466654bf9146958fb5376eada1 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Wed, 6 Oct 2021 05:26:18 +0200 Subject: [PATCH 081/162] Fix Fritz shutdown race condition (#57148) --- homeassistant/components/fritz/common.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/fritz/common.py b/homeassistant/components/fritz/common.py index 0fb062af2d7..61cff890a93 100644 --- a/homeassistant/components/fritz/common.py +++ b/homeassistant/components/fritz/common.py @@ -228,7 +228,12 @@ class FritzBoxTools: def _update_hosts_info(self) -> list[HostInfo]: """Retrieve latest hosts information from the FRITZ!Box.""" - return self.fritz_hosts.get_hosts_info() # type: ignore [no-any-return] + try: + return self.fritz_hosts.get_hosts_info() # type: ignore [no-any-return] + except Exception as ex: # pylint: disable=[broad-except] + if not self.hass.is_stopping: + raise HomeAssistantError("Error refreshing hosts info") from ex + return [] def _update_device_info(self) -> tuple[bool, str | None]: """Retrieve latest device information from the FRITZ!Box.""" From 7502956d2b4737eb0fde1a34f46dc8aeada02f82 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Wed, 6 Oct 2021 05:25:57 +0200 Subject: [PATCH 082/162] Fix SamsungTV shutdown race condition (#57149) --- homeassistant/components/samsungtv/media_player.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/samsungtv/media_player.py b/homeassistant/components/samsungtv/media_player.py index 8644335959e..cab6435af95 100644 --- a/homeassistant/components/samsungtv/media_player.py +++ b/homeassistant/components/samsungtv/media_player.py @@ -133,7 +133,7 @@ class SamsungTVDevice(MediaPlayerEntity): def update(self) -> None: """Update state of device.""" - if self._auth_failed: + if self._auth_failed or self.hass.is_stopping: return if self._power_off_in_progress(): self._state = STATE_OFF From 8e02ea19365cad3ef3d32f7dcd46b213a371f4e1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Oct 2021 21:31:11 -0700 Subject: [PATCH 083/162] Guard upnp create device (#57156) --- homeassistant/components/upnp/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/upnp/__init__.py b/homeassistant/components/upnp/__init__.py index 14a2c39d3d9..6db8b087378 100644 --- a/homeassistant/components/upnp/__init__.py +++ b/homeassistant/components/upnp/__init__.py @@ -8,6 +8,7 @@ from datetime import timedelta from ipaddress import ip_address from typing import Any +from async_upnp_client.exceptions import UpnpConnectionError import voluptuous as vol from homeassistant import config_entries @@ -122,7 +123,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: location = discovery_info[ # pylint: disable=unsubscriptable-object ssdp.ATTR_SSDP_LOCATION ] - device = await Device.async_create_device(hass, location) + try: + device = await Device.async_create_device(hass, location) + except UpnpConnectionError as err: + LOGGER.debug("Error connecting to device %s", location) + raise ConfigEntryNotReady from err # Ensure entry has a unique_id. if not entry.unique_id: From 790a61cfaeaada985e8b291b32a55e566fa0db76 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Oct 2021 21:32:11 -0700 Subject: [PATCH 084/162] Bumped version to 2021.10.0b8 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 7e9d4c36286..01e6c5bd07a 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b7" +PATCH_VERSION: Final = "0b8" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From bb617d7b89ca5000aed2d80925807a89fd071dd0 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 1 Oct 2021 15:38:49 -0700 Subject: [PATCH 085/162] Bump netdisco to 3.0.0 (#56903) --- homeassistant/components/discovery/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/discovery/manifest.json b/homeassistant/components/discovery/manifest.json index 558c727c62c..1b7d51c1716 100644 --- a/homeassistant/components/discovery/manifest.json +++ b/homeassistant/components/discovery/manifest.json @@ -2,7 +2,7 @@ "domain": "discovery", "name": "Discovery", "documentation": "https://www.home-assistant.io/integrations/discovery", - "requirements": ["netdisco==2.9.0"], + "requirements": ["netdisco==3.0.0"], "after_dependencies": ["zeroconf"], "codeowners": [], "quality_scale": "internal" diff --git a/requirements_all.txt b/requirements_all.txt index c715088b8b7..74b58de7d14 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1047,7 +1047,7 @@ nessclient==0.9.15 netdata==0.2.0 # homeassistant.components.discovery -netdisco==2.9.0 +netdisco==3.0.0 # homeassistant.components.nmap_tracker netmap==0.7.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 31a5c6a5d1c..9a493f07be7 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -612,7 +612,7 @@ ndms2_client==0.1.1 nessclient==0.9.15 # homeassistant.components.discovery -netdisco==2.9.0 +netdisco==3.0.0 # homeassistant.components.nmap_tracker netmap==0.7.0.2 From a692d4de64daf3790427f6e21121d6a4e66676fd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 5 Oct 2021 21:34:22 -0700 Subject: [PATCH 086/162] Bumped version to 2021.10.0b9 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 01e6c5bd07a..a6a2680eb8a 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b8" +PATCH_VERSION: Final = "0b9" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 9e755fcc4943077dd3b523922d08d3a599a77d1c Mon Sep 17 00:00:00 2001 From: Jean-Yves Avenard Date: Wed, 6 Oct 2021 22:24:17 +1100 Subject: [PATCH 087/162] Change energy state class to STATE_CLASS_TOTAL (#56974) --- homeassistant/components/iotawatt/sensor.py | 4 ++-- tests/components/iotawatt/test_sensor.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/iotawatt/sensor.py b/homeassistant/components/iotawatt/sensor.py index ba0ec30caa0..ec2918b0ce6 100644 --- a/homeassistant/components/iotawatt/sensor.py +++ b/homeassistant/components/iotawatt/sensor.py @@ -9,7 +9,7 @@ from iotawattpy.sensor import Sensor from homeassistant.components.sensor import ( STATE_CLASS_MEASUREMENT, - STATE_CLASS_TOTAL_INCREASING, + STATE_CLASS_TOTAL, SensorEntity, SensorEntityDescription, ) @@ -83,6 +83,7 @@ ENTITY_DESCRIPTION_KEY_MAP: dict[str, IotaWattSensorEntityDescription] = { "WattHours": IotaWattSensorEntityDescription( "WattHours", native_unit_of_measurement=ENERGY_WATT_HOUR, + state_class=STATE_CLASS_TOTAL, device_class=DEVICE_CLASS_ENERGY, ), "VA": IotaWattSensorEntityDescription( @@ -242,7 +243,6 @@ class IotaWattAccumulatingSensor(IotaWattSensor, RestoreEntity): super().__init__(coordinator, key, entity_description) - self._attr_state_class = STATE_CLASS_TOTAL_INCREASING if self._attr_unique_id is not None: self._attr_unique_id += ".accumulated" diff --git a/tests/components/iotawatt/test_sensor.py b/tests/components/iotawatt/test_sensor.py index 8928c012d48..2397338c22c 100644 --- a/tests/components/iotawatt/test_sensor.py +++ b/tests/components/iotawatt/test_sensor.py @@ -6,7 +6,7 @@ from homeassistant.components.sensor import ( ATTR_STATE_CLASS, DEVICE_CLASS_ENERGY, STATE_CLASS_MEASUREMENT, - STATE_CLASS_TOTAL_INCREASING, + STATE_CLASS_TOTAL, ) from homeassistant.const import ( ATTR_DEVICE_CLASS, @@ -74,7 +74,7 @@ async def test_sensor_type_output(hass, mock_iotawatt): state = hass.states.get("sensor.my_watthour_sensor") assert state is not None assert state.state == "243" - assert ATTR_STATE_CLASS not in state.attributes + assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL assert state.attributes[ATTR_FRIENDLY_NAME] == "My WattHour Sensor" assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == ENERGY_WATT_HOUR assert state.attributes[ATTR_DEVICE_CLASS] == DEVICE_CLASS_ENERGY @@ -125,7 +125,7 @@ async def test_sensor_type_accumulated_output(hass, mock_iotawatt): state.attributes[ATTR_FRIENDLY_NAME] == "My WattHour Accumulated Output Sensor.wh Accumulated" ) - assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING + assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == ENERGY_WATT_HOUR assert state.attributes[ATTR_DEVICE_CLASS] == DEVICE_CLASS_ENERGY assert state.attributes["type"] == "Output" @@ -166,7 +166,7 @@ async def test_sensor_type_accumulated_output_error_restore(hass, mock_iotawatt) state.attributes[ATTR_FRIENDLY_NAME] == "My WattHour Accumulated Output Sensor.wh Accumulated" ) - assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING + assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == ENERGY_WATT_HOUR assert state.attributes[ATTR_DEVICE_CLASS] == DEVICE_CLASS_ENERGY assert state.attributes["type"] == "Output" @@ -224,7 +224,7 @@ async def test_sensor_type_multiple_accumulated_output(hass, mock_iotawatt): state.attributes[ATTR_FRIENDLY_NAME] == "My WattHour Accumulated Output Sensor.wh Accumulated" ) - assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL_INCREASING + assert state.attributes[ATTR_STATE_CLASS] == STATE_CLASS_TOTAL assert state.attributes[ATTR_UNIT_OF_MEASUREMENT] == ENERGY_WATT_HOUR assert state.attributes[ATTR_DEVICE_CLASS] == DEVICE_CLASS_ENERGY assert state.attributes["type"] == "Output" From 72b3bc13e48d9df8da1a53c38ef76c4c4d0046c4 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Wed, 6 Oct 2021 13:30:13 +0200 Subject: [PATCH 088/162] Remove Netgear tracker link_rate check on Orbi (#57032) * Netgear tracker: remove link_rate check on Orbi * fix debug message * Add orbi models * check start of model in V2 check * fix black --- homeassistant/components/netgear/const.py | 19 ++++++++++++++++++- homeassistant/components/netgear/router.py | 11 ++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/netgear/const.py b/homeassistant/components/netgear/const.py index 8b520485e1e..325d9e68cd8 100644 --- a/homeassistant/components/netgear/const.py +++ b/homeassistant/components/netgear/const.py @@ -11,7 +11,24 @@ DEFAULT_CONSIDER_HOME = timedelta(seconds=180) DEFAULT_NAME = "Netgear router" # update method V2 models -MODELS_V2 = ["Orbi"] +MODELS_V2 = [ + "Orbi", + "RBK", + "RBR", + "RBS", + "RBW", + "LBK", + "LBR", + "CBK", + "CBR", + "SRC", + "SRK", + "SRR", + "SRS", + "SXK", + "SXR", + "SXS", +] # Icons DEVICE_ICONS = { diff --git a/homeassistant/components/netgear/router.py b/homeassistant/components/netgear/router.py index 83b1aaa9f32..53cc4f32728 100644 --- a/homeassistant/components/netgear/router.py +++ b/homeassistant/components/netgear/router.py @@ -146,8 +146,9 @@ class NetgearRouter: self.model = self._info.get("ModelName") self.firmware_version = self._info.get("Firmwareversion") - if self.model in MODELS_V2: - self._method_version = 2 + for model in MODELS_V2: + if self.model.startswith(model): + self._method_version = 2 async def async_setup(self) -> None: """Set up a Netgear router.""" @@ -198,12 +199,12 @@ class NetgearRouter: ntg_devices = await self.async_get_attached_devices() now = dt_util.utcnow() + if _LOGGER.isEnabledFor(logging.DEBUG): + _LOGGER.debug("Netgear scan result: \n%s", ntg_devices) + for ntg_device in ntg_devices: device_mac = format_mac(ntg_device.mac) - if self._method_version == 2 and not ntg_device.link_rate: - continue - if not self.devices.get(device_mac): new_device = True From 2fc9cdbe68a6f620c0518c2bd4e9375260ba06dc Mon Sep 17 00:00:00 2001 From: Fredrik Erlandsson Date: Wed, 6 Oct 2021 10:07:30 +0200 Subject: [PATCH 089/162] Update Daikin config_flow with better error handling (#57069) --- .../components/daikin/config_flow.py | 17 ++++++++------- homeassistant/components/daikin/strings.json | 1 + .../components/daikin/translations/en.json | 1 + tests/components/daikin/test_config_flow.py | 21 ++++++++++++++----- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/daikin/config_flow.py b/homeassistant/components/daikin/config_flow.py index ea0709e5557..43d169e3440 100644 --- a/homeassistant/components/daikin/config_flow.py +++ b/homeassistant/components/daikin/config_flow.py @@ -75,7 +75,8 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): uuid=uuid, password=password, ) - except asyncio.TimeoutError: + except (asyncio.TimeoutError, ClientError): + self.host = None return self.async_show_form( step_id="user", data_schema=self.schema, @@ -87,13 +88,6 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): data_schema=self.schema, errors={"base": "invalid_auth"}, ) - except ClientError: - _LOGGER.exception("ClientError") - return self.async_show_form( - step_id="user", - data_schema=self.schema, - errors={"base": "unknown"}, - ) except Exception: # pylint: disable=broad-except _LOGGER.exception("Unexpected error creating device") return self.async_show_form( @@ -109,6 +103,13 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """User initiated config flow.""" if user_input is None: return self.async_show_form(step_id="user", data_schema=self.schema) + if user_input.get(CONF_API_KEY) and user_input.get(CONF_PASSWORD): + self.host = user_input.get(CONF_HOST) + return self.async_show_form( + step_id="user", + data_schema=self.schema, + errors={"base": "api_password"}, + ) return await self._create_device( user_input[CONF_HOST], user_input.get(CONF_API_KEY), diff --git a/homeassistant/components/daikin/strings.json b/homeassistant/components/daikin/strings.json index fc2b6e79a5e..5c759384795 100644 --- a/homeassistant/components/daikin/strings.json +++ b/homeassistant/components/daikin/strings.json @@ -18,6 +18,7 @@ "error": { "unknown": "[%key:common::config_flow::error::unknown%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", + "api_password": "[%key:common::config_flow::error::invalid_auth%], use either API Key or Password.", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" } } diff --git a/homeassistant/components/daikin/translations/en.json b/homeassistant/components/daikin/translations/en.json index d1db170d769..84843ba8211 100644 --- a/homeassistant/components/daikin/translations/en.json +++ b/homeassistant/components/daikin/translations/en.json @@ -5,6 +5,7 @@ "cannot_connect": "Failed to connect" }, "error": { + "api_password": "Invalid authentication, use either API Key or Password.", "cannot_connect": "Failed to connect", "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" diff --git a/tests/components/daikin/test_config_flow.py b/tests/components/daikin/test_config_flow.py index 624268d7ee3..91ea79f4aa7 100644 --- a/tests/components/daikin/test_config_flow.py +++ b/tests/components/daikin/test_config_flow.py @@ -3,13 +3,12 @@ import asyncio from unittest.mock import PropertyMock, patch -from aiohttp import ClientError -from aiohttp.web_exceptions import HTTPForbidden +from aiohttp import ClientError, web_exceptions import pytest from homeassistant.components.daikin.const import KEY_MAC from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF -from homeassistant.const import CONF_HOST +from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PASSWORD from homeassistant.data_entry_flow import ( RESULT_TYPE_ABORT, RESULT_TYPE_CREATE_ENTRY, @@ -84,8 +83,8 @@ async def test_abort_if_already_setup(hass, mock_daikin): "s_effect,reason", [ (asyncio.TimeoutError, "cannot_connect"), - (HTTPForbidden, "invalid_auth"), - (ClientError, "unknown"), + (ClientError, "cannot_connect"), + (web_exceptions.HTTPForbidden, "invalid_auth"), (Exception, "unknown"), ], ) @@ -103,6 +102,18 @@ async def test_device_abort(hass, mock_daikin, s_effect, reason): assert result["step_id"] == "user" +async def test_api_password_abort(hass): + """Test device abort.""" + result = await hass.config_entries.flow.async_init( + "daikin", + context={"source": SOURCE_USER}, + data={CONF_HOST: HOST, CONF_API_KEY: "aa", CONF_PASSWORD: "aa"}, + ) + assert result["type"] == RESULT_TYPE_FORM + assert result["errors"] == {"base": "api_password"} + assert result["step_id"] == "user" + + @pytest.mark.parametrize( "source, data, unique_id", [ From e01e5750928b9a4966da49b0fe968c3250b71cdf Mon Sep 17 00:00:00 2001 From: Thomas Schamm Date: Wed, 6 Oct 2021 10:09:02 +0200 Subject: [PATCH 090/162] Skip link local addresses in bosch_shc discovery step (#57074) --- .../components/bosch_shc/config_flow.py | 18 ++++++++++---- .../components/bosch_shc/test_config_flow.py | 24 ++++++++++++++++++- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/bosch_shc/config_flow.py b/homeassistant/components/bosch_shc/config_flow.py index 4415a0ff6ef..416dc6cf304 100644 --- a/homeassistant/components/bosch_shc/config_flow.py +++ b/homeassistant/components/bosch_shc/config_flow.py @@ -187,16 +187,26 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): return self.async_abort(reason="not_bosch_shc") try: - self.info = info = await self._get_info(discovery_info["host"]) + hosts = ( + discovery_info["host"] + if isinstance(discovery_info["host"], list) + else [discovery_info["host"]] + ) + for host in hosts: + if host.startswith("169."): # skip link local address + continue + self.info = await self._get_info(host) + self.host = host + if self.host is None: + return self.async_abort(reason="cannot_connect") except SHCConnectionError: return self.async_abort(reason="cannot_connect") local_name = discovery_info["hostname"][:-1] node_name = local_name[: -len(".local")] - await self.async_set_unique_id(info["unique_id"]) - self._abort_if_unique_id_configured({CONF_HOST: discovery_info["host"]}) - self.host = discovery_info["host"] + await self.async_set_unique_id(self.info["unique_id"]) + self._abort_if_unique_id_configured({CONF_HOST: self.host}) self.context["title_placeholders"] = {"name": node_name} return await self.async_step_confirm_discovery() diff --git a/tests/components/bosch_shc/test_config_flow.py b/tests/components/bosch_shc/test_config_flow.py index 6d8ef9bd32e..543d0438738 100644 --- a/tests/components/bosch_shc/test_config_flow.py +++ b/tests/components/bosch_shc/test_config_flow.py @@ -20,7 +20,7 @@ MOCK_SETTINGS = { "device": {"mac": "test-mac", "hostname": "test-host"}, } DISCOVERY_INFO = { - "host": "1.1.1.1", + "host": ["169.1.1.1", "1.1.1.1"], "port": 0, "hostname": "shc012345.local.", "type": "_http._tcp.local.", @@ -526,6 +526,28 @@ async def test_zeroconf_cannot_connect(hass, mock_zeroconf): assert result["reason"] == "cannot_connect" +async def test_zeroconf_link_local(hass, mock_zeroconf): + """Test we get the form.""" + DISCOVERY_INFO_LINK_LOCAL = { + "host": ["169.1.1.1"], + "port": 0, + "hostname": "shc012345.local.", + "type": "_http._tcp.local.", + "name": "Bosch SHC [test-mac]._http._tcp.local.", + } + + with patch( + "boschshcpy.session.SHCSession.mdns_info", side_effect=SHCConnectionError + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, + data=DISCOVERY_INFO_LINK_LOCAL, + context={"source": config_entries.SOURCE_ZEROCONF}, + ) + assert result["type"] == "abort" + assert result["reason"] == "cannot_connect" + + async def test_zeroconf_not_bosch_shc(hass, mock_zeroconf): """Test we filter out non-bosch_shc devices.""" result = await hass.config_entries.flow.async_init( From 9636799dfb67263d21cf3505eccab8e6b3fd3ddd Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 6 Oct 2021 11:33:55 +0200 Subject: [PATCH 091/162] Update frontend to 20211006.0 (#57164) --- homeassistant/components/frontend/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index 3b047fbe245..121cf6ea754 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -3,7 +3,7 @@ "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", "requirements": [ - "home-assistant-frontend==20211004.0" + "home-assistant-frontend==20211006.0" ], "dependencies": [ "api", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index a496bc80169..c263e0f4f3c 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -15,7 +15,7 @@ ciso8601==2.2.0 cryptography==3.4.8 emoji==1.5.0 hass-nabucasa==0.50.0 -home-assistant-frontend==20211004.0 +home-assistant-frontend==20211006.0 httpx==0.19.0 ifaddr==0.1.7 jinja2==3.0.1 diff --git a/requirements_all.txt b/requirements_all.txt index 74b58de7d14..92a334de096 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -810,7 +810,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211004.0 +home-assistant-frontend==20211006.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9a493f07be7..0d00bf4a27b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -485,7 +485,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211004.0 +home-assistant-frontend==20211006.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From 25fc479cd43b2d4666acc1c8a05e9262da5afa17 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 6 Oct 2021 13:29:42 +0200 Subject: [PATCH 092/162] Correct migration to recorder schema 18 (#57165) --- .../components/recorder/migration.py | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/recorder/migration.py b/homeassistant/components/recorder/migration.py index 1ced8b73207..a3d2955e55b 100644 --- a/homeassistant/components/recorder/migration.py +++ b/homeassistant/components/recorder/migration.py @@ -470,17 +470,20 @@ def _apply_update(instance, session, new_version, old_version): # noqa: C901 elif new_version == 18: # Recreate the statistics and statistics meta tables. # - # Order matters! Statistics has a relation with StatisticsMeta, - # so statistics need to be deleted before meta (or in pair depending - # on the SQL backend); and meta needs to be created before statistics. - if sqlalchemy.inspect(engine).has_table( - StatisticsMeta.__tablename__ - ) or sqlalchemy.inspect(engine).has_table(Statistics.__tablename__): - Base.metadata.drop_all( - bind=engine, tables=[Statistics.__table__, StatisticsMeta.__table__] - ) + # Order matters! Statistics and StatisticsShortTerm have a relation with + # StatisticsMeta, so statistics need to be deleted before meta (or in pair + # depending on the SQL backend); and meta needs to be created before statistics. + Base.metadata.drop_all( + bind=engine, + tables=[ + StatisticsShortTerm.__table__, + Statistics.__table__, + StatisticsMeta.__table__, + ], + ) StatisticsMeta.__table__.create(engine) + StatisticsShortTerm.__table__.create(engine) Statistics.__table__.create(engine) elif new_version == 19: # This adds the statistic runs table, insert a fake run to prevent duplicating @@ -527,23 +530,15 @@ def _apply_update(instance, session, new_version, old_version): # noqa: C901 # so statistics need to be deleted before meta (or in pair depending # on the SQL backend); and meta needs to be created before statistics. if engine.dialect.name == "oracle": - if ( - sqlalchemy.inspect(engine).has_table(StatisticsMeta.__tablename__) - or sqlalchemy.inspect(engine).has_table(Statistics.__tablename__) - or sqlalchemy.inspect(engine).has_table(StatisticsRuns.__tablename__) - or sqlalchemy.inspect(engine).has_table( - StatisticsShortTerm.__tablename__ - ) - ): - Base.metadata.drop_all( - bind=engine, - tables=[ - StatisticsShortTerm.__table__, - Statistics.__table__, - StatisticsMeta.__table__, - StatisticsRuns.__table__, - ], - ) + Base.metadata.drop_all( + bind=engine, + tables=[ + StatisticsShortTerm.__table__, + Statistics.__table__, + StatisticsMeta.__table__, + StatisticsRuns.__table__, + ], + ) StatisticsRuns.__table__.create(engine) StatisticsMeta.__table__.create(engine) From 46394b50d88d9acf5899bc17f7c7a05702dada31 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 6 Oct 2021 15:53:41 +0200 Subject: [PATCH 093/162] Bumped version to 2021.10.0 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index a6a2680eb8a..707e7d87b01 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0b9" +PATCH_VERSION: Final = "0" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 7544ec2399d8c1e297312b5b72790c9c83309775 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 7 Oct 2021 17:15:29 -1000 Subject: [PATCH 094/162] Recreate the powerwall session/object when attempting relogin (#56935) --- .../components/powerwall/__init__.py | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/powerwall/__init__.py b/homeassistant/components/powerwall/__init__.py index 5560c51f72b..2158075e5fa 100644 --- a/homeassistant/components/powerwall/__init__.py +++ b/homeassistant/components/powerwall/__init__.py @@ -91,11 +91,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: entry_id = entry.entry_id hass.data.setdefault(DOMAIN, {}) - hass.data[DOMAIN].setdefault(entry_id, {}) http_session = requests.Session() + ip_address = entry.data[CONF_IP_ADDRESS] password = entry.data.get(CONF_PASSWORD) - power_wall = Powerwall(entry.data[CONF_IP_ADDRESS], http_session=http_session) + power_wall = Powerwall(ip_address, http_session=http_session) try: powerwall_data = await hass.async_add_executor_job( _login_and_fetch_base_info, power_wall, password @@ -115,13 +115,28 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: await _migrate_old_unique_ids(hass, entry_id, powerwall_data) login_failed_count = 0 + runtime_data = hass.data[DOMAIN][entry.entry_id] = { + POWERWALL_API_CHANGED: False, + POWERWALL_HTTP_SESSION: http_session, + } + + def _recreate_powerwall_login(): + nonlocal http_session + nonlocal power_wall + http_session.close() + http_session = requests.Session() + power_wall = Powerwall(ip_address, http_session=http_session) + runtime_data[POWERWALL_OBJECT] = power_wall + runtime_data[POWERWALL_HTTP_SESSION] = http_session + power_wall.login("", password) + async def async_update_data(): """Fetch data from API endpoint.""" # Check if we had an error before nonlocal login_failed_count _LOGGER.debug("Checking if update failed") - if hass.data[DOMAIN][entry.entry_id][POWERWALL_API_CHANGED]: - return hass.data[DOMAIN][entry.entry_id][POWERWALL_COORDINATOR].data + if runtime_data[POWERWALL_API_CHANGED]: + return runtime_data[POWERWALL_COORDINATOR].data _LOGGER.debug("Updating data") try: @@ -130,9 +145,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: if password is None: raise ConfigEntryAuthFailed from err - # If the session expired, relogin, and try again + # If the session expired, recreate, relogin, and try again try: - await hass.async_add_executor_job(power_wall.login, "", password) + await hass.async_add_executor_job(_recreate_powerwall_login) return await _async_update_powerwall_data(hass, entry, power_wall) except AccessDeniedError as ex: login_failed_count += 1 @@ -153,13 +168,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: update_interval=timedelta(seconds=UPDATE_INTERVAL), ) - hass.data[DOMAIN][entry.entry_id] = powerwall_data - hass.data[DOMAIN][entry.entry_id].update( + runtime_data.update( { + **powerwall_data, POWERWALL_OBJECT: power_wall, POWERWALL_COORDINATOR: coordinator, - POWERWALL_HTTP_SESSION: http_session, - POWERWALL_API_CHANGED: False, } ) From 7f49e02a4dc063ffb0db0eee5daca5b565c746b2 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Thu, 7 Oct 2021 17:44:25 +0200 Subject: [PATCH 095/162] Update led brightness select state only if valid data is available, Xiaomi Miio integration (#57197) * Update state if there is valid data * Add comment --- homeassistant/components/xiaomi_miio/select.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/select.py b/homeassistant/components/xiaomi_miio/select.py index daa721fef95..9e9cdcec1ae 100644 --- a/homeassistant/components/xiaomi_miio/select.py +++ b/homeassistant/components/xiaomi_miio/select.py @@ -146,10 +146,14 @@ class XiaomiAirHumidifierSelector(XiaomiSelector): @callback def _handle_coordinator_update(self): """Fetch state from the device.""" - self._current_led_brightness = self._extract_value_from_attribute( + led_brightness = self._extract_value_from_attribute( self.coordinator.data, self.entity_description.key ) - self.async_write_ha_state() + # Sometimes (quite rarely) the device returns None as the LED brightness so we + # check that the value is not None before updating the state. + if led_brightness: + self._current_led_brightness = led_brightness + self.async_write_ha_state() @property def current_option(self): From 691d8d6b80c3b6b6777a16d7deea652e75710c0b Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 7 Oct 2021 16:22:33 -0400 Subject: [PATCH 096/162] Convert val to str when needed while calling zwave_js.set_value (#57216) --- homeassistant/components/zwave_js/services.py | 63 +++++++++++---- tests/components/zwave_js/test_services.py | 81 +++++++++++++++++++ 2 files changed, 130 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/zwave_js/services.py b/homeassistant/components/zwave_js/services.py index 08841465321..ac3f233ba49 100644 --- a/homeassistant/components/zwave_js/services.py +++ b/homeassistant/components/zwave_js/services.py @@ -408,7 +408,7 @@ class ZWaveServices: async def async_set_value(self, service: ServiceCall) -> None: """Set a value on a node.""" # pylint: disable=no-self-use - nodes = service.data[const.ATTR_NODES] + nodes: set[ZwaveNode] = service.data[const.ATTR_NODES] command_class = service.data[const.ATTR_COMMAND_CLASS] property_ = service.data[const.ATTR_PROPERTY] property_key = service.data.get(const.ATTR_PROPERTY_KEY) @@ -418,15 +418,27 @@ class ZWaveServices: options = service.data.get(const.ATTR_OPTIONS) for node in nodes: + value_id = get_value_id( + node, + command_class, + property_, + endpoint=endpoint, + property_key=property_key, + ) + # If value has a string type but the new value is not a string, we need to + # convert it to one. We use new variable `new_value_` to convert the data + # so we can preserve the original `new_value` for every node. + if ( + value_id in node.values + and node.values[value_id].metadata.type == "string" + and not isinstance(new_value, str) + ): + new_value_ = str(new_value) + else: + new_value_ = new_value success = await node.async_set_value( - get_value_id( - node, - command_class, - property_, - endpoint=endpoint, - property_key=property_key, - ), - new_value, + value_id, + new_value_, options=options, wait_for_result=wait_for_result, ) @@ -452,11 +464,16 @@ class ZWaveServices: await self.async_set_value(service) return + command_class = service.data[const.ATTR_COMMAND_CLASS] + property_ = service.data[const.ATTR_PROPERTY] + property_key = service.data.get(const.ATTR_PROPERTY_KEY) + endpoint = service.data.get(const.ATTR_ENDPOINT) + value = { - "commandClass": service.data[const.ATTR_COMMAND_CLASS], - "property": service.data[const.ATTR_PROPERTY], - "propertyKey": service.data.get(const.ATTR_PROPERTY_KEY), - "endpoint": service.data.get(const.ATTR_ENDPOINT), + "commandClass": command_class, + "property": property_, + "propertyKey": property_key, + "endpoint": endpoint, } new_value = service.data[const.ATTR_VALUE] @@ -464,12 +481,30 @@ class ZWaveServices: # schema validation and can use that to get the client, otherwise we can just # get the client from the node. client: ZwaveClient = None - first_node = next((node for node in nodes), None) + first_node: ZwaveNode = next((node for node in nodes), None) if first_node: client = first_node.client else: entry_id = self._hass.config_entries.async_entries(const.DOMAIN)[0].entry_id client = self._hass.data[const.DOMAIN][entry_id][const.DATA_CLIENT] + first_node = next( + node + for node in client.driver.controller.nodes.values() + if get_value_id(node, command_class, property_, endpoint, property_key) + in node.values + ) + + # If value has a string type but the new value is not a string, we need to + # convert it to one + value_id = get_value_id( + first_node, command_class, property_, endpoint, property_key + ) + if ( + value_id in first_node.values + and first_node.values[value_id].metadata.type == "string" + and not isinstance(new_value, str) + ): + new_value = str(new_value) success = await async_multicast_set_value( client=client, diff --git a/tests/components/zwave_js/test_services.py b/tests/components/zwave_js/test_services.py index 0831d08b216..571190bd35c 100644 --- a/tests/components/zwave_js/test_services.py +++ b/tests/components/zwave_js/test_services.py @@ -43,6 +43,7 @@ from .common import ( CLIMATE_DANFOSS_LC13_ENTITY, CLIMATE_EUROTRONICS_SPIRIT_Z_ENTITY, CLIMATE_RADIO_THERMOSTAT_ENTITY, + SCHLAGE_BE469_LOCK_ENTITY, ) from tests.common import MockConfigEntry @@ -1021,6 +1022,51 @@ async def test_set_value(hass, client, climate_danfoss_lc_13, integration): ) +async def test_set_value_string( + hass, client, climate_danfoss_lc_13, lock_schlage_be469, integration +): + """Test set_value service converts number to string when needed.""" + client.async_send_command.return_value = {"success": True} + + # Test that number gets converted to a string when needed + await hass.services.async_call( + DOMAIN, + SERVICE_SET_VALUE, + { + ATTR_ENTITY_ID: SCHLAGE_BE469_LOCK_ENTITY, + ATTR_COMMAND_CLASS: 99, + ATTR_PROPERTY: "userCode", + ATTR_PROPERTY_KEY: 1, + ATTR_VALUE: 12345, + }, + blocking=True, + ) + + assert len(client.async_send_command.call_args_list) == 1 + args = client.async_send_command.call_args[0][0] + assert args["command"] == "node.set_value" + assert args["nodeId"] == lock_schlage_be469.node_id + assert args["valueId"] == { + "commandClassName": "User Code", + "commandClass": 99, + "endpoint": 0, + "property": "userCode", + "propertyName": "userCode", + "propertyKey": 1, + "propertyKeyName": "1", + "metadata": { + "type": "string", + "readable": True, + "writeable": True, + "minLength": 4, + "maxLength": 10, + "label": "User Code (1)", + }, + "value": "**********", + } + assert args["value"] == "12345" + + async def test_set_value_options(hass, client, aeon_smart_switch_6, integration): """Test set_value service with options.""" await hass.services.async_call( @@ -1381,6 +1427,41 @@ async def test_multicast_set_value_options( client.async_send_command.reset_mock() +async def test_multicast_set_value_string( + hass, + client, + lock_id_lock_as_id150, + lock_schlage_be469, + integration, +): + """Test multicast_set_value service converts number to string when needed.""" + client.async_send_command.return_value = {"success": True} + + # Test that number gets converted to a string when needed + await hass.services.async_call( + DOMAIN, + SERVICE_MULTICAST_SET_VALUE, + { + ATTR_BROADCAST: True, + ATTR_COMMAND_CLASS: 99, + ATTR_PROPERTY: "userCode", + ATTR_PROPERTY_KEY: 1, + ATTR_VALUE: 12345, + }, + blocking=True, + ) + + assert len(client.async_send_command.call_args_list) == 1 + args = client.async_send_command.call_args[0][0] + assert args["command"] == "broadcast_node.set_value" + assert args["valueId"] == { + "commandClass": 99, + "property": "userCode", + "propertyKey": 1, + } + assert args["value"] == "12345" + + async def test_ping( hass, client, From bf4a3d8d35d845c0d39b2621d1ae325c5a7639c5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 7 Oct 2021 05:52:24 -1000 Subject: [PATCH 097/162] Discover tplink devices periodically (#57221) - These devices sometimes do not respond on the first try or may be subject to transient broadcast failures, or overloads. We now try discovery periodically once the integration has been loaded. - We used to try this 4x at startup, but that solution seemed to aggressive as we want to be sure we pickup the devices after startup as well since the network will likely be more calm after startup. --- homeassistant/components/tplink/__init__.py | 18 +++++++++++++++- tests/components/tplink/test_init.py | 24 ++++++++++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/tplink/__init__.py b/homeassistant/components/tplink/__init__.py index 5c40f61e2df..9f3658cf2cd 100644 --- a/homeassistant/components/tplink/__init__.py +++ b/homeassistant/components/tplink/__init__.py @@ -2,6 +2,7 @@ from __future__ import annotations import asyncio +from datetime import timedelta from typing import Any from kasa import SmartDevice, SmartDeviceException @@ -11,9 +12,15 @@ import voluptuous as vol from homeassistant import config_entries from homeassistant.components import network from homeassistant.config_entries import ConfigEntry, ConfigEntryNotReady -from homeassistant.const import CONF_HOST, CONF_MAC, CONF_NAME +from homeassistant.const import ( + CONF_HOST, + CONF_MAC, + CONF_NAME, + EVENT_HOMEASSISTANT_STARTED, +) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import config_validation as cv, device_registry as dr +from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.typing import ConfigType from .const import ( @@ -32,6 +39,8 @@ from .migration import ( async_migrate_yaml_entries, ) +DISCOVERY_INTERVAL = timedelta(minutes=15) + TPLINK_HOST_SCHEMA = vol.Schema({vol.Required(CONF_HOST): cv.string}) CONFIG_SCHEMA = vol.Schema( @@ -118,6 +127,13 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: if discovered_devices: async_trigger_discovery(hass, discovered_devices) + async def _async_discovery(*_: Any) -> None: + if discovered := await async_discover_devices(hass): + async_trigger_discovery(hass, discovered) + + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, _async_discovery) + async_track_time_interval(hass, _async_discovery, DISCOVERY_INTERVAL) + return True diff --git a/tests/components/tplink/test_init.py b/tests/components/tplink/test_init.py index c3f7e814ed6..c166fccc9b5 100644 --- a/tests/components/tplink/test_init.py +++ b/tests/components/tplink/test_init.py @@ -1,27 +1,41 @@ """Tests for the TP-Link component.""" from __future__ import annotations -from unittest.mock import patch +from datetime import timedelta +from unittest.mock import MagicMock, patch from homeassistant.components import tplink from homeassistant.components.tplink.const import DOMAIN from homeassistant.config_entries import ConfigEntryState -from homeassistant.const import CONF_HOST +from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STARTED from homeassistant.setup import async_setup_component +from homeassistant.util import dt as dt_util from . import IP_ADDRESS, MAC_ADDRESS, _patch_discovery, _patch_single_discovery -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, async_fire_time_changed async def test_configuring_tplink_causes_discovery(hass): """Test that specifying empty config does discovery.""" with patch("homeassistant.components.tplink.Discover.discover") as discover: - discover.return_value = {"host": 1234} + discover.return_value = {MagicMock(): MagicMock()} await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}}) await hass.async_block_till_done() + call_count = len(discover.mock_calls) + assert discover.mock_calls - assert len(discover.mock_calls) == 1 + hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED) + await hass.async_block_till_done() + assert len(discover.mock_calls) == call_count * 2 + + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=15)) + await hass.async_block_till_done() + assert len(discover.mock_calls) == call_count * 3 + + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=30)) + await hass.async_block_till_done() + assert len(discover.mock_calls) == call_count * 4 async def test_config_entry_reload(hass): From 06befe906b2c8690dda7de8b632ceb94bf37624a Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 7 Oct 2021 22:23:23 +0200 Subject: [PATCH 098/162] Correct SQL query generated by get_metadata_with_session (#57225) Co-authored-by: Franck Nijhof --- homeassistant/components/recorder/statistics.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/recorder/statistics.py b/homeassistant/components/recorder/statistics.py index 7b7e349b843..d253d1e2275 100644 --- a/homeassistant/components/recorder/statistics.py +++ b/homeassistant/components/recorder/statistics.py @@ -13,6 +13,7 @@ from sqlalchemy import bindparam, func from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.ext import baked from sqlalchemy.orm.scoping import scoped_session +from sqlalchemy.sql.expression import true from homeassistant.const import ( PRESSURE_PA, @@ -396,9 +397,9 @@ def get_metadata_with_session( StatisticsMeta.statistic_id.in_(bindparam("statistic_ids")) ) if statistic_type == "mean": - baked_query += lambda q: q.filter(StatisticsMeta.has_mean.isnot(False)) + baked_query += lambda q: q.filter(StatisticsMeta.has_mean == true()) elif statistic_type == "sum": - baked_query += lambda q: q.filter(StatisticsMeta.has_sum.isnot(False)) + baked_query += lambda q: q.filter(StatisticsMeta.has_sum == true()) result = execute(baked_query(session).params(statistic_ids=statistic_ids)) if not result: return {} From 0b26b1574998de243a31b47709c669b3edba5a91 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Thu, 7 Oct 2021 15:08:53 +0200 Subject: [PATCH 099/162] Fix netgear config flow import (#57253) --- homeassistant/components/netgear/device_tracker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/netgear/device_tracker.py b/homeassistant/components/netgear/device_tracker.py index f568a506552..0d3a1098f0c 100644 --- a/homeassistant/components/netgear/device_tracker.py +++ b/homeassistant/components/netgear/device_tracker.py @@ -4,6 +4,7 @@ import logging import voluptuous as vol from homeassistant.components.device_tracker import ( + DOMAIN as DEVICE_TRACKER_DOMAIN, PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA, SOURCE_TYPE_ROUTER, ) @@ -50,7 +51,7 @@ async def async_get_scanner(hass, config): hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_IMPORT}, - data=config, + data=config[DEVICE_TRACKER_DOMAIN], ) ) From 425015eb8b9e92215f3249e0bd83874e13339aa5 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 7 Oct 2021 17:13:07 +0200 Subject: [PATCH 100/162] Validate initial value for input_datetime (#57256) --- .../components/input_datetime/__init__.py | 25 +++++++++++++++++ tests/components/input_datetime/test_init.py | 27 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/homeassistant/components/input_datetime/__init__.py b/homeassistant/components/input_datetime/__init__.py index 84a7fb89fe1..2713eef17f8 100644 --- a/homeassistant/components/input_datetime/__init__.py +++ b/homeassistant/components/input_datetime/__init__.py @@ -81,6 +81,30 @@ def has_date_or_time(conf): raise vol.Invalid("Entity needs at least a date or a time") +def valid_initial(conf): + """Check the initial value is valid.""" + initial = conf.get(CONF_INITIAL) + if not initial: + return conf + + if conf[CONF_HAS_DATE] and conf[CONF_HAS_TIME]: + parsed_value = dt_util.parse_datetime(initial) + if parsed_value is not None: + return conf + raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a datetime") + + if conf[CONF_HAS_DATE]: + parsed_value = dt_util.parse_date(initial) + if parsed_value is not None: + return conf + raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a date") + + parsed_value = dt_util.parse_time(initial) + if parsed_value is not None: + return conf + raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a time") + + CONFIG_SCHEMA = vol.Schema( { DOMAIN: cv.schema_with_slug_keys( @@ -93,6 +117,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_INITIAL): cv.string, }, has_date_or_time, + valid_initial, ) ) }, diff --git a/tests/components/input_datetime/test_init.py b/tests/components/input_datetime/test_init.py index 39497e1164c..0a968caf67f 100644 --- a/tests/components/input_datetime/test_init.py +++ b/tests/components/input_datetime/test_init.py @@ -744,3 +744,30 @@ async def test_timestamp(hass): finally: dt_util.set_default_time_zone(ORIG_TIMEZONE) + + +@pytest.mark.parametrize( + "config, error", + [ + ( + {"has_time": True, "has_date": True, "initial": "abc"}, + "'abc' can't be parsed as a datetime", + ), + ( + {"has_time": False, "has_date": True, "initial": "abc"}, + "'abc' can't be parsed as a date", + ), + ( + {"has_time": True, "has_date": False, "initial": "abc"}, + "'abc' can't be parsed as a time", + ), + ], +) +async def test_invalid_initial(hass, caplog, config, error): + """Test configuration is rejected if the initial value is invalid.""" + assert not await async_setup_component( + hass, + DOMAIN, + {DOMAIN: {"test_date": config}}, + ) + assert error in caplog.text From ec0256e27f152fa191c4ac41798c5be7ddc4c07a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Thu, 7 Oct 2021 18:23:03 +0200 Subject: [PATCH 101/162] Bump Mill library to 0.6.1 (#57261) --- homeassistant/components/mill/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/mill/manifest.json b/homeassistant/components/mill/manifest.json index bf332487a88..e5dbbdfc1e8 100644 --- a/homeassistant/components/mill/manifest.json +++ b/homeassistant/components/mill/manifest.json @@ -2,7 +2,7 @@ "domain": "mill", "name": "Mill", "documentation": "https://www.home-assistant.io/integrations/mill", - "requirements": ["millheater==0.6.0"], + "requirements": ["millheater==0.6.1"], "codeowners": ["@danielhiversen"], "config_flow": true, "iot_class": "cloud_polling" diff --git a/requirements_all.txt b/requirements_all.txt index 92a334de096..c27afae95f6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1005,7 +1005,7 @@ micloud==0.3 miflora==0.7.0 # homeassistant.components.mill -millheater==0.6.0 +millheater==0.6.1 # homeassistant.components.minio minio==4.0.9 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0d00bf4a27b..8c0570c4f5d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -585,7 +585,7 @@ mficlient==0.3.0 micloud==0.3 # homeassistant.components.mill -millheater==0.6.0 +millheater==0.6.1 # homeassistant.components.minio minio==4.0.9 From fd371f2887babfad03e5e7726028d98ee5e2f6d3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 7 Oct 2021 10:14:14 -1000 Subject: [PATCH 102/162] Fix RGB only (no color temp) devices with tplink (#57267) --- homeassistant/components/tplink/light.py | 2 +- tests/components/tplink/test_light.py | 57 ++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index f1d936ecdfe..f0e911ea412 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -145,7 +145,7 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): def color_mode(self) -> str | None: """Return the active color mode.""" if self.device.is_color: - if self.device.color_temp: + if self.device.is_variable_color_temp and self.device.color_temp: return COLOR_MODE_COLOR_TEMP return COLOR_MODE_HS if self.device.is_variable_color_temp: diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index 19116005c37..501221f5a6f 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -1,5 +1,7 @@ """Tests for light platform.""" +from unittest.mock import PropertyMock + import pytest from homeassistant.components import tplink @@ -117,6 +119,61 @@ async def test_color_light(hass: HomeAssistant) -> None: bulb.set_hsv.reset_mock() +async def test_color_light_no_temp(hass: HomeAssistant) -> None: + """Test a light.""" + already_migrated_config_entry = MockConfigEntry( + domain=DOMAIN, data={}, unique_id=MAC_ADDRESS + ) + already_migrated_config_entry.add_to_hass(hass) + bulb = _mocked_bulb() + bulb.is_variable_color_temp = False + type(bulb).color_temp = PropertyMock(side_effect=Exception) + with _patch_discovery(device=bulb), _patch_single_discovery(device=bulb): + await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}}) + await hass.async_block_till_done() + + entity_id = "light.my_bulb" + + state = hass.states.get(entity_id) + assert state.state == "on" + attributes = state.attributes + assert attributes[ATTR_BRIGHTNESS] == 128 + assert attributes[ATTR_COLOR_MODE] == "hs" + assert attributes[ATTR_SUPPORTED_COLOR_MODES] == ["brightness", "hs"] + assert attributes[ATTR_HS_COLOR] == (10, 30) + assert attributes[ATTR_RGB_COLOR] == (255, 191, 178) + assert attributes[ATTR_XY_COLOR] == (0.42, 0.336) + + await hass.services.async_call( + LIGHT_DOMAIN, "turn_off", {ATTR_ENTITY_ID: entity_id}, blocking=True + ) + bulb.turn_off.assert_called_once() + + await hass.services.async_call( + LIGHT_DOMAIN, "turn_on", {ATTR_ENTITY_ID: entity_id}, blocking=True + ) + bulb.turn_on.assert_called_once() + bulb.turn_on.reset_mock() + + await hass.services.async_call( + LIGHT_DOMAIN, + "turn_on", + {ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100}, + blocking=True, + ) + bulb.set_brightness.assert_called_with(39, transition=None) + bulb.set_brightness.reset_mock() + + await hass.services.async_call( + LIGHT_DOMAIN, + "turn_on", + {ATTR_ENTITY_ID: entity_id, ATTR_HS_COLOR: (10, 30)}, + blocking=True, + ) + bulb.set_hsv.assert_called_with(10, 30, None, transition=None) + bulb.set_hsv.reset_mock() + + @pytest.mark.parametrize("is_color", [True, False]) async def test_color_temp_light(hass: HomeAssistant, is_color: bool) -> None: """Test a light.""" From 4e49e3a3fb1df82c5bc8e9787525d331ff37d62d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 7 Oct 2021 22:18:12 +0200 Subject: [PATCH 103/162] Update frontend to 20211007.0 (#57268) --- homeassistant/components/frontend/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index 121cf6ea754..f36d72a967c 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -3,7 +3,7 @@ "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", "requirements": [ - "home-assistant-frontend==20211006.0" + "home-assistant-frontend==20211007.0" ], "dependencies": [ "api", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index c263e0f4f3c..35d5649a1b4 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -15,7 +15,7 @@ ciso8601==2.2.0 cryptography==3.4.8 emoji==1.5.0 hass-nabucasa==0.50.0 -home-assistant-frontend==20211006.0 +home-assistant-frontend==20211007.0 httpx==0.19.0 ifaddr==0.1.7 jinja2==3.0.1 diff --git a/requirements_all.txt b/requirements_all.txt index c27afae95f6..0efe1bc5eea 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -810,7 +810,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211006.0 +home-assistant-frontend==20211007.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 8c0570c4f5d..9c1defe013f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -485,7 +485,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211006.0 +home-assistant-frontend==20211007.0 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From e3e64130f1aab3b4e72bb4e84374c11e7b61ecff Mon Sep 17 00:00:00 2001 From: Teemu R Date: Fri, 8 Oct 2021 00:20:26 +0200 Subject: [PATCH 104/162] Fix transition handling for tplink lights (#57272) * Fix transition handling for tplink light * Apply suggestions from code review * Test that all transitions are passed correctly * Fix linting Co-authored-by: Paulus Schoutsen --- homeassistant/components/tplink/light.py | 8 +++-- tests/components/tplink/test_light.py | 42 +++++++++++++++--------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index f0e911ea412..49e8adbf08e 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -63,7 +63,9 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): @async_refresh_after async def async_turn_on(self, **kwargs: Any) -> None: """Turn the light on.""" - transition = kwargs.get(ATTR_TRANSITION) + if (transition := kwargs.get(ATTR_TRANSITION)) is not None: + transition = int(transition * 1_000) + if (brightness := kwargs.get(ATTR_BRIGHTNESS)) is not None: brightness = round((brightness * 100.0) / 255.0) @@ -92,7 +94,9 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): @async_refresh_after async def async_turn_off(self, **kwargs: Any) -> None: """Turn the light off.""" - await self.device.turn_off(transition=kwargs.get(ATTR_TRANSITION)) + if (transition := kwargs.get(ATTR_TRANSITION)) is not None: + transition = int(transition * 1_000) + await self.device.turn_off(transition=transition) @property def min_mireds(self) -> int: diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index 501221f5a6f..93d8cdbf07d 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -1,5 +1,6 @@ """Tests for light platform.""" +from typing import Optional from unittest.mock import PropertyMock import pytest @@ -14,6 +15,7 @@ from homeassistant.components.light import ( ATTR_MIN_MIREDS, ATTR_RGB_COLOR, ATTR_SUPPORTED_COLOR_MODES, + ATTR_TRANSITION, ATTR_XY_COLOR, DOMAIN as LIGHT_DOMAIN, ) @@ -45,8 +47,9 @@ async def test_light_unique_id(hass: HomeAssistant) -> None: assert entity_registry.async_get(entity_id).unique_id == "AABBCCDDEEFF" -async def test_color_light(hass: HomeAssistant) -> None: - """Test a light.""" +@pytest.mark.parametrize("transition", [2.0, None]) +async def test_color_light(hass: HomeAssistant, transition: Optional[float]) -> None: + """Test a color light and that all transitions are correctly passed.""" already_migrated_config_entry = MockConfigEntry( domain=DOMAIN, data={}, unique_id=MAC_ADDRESS ) @@ -58,6 +61,11 @@ async def test_color_light(hass: HomeAssistant) -> None: await hass.async_block_till_done() entity_id = "light.my_bulb" + KASA_TRANSITION_VALUE = transition * 1_000 if transition is not None else None + + BASE_PAYLOAD = {ATTR_ENTITY_ID: entity_id} + if transition: + BASE_PAYLOAD[ATTR_TRANSITION] = transition state = hass.states.get(entity_id) assert state.state == "on" @@ -72,50 +80,52 @@ async def test_color_light(hass: HomeAssistant) -> None: assert attributes[ATTR_XY_COLOR] == (0.42, 0.336) await hass.services.async_call( - LIGHT_DOMAIN, "turn_off", {ATTR_ENTITY_ID: entity_id}, blocking=True + LIGHT_DOMAIN, "turn_off", BASE_PAYLOAD, blocking=True ) - bulb.turn_off.assert_called_once() + bulb.turn_off.assert_called_once_with(transition=KASA_TRANSITION_VALUE) - await hass.services.async_call( - LIGHT_DOMAIN, "turn_on", {ATTR_ENTITY_ID: entity_id}, blocking=True - ) - bulb.turn_on.assert_called_once() + await hass.services.async_call(LIGHT_DOMAIN, "turn_on", BASE_PAYLOAD, blocking=True) + bulb.turn_on.assert_called_once_with(transition=KASA_TRANSITION_VALUE) bulb.turn_on.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100}, + {**BASE_PAYLOAD, ATTR_BRIGHTNESS: 100}, blocking=True, ) - bulb.set_brightness.assert_called_with(39, transition=None) + bulb.set_brightness.assert_called_with(39, transition=KASA_TRANSITION_VALUE) bulb.set_brightness.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 150}, + {**BASE_PAYLOAD, ATTR_COLOR_TEMP: 150}, blocking=True, ) - bulb.set_color_temp.assert_called_with(6666, brightness=None, transition=None) + bulb.set_color_temp.assert_called_with( + 6666, brightness=None, transition=KASA_TRANSITION_VALUE + ) bulb.set_color_temp.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 150}, + {**BASE_PAYLOAD, ATTR_COLOR_TEMP: 150}, blocking=True, ) - bulb.set_color_temp.assert_called_with(6666, brightness=None, transition=None) + bulb.set_color_temp.assert_called_with( + 6666, brightness=None, transition=KASA_TRANSITION_VALUE + ) bulb.set_color_temp.reset_mock() await hass.services.async_call( LIGHT_DOMAIN, "turn_on", - {ATTR_ENTITY_ID: entity_id, ATTR_HS_COLOR: (10, 30)}, + {**BASE_PAYLOAD, ATTR_HS_COLOR: (10, 30)}, blocking=True, ) - bulb.set_hsv.assert_called_with(10, 30, None, transition=None) + bulb.set_hsv.assert_called_with(10, 30, None, transition=KASA_TRANSITION_VALUE) bulb.set_hsv.reset_mock() From ef7f1ffddc426f6318be735c8b180cf1304ee6ef Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 7 Oct 2021 17:06:27 -1000 Subject: [PATCH 105/162] Bump HAP-python to 4.30 (#57284) --- homeassistant/components/homekit/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/homekit/test_type_fans.py | 6 +++--- tests/components/homekit/test_type_media_players.py | 7 +++++-- tests/components/homekit/test_type_remote.py | 7 +++++-- tests/components/homekit/test_type_thermostats.py | 6 +----- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index 2589a1ac6ec..d23aa11b4ea 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -3,7 +3,7 @@ "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", "requirements": [ - "HAP-python==4.2.1", + "HAP-python==4.3.0", "fnvhash==0.1.0", "PyQRCode==1.2.1", "base36==0.1.1" diff --git a/requirements_all.txt b/requirements_all.txt index 0efe1bc5eea..7a0fc0e32f3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -14,7 +14,7 @@ Adafruit-SHT31==1.0.2 # Adafruit_BBIO==1.1.1 # homeassistant.components.homekit -HAP-python==4.2.1 +HAP-python==4.3.0 # homeassistant.components.mastodon Mastodon.py==1.5.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9c1defe013f..54082e2a361 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -7,7 +7,7 @@ AEMET-OpenData==0.2.1 # homeassistant.components.homekit -HAP-python==4.2.1 +HAP-python==4.3.0 # homeassistant.components.flick_electric PyFlick==0.0.2 diff --git a/tests/components/homekit/test_type_fans.py b/tests/components/homekit/test_type_fans.py index 15e2366a883..85d00dcb287 100644 --- a/tests/components/homekit/test_type_fans.py +++ b/tests/components/homekit/test_type_fans.py @@ -297,7 +297,7 @@ async def test_fan_speed(hass, hk_driver, events): ) await hass.async_add_executor_job(acc.char_speed.client_update_value, 42) await hass.async_block_till_done() - assert acc.char_speed.value == 42 + assert acc.char_speed.value == 50 assert acc.char_active.value == 1 assert call_set_percentage[0] @@ -309,7 +309,7 @@ async def test_fan_speed(hass, hk_driver, events): # Verify speed is preserved from off to on hass.states.async_set(entity_id, STATE_OFF, {ATTR_PERCENTAGE: 42}) await hass.async_block_till_done() - assert acc.char_speed.value == 42 + assert acc.char_speed.value == 50 assert acc.char_active.value == 0 hk_driver.set_characteristics( @@ -325,7 +325,7 @@ async def test_fan_speed(hass, hk_driver, events): "mock_addr", ) await hass.async_block_till_done() - assert acc.char_speed.value == 42 + assert acc.char_speed.value == 50 assert acc.char_active.value == 1 diff --git a/tests/components/homekit/test_type_media_players.py b/tests/components/homekit/test_type_media_players.py index 33cac7bcf8a..c0184667e2c 100644 --- a/tests/components/homekit/test_type_media_players.py +++ b/tests/components/homekit/test_type_media_players.py @@ -1,5 +1,7 @@ """Test different accessory types: Media Players.""" +import pytest + from homeassistant.components.homekit.const import ( ATTR_KEY_NAME, ATTR_VALUE, @@ -353,8 +355,9 @@ async def test_media_player_television(hass, hk_driver, events, caplog): hass.bus.async_listen(EVENT_HOMEKIT_TV_REMOTE_KEY_PRESSED, listener) - await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 20) - await hass.async_block_till_done() + with pytest.raises(ValueError): + await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 20) + await hass.async_block_till_done() await hass.async_add_executor_job(acc.char_remote_key.client_update_value, 7) await hass.async_block_till_done() diff --git a/tests/components/homekit/test_type_remote.py b/tests/components/homekit/test_type_remote.py index ee71d7f4e3c..5c5b5ee6cd9 100644 --- a/tests/components/homekit/test_type_remote.py +++ b/tests/components/homekit/test_type_remote.py @@ -1,5 +1,7 @@ """Test different accessory types: Remotes.""" +import pytest + from homeassistant.components.homekit.const import ( ATTR_KEY_NAME, ATTR_VALUE, @@ -140,8 +142,9 @@ async def test_activity_remote(hass, hk_driver, events, caplog): hass.bus.async_listen(EVENT_HOMEKIT_TV_REMOTE_KEY_PRESSED, listener) - acc.char_remote_key.client_update_value(20) - await hass.async_block_till_done() + with pytest.raises(ValueError): + acc.char_remote_key.client_update_value(20) + await hass.async_block_till_done() acc.char_remote_key.client_update_value(7) await hass.async_block_till_done() diff --git a/tests/components/homekit/test_type_thermostats.py b/tests/components/homekit/test_type_thermostats.py index e73465b0ab0..ef517f4ab96 100644 --- a/tests/components/homekit/test_type_thermostats.py +++ b/tests/components/homekit/test_type_thermostats.py @@ -1746,11 +1746,7 @@ async def test_water_heater(hass, hk_driver, events): assert len(events) == 1 assert events[-1].data[ATTR_VALUE] == f"52.0{TEMP_CELSIUS}" - await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 0) - await hass.async_block_till_done() - assert acc.char_target_heat_cool.value == 1 - - await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 2) + await hass.async_add_executor_job(acc.char_target_heat_cool.client_update_value, 1) await hass.async_block_till_done() assert acc.char_target_heat_cool.value == 1 From ed4b44c1269e760e6f0ad6aae8cae08feaefb738 Mon Sep 17 00:00:00 2001 From: Teemu R Date: Fri, 8 Oct 2021 05:15:13 +0200 Subject: [PATCH 106/162] Stopgap fix for inconsistent upstream API of tplink dimmers (#57285) --- homeassistant/components/tplink/light.py | 8 ++++++++ tests/components/tplink/__init__.py | 1 + tests/components/tplink/test_light.py | 26 ++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 49e8adbf08e..3f4b130a5cc 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -69,6 +69,14 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): if (brightness := kwargs.get(ATTR_BRIGHTNESS)) is not None: brightness = round((brightness * 100.0) / 255.0) + if self.device.is_dimmer and transition is None: + # This is a stopgap solution for inconsistent set_brightness handling + # in the upstream library, see #57265. + # This should be removed when the upstream has fixed the issue. + # The device logic is to change the settings without turning it on + # except when transition is defined, so we leverage that here for now. + transition = 1 + # Handle turning to temp mode if ATTR_COLOR_TEMP in kwargs: color_tmp = mired_to_kelvin(int(kwargs[ATTR_COLOR_TEMP])) diff --git a/tests/components/tplink/__init__.py b/tests/components/tplink/__init__.py index 870e05e970b..f25fc13784a 100644 --- a/tests/components/tplink/__init__.py +++ b/tests/components/tplink/__init__.py @@ -33,6 +33,7 @@ def _mocked_bulb() -> SmartBulb: bulb.is_color = True bulb.is_strip = False bulb.is_plug = False + bulb.is_dimmer = False bulb.hsv = (10, 30, 5) bulb.device_id = MAC_ADDRESS bulb.valid_temperature_range.min = 4000 diff --git a/tests/components/tplink/test_light.py b/tests/components/tplink/test_light.py index 93d8cdbf07d..1017ad38eae 100644 --- a/tests/components/tplink/test_light.py +++ b/tests/components/tplink/test_light.py @@ -349,3 +349,29 @@ async def test_off_at_start_light(hass: HomeAssistant) -> None: assert state.state == "off" attributes = state.attributes assert attributes[ATTR_SUPPORTED_COLOR_MODES] == ["onoff"] + + +async def test_dimmer_turn_on_fix(hass: HomeAssistant) -> None: + """Test a light.""" + already_migrated_config_entry = MockConfigEntry( + domain=DOMAIN, data={}, unique_id=MAC_ADDRESS + ) + already_migrated_config_entry.add_to_hass(hass) + bulb = _mocked_bulb() + bulb.is_dimmer = True + bulb.is_on = False + + with _patch_discovery(device=bulb), _patch_single_discovery(device=bulb): + await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}}) + await hass.async_block_till_done() + + entity_id = "light.my_bulb" + + state = hass.states.get(entity_id) + assert state.state == "off" + + await hass.services.async_call( + LIGHT_DOMAIN, "turn_on", {ATTR_ENTITY_ID: entity_id}, blocking=True + ) + bulb.turn_on.assert_called_once_with(transition=1) + bulb.turn_on.reset_mock() From 1a376b25afa55177959d1714e586ea81106cc484 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 7 Oct 2021 14:48:08 -1000 Subject: [PATCH 107/162] Bump yeelight to 0.7.7 (#57290) --- homeassistant/components/yeelight/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/yeelight/manifest.json b/homeassistant/components/yeelight/manifest.json index 561606f5509..1b8c959cb52 100644 --- a/homeassistant/components/yeelight/manifest.json +++ b/homeassistant/components/yeelight/manifest.json @@ -2,7 +2,7 @@ "domain": "yeelight", "name": "Yeelight", "documentation": "https://www.home-assistant.io/integrations/yeelight", - "requirements": ["yeelight==0.7.6", "async-upnp-client==0.22.5"], + "requirements": ["yeelight==0.7.7", "async-upnp-client==0.22.5"], "codeowners": ["@rytilahti", "@zewelor", "@shenxn", "@starkillerOG"], "config_flow": true, "dependencies": ["network"], diff --git a/requirements_all.txt b/requirements_all.txt index 7a0fc0e32f3..1d3667d04b2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2459,7 +2459,7 @@ yalesmartalarmclient==0.3.4 yalexs==1.1.13 # homeassistant.components.yeelight -yeelight==0.7.6 +yeelight==0.7.7 # homeassistant.components.yeelightsunflower yeelightsunflower==0.0.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 54082e2a361..3ddd959692f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1403,7 +1403,7 @@ yalesmartalarmclient==0.3.4 yalexs==1.1.13 # homeassistant.components.yeelight -yeelight==0.7.6 +yeelight==0.7.7 # homeassistant.components.youless youless-api==0.13 From 387249b59327e6cf69c83ac02afdfdbb96f902e7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 7 Oct 2021 20:19:53 -0700 Subject: [PATCH 108/162] Bumped version to 2021.10.1 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 707e7d87b01..c8ddfb2f4d3 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "0" +PATCH_VERSION: Final = "1" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From c6d506cb4f4b70bd84a50a4630202c86e6cf0d50 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Fri, 8 Oct 2021 18:03:21 +0200 Subject: [PATCH 109/162] Netgear fix port and device model beeing overwritten (#57277) Co-authored-by: Martin Hjelmare --- homeassistant/components/netgear/config_flow.py | 11 +++++++++-- homeassistant/components/netgear/router.py | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/netgear/config_flow.py b/homeassistant/components/netgear/config_flow.py index 18813ac27cd..62985c7104c 100644 --- a/homeassistant/components/netgear/config_flow.py +++ b/homeassistant/components/netgear/config_flow.py @@ -1,4 +1,5 @@ """Config flow to configure the Netgear integration.""" +import logging from urllib.parse import urlparse from pynetgear import DEFAULT_HOST, DEFAULT_PORT, DEFAULT_USER @@ -20,6 +21,8 @@ from .const import CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME, DEFAULT_NAME, DOMA from .errors import CannotLoginException from .router import get_api +_LOGGER = logging.getLogger(__name__) + def _discovery_schema_with_defaults(discovery_info): return vol.Schema(_ordered_shared_schema(discovery_info)) @@ -120,15 +123,19 @@ class NetgearFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): device_url = urlparse(discovery_info[ssdp.ATTR_SSDP_LOCATION]) if device_url.hostname: updated_data[CONF_HOST] = device_url.hostname - if device_url.port: - updated_data[CONF_PORT] = device_url.port if device_url.scheme == "https": updated_data[CONF_SSL] = True else: updated_data[CONF_SSL] = False + _LOGGER.debug("Netgear ssdp discovery info: %s", discovery_info) + await self.async_set_unique_id(discovery_info[ssdp.ATTR_UPNP_SERIAL]) self._abort_if_unique_id_configured(updates=updated_data) + + if device_url.port: + updated_data[CONF_PORT] = device_url.port + self.placeholders.update(updated_data) self.discovered = True diff --git a/homeassistant/components/netgear/router.py b/homeassistant/components/netgear/router.py index 53cc4f32728..cc508f043ff 100644 --- a/homeassistant/components/netgear/router.py +++ b/homeassistant/components/netgear/router.py @@ -274,8 +274,8 @@ class NetgearDeviceEntity(Entity): """Return the device information.""" return { "connections": {(CONNECTION_NETWORK_MAC, self._mac)}, - "name": self._device_name, - "model": self._device["device_model"], + "default_name": self._device_name, + "default_model": self._device["device_model"], "via_device": (DOMAIN, self._router.unique_id), } From 1a78c461a0dcf6895646086c7863889c78f95f03 Mon Sep 17 00:00:00 2001 From: Milan Meulemans Date: Fri, 8 Oct 2021 18:02:01 +0200 Subject: [PATCH 110/162] Fix Nanoleaf light turn_off transition (#57305) --- homeassistant/components/nanoleaf/light.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/nanoleaf/light.py b/homeassistant/components/nanoleaf/light.py index 5902beba226..23d9032ff07 100644 --- a/homeassistant/components/nanoleaf/light.py +++ b/homeassistant/components/nanoleaf/light.py @@ -168,8 +168,8 @@ class NanoleafLight(LightEntity): async def async_turn_off(self, **kwargs): """Instruct the light to turn off.""" - transition = kwargs.get(ATTR_TRANSITION) - await self._nanoleaf.turn_off(transition) + transition: float | None = kwargs.get(ATTR_TRANSITION) + await self._nanoleaf.turn_off(None if transition is None else int(transition)) async def async_update(self) -> None: """Fetch new state data for this light.""" From 0358a13536e0c0df809c673acced86fea656343f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 8 Oct 2021 05:58:18 -1000 Subject: [PATCH 111/162] Migrate tplink hosts that were previously imported from yaml (#57308) --- homeassistant/components/tplink/__init__.py | 2 ++ homeassistant/components/tplink/migration.py | 6 +++++- tests/components/tplink/test_migration.py | 22 ++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/tplink/__init__.py b/homeassistant/components/tplink/__init__.py index 9f3658cf2cd..ff0526490f5 100644 --- a/homeassistant/components/tplink/__init__.py +++ b/homeassistant/components/tplink/__init__.py @@ -120,6 +120,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async_migrate_legacy_entries( hass, hosts_by_mac, config_entries_by_mac, legacy_entry ) + # Migrate the yaml entry that was previously imported + async_migrate_yaml_entries(hass, legacy_entry.data) if conf is not None: async_migrate_yaml_entries(hass, conf) diff --git a/homeassistant/components/tplink/migration.py b/homeassistant/components/tplink/migration.py index af81323d39f..9344dd1532f 100644 --- a/homeassistant/components/tplink/migration.py +++ b/homeassistant/components/tplink/migration.py @@ -2,6 +2,8 @@ from __future__ import annotations from datetime import datetime +from types import MappingProxyType +from typing import Any from homeassistant import config_entries from homeassistant.config_entries import ConfigEntry @@ -65,7 +67,9 @@ def async_migrate_legacy_entries( @callback -def async_migrate_yaml_entries(hass: HomeAssistant, conf: ConfigType) -> None: +def async_migrate_yaml_entries( + hass: HomeAssistant, conf: ConfigType | MappingProxyType[str, Any] +) -> None: """Migrate yaml to config entries.""" for device_type in (CONF_LIGHT, CONF_SWITCH, CONF_STRIP, CONF_DIMMER): for device in conf.get(device_type, []): diff --git a/tests/components/tplink/test_migration.py b/tests/components/tplink/test_migration.py index 6cd82448ca2..a1cd581e211 100644 --- a/tests/components/tplink/test_migration.py +++ b/tests/components/tplink/test_migration.py @@ -239,3 +239,25 @@ async def test_migrate_from_yaml(hass: HomeAssistant): assert migrated_entry is not None assert migrated_entry.data[CONF_HOST] == IP_ADDRESS + + +async def test_migrate_from_legacy_entry(hass: HomeAssistant): + """Test migrate from legacy entry that was already imported from yaml.""" + data = { + CONF_DISCOVERY: False, + CONF_SWITCH: [{CONF_HOST: IP_ADDRESS}], + } + config_entry = MockConfigEntry(domain=DOMAIN, data=data, unique_id=DOMAIN) + config_entry.add_to_hass(hass) + with _patch_discovery(), _patch_single_discovery(): + await setup.async_setup_component(hass, DOMAIN, {}) + await hass.async_block_till_done() + + migrated_entry = None + for entry in hass.config_entries.async_entries(DOMAIN): + if entry.unique_id == MAC_ADDRESS: + migrated_entry = entry + break + + assert migrated_entry is not None + assert migrated_entry.data[CONF_HOST] == IP_ADDRESS From f10a469d4fc4ab1472266fa65a3f8bfc8e1efe98 Mon Sep 17 00:00:00 2001 From: Milan Meulemans Date: Fri, 8 Oct 2021 17:59:19 +0200 Subject: [PATCH 112/162] Upgrade aionanoleaf to 0.0.3 to fix deadlock (#57312) --- homeassistant/components/nanoleaf/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nanoleaf/manifest.json b/homeassistant/components/nanoleaf/manifest.json index 133257dc7fe..501f1beb75a 100644 --- a/homeassistant/components/nanoleaf/manifest.json +++ b/homeassistant/components/nanoleaf/manifest.json @@ -3,7 +3,7 @@ "name": "Nanoleaf", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/nanoleaf", - "requirements": ["aionanoleaf==0.0.2"], + "requirements": ["aionanoleaf==0.0.3"], "zeroconf": ["_nanoleafms._tcp.local.", "_nanoleafapi._tcp.local."], "homekit" : { "models": [ diff --git a/requirements_all.txt b/requirements_all.txt index 1d3667d04b2..da9d715829f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -219,7 +219,7 @@ aiomodernforms==0.1.8 aiomusiccast==0.9.2 # homeassistant.components.nanoleaf -aionanoleaf==0.0.2 +aionanoleaf==0.0.3 # homeassistant.components.keyboard_remote aionotify==0.2.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 3ddd959692f..4b01f5d011b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -146,7 +146,7 @@ aiomodernforms==0.1.8 aiomusiccast==0.9.2 # homeassistant.components.nanoleaf -aionanoleaf==0.0.2 +aionanoleaf==0.0.3 # homeassistant.components.notion aionotion==3.0.2 From 0c886e29902e98ce46bc7acc3e6088ef6eb9caab Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 8 Oct 2021 18:52:58 +0200 Subject: [PATCH 113/162] Improve state of cover groups (#57313) Co-authored-by: Paulus Schoutsen --- homeassistant/components/group/cover.py | 10 ++- tests/components/group/test_cover.py | 105 +++++++++++++++++++++++- 2 files changed, 111 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/group/cover.py b/homeassistant/components/group/cover.py index 45d88a07f88..68ad61c33fc 100644 --- a/homeassistant/components/group/cover.py +++ b/homeassistant/components/group/cover.py @@ -259,25 +259,31 @@ class CoverGroup(GroupEntity, CoverEntity): """Update state and attributes.""" self._attr_assumed_state = False - self._attr_is_closed = None + self._attr_is_closed = True self._attr_is_closing = False self._attr_is_opening = False + has_valid_state = False for entity_id in self._entities: state = self.hass.states.get(entity_id) if not state: continue if state.state == STATE_OPEN: self._attr_is_closed = False + has_valid_state = True continue if state.state == STATE_CLOSED: - self._attr_is_closed = True + has_valid_state = True continue if state.state == STATE_CLOSING: self._attr_is_closing = True + has_valid_state = True continue if state.state == STATE_OPENING: self._attr_is_opening = True + has_valid_state = True continue + if not has_valid_state: + self._attr_is_closed = None position_covers = self._covers[KEY_POSITION] all_position_states = [self.hass.states.get(x) for x in position_covers] diff --git a/tests/components/group/test_cover.py b/tests/components/group/test_cover.py index 9d16be9150b..cf1fba992e7 100644 --- a/tests/components/group/test_cover.py +++ b/tests/components/group/test_cover.py @@ -96,6 +96,106 @@ async def setup_comp(hass, config_count): await hass.async_block_till_done() +@pytest.mark.parametrize("config_count", [(CONFIG_ATTRIBUTES, 1)]) +async def test_state(hass, setup_comp): + """Test handling of state.""" + state = hass.states.get(COVER_GROUP) + # No entity has a valid state -> group state unknown + assert state.state == STATE_UNKNOWN + assert state.attributes[ATTR_FRIENDLY_NAME] == DEFAULT_NAME + assert state.attributes[ATTR_ENTITY_ID] == [ + DEMO_COVER, + DEMO_COVER_POS, + DEMO_COVER_TILT, + DEMO_TILT, + ] + assert ATTR_ASSUMED_STATE not in state.attributes + assert state.attributes[ATTR_SUPPORTED_FEATURES] == 0 + assert ATTR_CURRENT_POSITION not in state.attributes + assert ATTR_CURRENT_TILT_POSITION not in state.attributes + + # Set all entities as closed -> group state closed + hass.states.async_set(DEMO_COVER, STATE_CLOSED, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_CLOSED, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_CLOSED, {}) + hass.states.async_set(DEMO_TILT, STATE_CLOSED, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_CLOSED + + # Set all entities as open -> group state open + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_OPEN, {}) + hass.states.async_set(DEMO_TILT, STATE_OPEN, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_OPEN + + # Set first entity as open -> group state open + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_CLOSED, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_CLOSED, {}) + hass.states.async_set(DEMO_TILT, STATE_CLOSED, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_OPEN + + # Set last entity as open -> group state open + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_CLOSED, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_CLOSED, {}) + hass.states.async_set(DEMO_TILT, STATE_CLOSED, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_OPEN + + # Set conflicting valid states -> opening state has priority + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_OPENING, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_CLOSING, {}) + hass.states.async_set(DEMO_TILT, STATE_CLOSED, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_OPENING + + # Set all entities to unknown state -> group state unknown + hass.states.async_set(DEMO_COVER, STATE_UNKNOWN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_UNKNOWN, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_UNKNOWN, {}) + hass.states.async_set(DEMO_TILT, STATE_UNKNOWN, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_UNKNOWN + + # Set one entity to unknown state -> open state has priority + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_UNKNOWN, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_CLOSED, {}) + hass.states.async_set(DEMO_TILT, STATE_OPEN, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_OPEN + + # Set one entity to unknown state -> opening state has priority + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_OPENING, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_UNKNOWN, {}) + hass.states.async_set(DEMO_TILT, STATE_CLOSED, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_OPENING + + # Set one entity to unknown state -> closing state has priority + hass.states.async_set(DEMO_COVER, STATE_OPEN, {}) + hass.states.async_set(DEMO_COVER_POS, STATE_UNKNOWN, {}) + hass.states.async_set(DEMO_COVER_TILT, STATE_CLOSING, {}) + hass.states.async_set(DEMO_TILT, STATE_CLOSED, {}) + await hass.async_block_till_done() + state = hass.states.get(COVER_GROUP) + assert state.state == STATE_CLOSING + + @pytest.mark.parametrize("config_count", [(CONFIG_ATTRIBUTES, 1)]) async def test_attributes(hass, setup_comp): """Test handling of state attributes.""" @@ -196,7 +296,7 @@ async def test_attributes(hass, setup_comp): # ### Test assumed state ### # ########################## - # For covers + # For covers - assumed state set true if position differ hass.states.async_set( DEMO_COVER, STATE_OPEN, {ATTR_SUPPORTED_FEATURES: 4, ATTR_CURRENT_POSITION: 100} ) @@ -220,7 +320,7 @@ async def test_attributes(hass, setup_comp): assert ATTR_CURRENT_POSITION not in state.attributes assert state.attributes[ATTR_CURRENT_TILT_POSITION] == 60 - # For tilts + # For tilts - assumed state set true if tilt position differ hass.states.async_set( DEMO_TILT, STATE_OPEN, @@ -252,6 +352,7 @@ async def test_attributes(hass, setup_comp): state = hass.states.get(COVER_GROUP) assert state.attributes[ATTR_ASSUMED_STATE] is True + # Test entity registry integration entity_registry = er.async_get(hass) entry = entity_registry.async_get(COVER_GROUP) assert entry From 54acc5badea73f4572087fabe9b6593618745970 Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Fri, 8 Oct 2021 17:57:49 +0200 Subject: [PATCH 114/162] Fix multiple upnp/ssdp issues (#57314) --- homeassistant/components/dlna_dmr/manifest.json | 2 +- homeassistant/components/ssdp/manifest.json | 2 +- homeassistant/components/upnp/manifest.json | 2 +- homeassistant/components/yeelight/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/ssdp/test_init.py | 10 +++++----- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/dlna_dmr/manifest.json b/homeassistant/components/dlna_dmr/manifest.json index 53bee3d8519..1e8df555a22 100644 --- a/homeassistant/components/dlna_dmr/manifest.json +++ b/homeassistant/components/dlna_dmr/manifest.json @@ -3,7 +3,7 @@ "name": "DLNA Digital Media Renderer", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/dlna_dmr", - "requirements": ["async-upnp-client==0.22.5"], + "requirements": ["async-upnp-client==0.22.8"], "dependencies": ["network", "ssdp"], "codeowners": ["@StevenLooman", "@chishm"], "iot_class": "local_push" diff --git a/homeassistant/components/ssdp/manifest.json b/homeassistant/components/ssdp/manifest.json index 3e99a77e8bb..85e489a72dd 100644 --- a/homeassistant/components/ssdp/manifest.json +++ b/homeassistant/components/ssdp/manifest.json @@ -2,7 +2,7 @@ "domain": "ssdp", "name": "Simple Service Discovery Protocol (SSDP)", "documentation": "https://www.home-assistant.io/integrations/ssdp", - "requirements": ["async-upnp-client==0.22.5"], + "requirements": ["async-upnp-client==0.22.8"], "dependencies": ["network"], "after_dependencies": ["zeroconf"], "codeowners": [], diff --git a/homeassistant/components/upnp/manifest.json b/homeassistant/components/upnp/manifest.json index 9a1875777a6..4029ff5c3bb 100644 --- a/homeassistant/components/upnp/manifest.json +++ b/homeassistant/components/upnp/manifest.json @@ -3,7 +3,7 @@ "name": "UPnP/IGD", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/upnp", - "requirements": ["async-upnp-client==0.22.5"], + "requirements": ["async-upnp-client==0.22.8"], "dependencies": ["network", "ssdp"], "codeowners": ["@StevenLooman","@ehendrix23"], "ssdp": [ diff --git a/homeassistant/components/yeelight/manifest.json b/homeassistant/components/yeelight/manifest.json index 1b8c959cb52..632fdf426f2 100644 --- a/homeassistant/components/yeelight/manifest.json +++ b/homeassistant/components/yeelight/manifest.json @@ -2,7 +2,7 @@ "domain": "yeelight", "name": "Yeelight", "documentation": "https://www.home-assistant.io/integrations/yeelight", - "requirements": ["yeelight==0.7.7", "async-upnp-client==0.22.5"], + "requirements": ["yeelight==0.7.7", "async-upnp-client==0.22.8"], "codeowners": ["@rytilahti", "@zewelor", "@shenxn", "@starkillerOG"], "config_flow": true, "dependencies": ["network"], diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 35d5649a1b4..3c3645f5ece 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -4,7 +4,7 @@ aiodiscover==1.4.4 aiohttp==3.7.4.post0 aiohttp_cors==0.7.0 astral==2.2 -async-upnp-client==0.22.5 +async-upnp-client==0.22.8 async_timeout==3.0.1 attrs==21.2.0 awesomeversion==21.8.1 diff --git a/requirements_all.txt b/requirements_all.txt index da9d715829f..d708ec1497e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -330,7 +330,7 @@ asterisk_mbox==0.5.0 # homeassistant.components.ssdp # homeassistant.components.upnp # homeassistant.components.yeelight -async-upnp-client==0.22.5 +async-upnp-client==0.22.8 # homeassistant.components.supla asyncpysupla==0.0.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4b01f5d011b..f7f5c0328a6 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -224,7 +224,7 @@ arcam-fmj==0.7.0 # homeassistant.components.ssdp # homeassistant.components.upnp # homeassistant.components.yeelight -async-upnp-client==0.22.5 +async-upnp-client==0.22.8 # homeassistant.components.aurora auroranoaa==0.0.2 diff --git a/tests/components/ssdp/test_init.py b/tests/components/ssdp/test_init.py index f3ddab39c39..64edd9e8341 100644 --- a/tests/components/ssdp/test_init.py +++ b/tests/components/ssdp/test_init.py @@ -23,9 +23,9 @@ from tests.common import async_fire_time_changed def _ssdp_headers(headers): - return CaseInsensitiveDict( - headers, _timestamp=datetime(2021, 1, 1, 12, 00), _udn=udn_from_headers(headers) - ) + ssdp_headers = CaseInsensitiveDict(headers, _timestamp=datetime(2021, 1, 1, 12, 00)) + ssdp_headers["_udn"] = udn_from_headers(ssdp_headers) + return ssdp_headers async def init_ssdp_component(hass: homeassistant) -> SsdpListener: @@ -45,7 +45,7 @@ async def test_ssdp_flow_dispatched_on_st(mock_get_ssdp, hass, caplog, mock_flow mock_ssdp_search_response = _ssdp_headers( { "st": "mock-st", - "location": None, + "location": "http://1.1.1.1", "usn": "uuid:mock-udn::mock-st", "server": "mock-server", "ext": "", @@ -64,7 +64,7 @@ async def test_ssdp_flow_dispatched_on_st(mock_get_ssdp, hass, caplog, mock_flow } assert mock_flow_init.mock_calls[0][2]["data"] == { ssdp.ATTR_SSDP_ST: "mock-st", - ssdp.ATTR_SSDP_LOCATION: None, + ssdp.ATTR_SSDP_LOCATION: "http://1.1.1.1", ssdp.ATTR_SSDP_USN: "uuid:mock-udn::mock-st", ssdp.ATTR_SSDP_SERVER: "mock-server", ssdp.ATTR_SSDP_EXT: "", From 1ea089160276645d2336e925724d65cbc3e4aa71 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 8 Oct 2021 10:48:52 -0700 Subject: [PATCH 115/162] Guard for bad last reset (#57344) --- homeassistant/components/sensor/recorder.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sensor/recorder.py b/homeassistant/components/sensor/recorder.py index c485622af80..30b5a4605ef 100644 --- a/homeassistant/components/sensor/recorder.py +++ b/homeassistant/components/sensor/recorder.py @@ -7,6 +7,7 @@ import datetime import itertools import logging import math +from typing import Any from sqlalchemy.orm.session import Session @@ -362,13 +363,14 @@ def _wanted_statistics(sensor_states: list[State]) -> dict[str, set[str]]: return wanted_statistics -def _last_reset_as_utc_isoformat( - last_reset_s: str | None, entity_id: str -) -> str | None: +def _last_reset_as_utc_isoformat(last_reset_s: Any, entity_id: str) -> str | None: """Parse last_reset and convert it to UTC.""" if last_reset_s is None: return None - last_reset = dt_util.parse_datetime(last_reset_s) + if isinstance(last_reset_s, str): + last_reset = dt_util.parse_datetime(last_reset_s) + else: + last_reset = None if last_reset is None: _LOGGER.warning( "Ignoring invalid last reset '%s' for %s", last_reset_s, entity_id From 3c2f3f2ade45a146b03b778513f98a9698f2a65f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 8 Oct 2021 14:58:39 -0700 Subject: [PATCH 116/162] Bumped version to 2021.10.2 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index c8ddfb2f4d3..1281d39fad4 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "1" +PATCH_VERSION: Final = "2" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 67e5f4e823734d1128857d0ea77f56351ece70d7 Mon Sep 17 00:00:00 2001 From: Robert Hillis Date: Sat, 9 Oct 2021 05:23:40 -0400 Subject: [PATCH 117/162] Catch errors for efergy (#57326) Co-authored-by: Martin Hjelmare --- homeassistant/components/efergy/sensor.py | 27 +++++++++-- tests/components/efergy/test_sensor.py | 56 +++++++++++++++++++++-- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/efergy/sensor.py b/homeassistant/components/efergy/sensor.py index 338609cf342..a11fe5f3ac6 100644 --- a/homeassistant/components/efergy/sensor.py +++ b/homeassistant/components/efergy/sensor.py @@ -1,7 +1,9 @@ """Support for Efergy sensors.""" from __future__ import annotations -from pyefergy import Efergy +import logging + +from pyefergy import Efergy, exceptions import voluptuous as vol from homeassistant.components.sensor import ( @@ -20,6 +22,7 @@ from homeassistant.const import ( POWER_WATT, ) from homeassistant.core import HomeAssistant +from homeassistant.exceptions import PlatformNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity_platform import AddEntitiesCallback @@ -39,6 +42,8 @@ CONF_CURRENT_VALUES = "current_values" DEFAULT_PERIOD = "year" DEFAULT_UTC_OFFSET = "0" +_LOGGER = logging.getLogger(__name__) + SENSOR_TYPES: dict[str, SensorEntityDescription] = { CONF_INSTANT: SensorEntityDescription( key=CONF_INSTANT, @@ -102,7 +107,10 @@ async def async_setup_platform( ) dev = [] - sensors = await api.get_sids() + try: + sensors = await api.get_sids() + except (exceptions.DataError, exceptions.ConnectTimeout) as ex: + raise PlatformNotReady("Error getting data from Efergy:") from ex for variable in config[CONF_MONITORED_VARIABLES]: if variable[CONF_TYPE] == CONF_CURRENT_VALUES: for sensor in sensors: @@ -150,6 +158,15 @@ class EfergySensor(SensorEntity): async def async_update(self) -> None: """Get the Efergy monitor data from the web service.""" - self._attr_native_value = await self.api.async_get_reading( - self.entity_description.key, period=self.period, sid=self.sid - ) + try: + self._attr_native_value = await self.api.async_get_reading( + self.entity_description.key, period=self.period, sid=self.sid + ) + except (exceptions.DataError, exceptions.ConnectTimeout) as ex: + if self._attr_available: + self._attr_available = False + _LOGGER.error("Error getting data from Efergy: %s", ex) + return + if not self._attr_available: + self._attr_available = True + _LOGGER.info("Connection to Efergy has resumed") diff --git a/tests/components/efergy/test_sensor.py b/tests/components/efergy/test_sensor.py index 97478155483..94a381b9048 100644 --- a/tests/components/efergy/test_sensor.py +++ b/tests/components/efergy/test_sensor.py @@ -1,9 +1,15 @@ """The tests for Efergy sensor platform.""" +import asyncio +from datetime import timedelta + +from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN +from homeassistant.const import STATE_UNAVAILABLE from homeassistant.core import HomeAssistant from homeassistant.setup import async_setup_component +import homeassistant.util.dt as dt_util -from tests.common import load_fixture +from tests.common import async_fire_time_changed, load_fixture from tests.test_util.aiohttp import AiohttpClientMocker token = "9p6QGJ7dpZfO3fqPTBk1fyEmjV1cGoLT" @@ -30,9 +36,14 @@ MULTI_SENSOR_CONFIG = { } -def mock_responses(aioclient_mock: AiohttpClientMocker): +def mock_responses(aioclient_mock: AiohttpClientMocker, error: bool = False): """Mock responses for Efergy.""" base_url = "https://engage.efergy.com/mobile_proxy/" + if error: + aioclient_mock.get( + f"{base_url}getCurrentValuesSummary?token={token}", exc=asyncio.TimeoutError + ) + return aioclient_mock.get( f"{base_url}getInstant?token={token}", text=load_fixture("efergy/efergy_instant.json"), @@ -64,7 +75,9 @@ async def test_single_sensor_readings( ): """Test for successfully setting up the Efergy platform.""" mock_responses(aioclient_mock) - assert await async_setup_component(hass, "sensor", {"sensor": ONE_SENSOR_CONFIG}) + assert await async_setup_component( + hass, SENSOR_DOMAIN, {SENSOR_DOMAIN: ONE_SENSOR_CONFIG} + ) await hass.async_block_till_done() assert hass.states.get("sensor.energy_consumed").state == "38.21" @@ -79,9 +92,44 @@ async def test_multi_sensor_readings( ): """Test for multiple sensors in one household.""" mock_responses(aioclient_mock) - assert await async_setup_component(hass, "sensor", {"sensor": MULTI_SENSOR_CONFIG}) + assert await async_setup_component( + hass, SENSOR_DOMAIN, {SENSOR_DOMAIN: MULTI_SENSOR_CONFIG} + ) await hass.async_block_till_done() assert hass.states.get("sensor.efergy_728386").state == "218" assert hass.states.get("sensor.efergy_0").state == "1808" assert hass.states.get("sensor.efergy_728387").state == "312" + + +async def test_failed_getting_sids( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +): + """Test failed gettings sids.""" + mock_responses(aioclient_mock, error=True) + assert await async_setup_component( + hass, SENSOR_DOMAIN, {SENSOR_DOMAIN: ONE_SENSOR_CONFIG} + ) + assert not hass.states.async_all("sensor") + + +async def test_failed_update_and_reconnection( + hass: HomeAssistant, aioclient_mock: AiohttpClientMocker +): + """Test failed update and reconnection.""" + mock_responses(aioclient_mock) + assert await async_setup_component( + hass, SENSOR_DOMAIN, {SENSOR_DOMAIN: ONE_SENSOR_CONFIG} + ) + aioclient_mock.clear_requests() + mock_responses(aioclient_mock, error=True) + next_update = dt_util.utcnow() + timedelta(seconds=3) + async_fire_time_changed(hass, next_update) + await hass.async_block_till_done() + assert hass.states.get("sensor.efergy_728386").state == STATE_UNAVAILABLE + aioclient_mock.clear_requests() + mock_responses(aioclient_mock) + next_update = dt_util.utcnow() + timedelta(seconds=30) + async_fire_time_changed(hass, next_update) + await hass.async_block_till_done() + assert hass.states.get("sensor.efergy_728386").state == "1628" From 438bdcbd8ba8e7de583aeef30e660defb27a6138 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 9 Oct 2021 21:02:33 -1000 Subject: [PATCH 118/162] Use switch format unique ids for tplink dimmers (#57346) --- homeassistant/components/tplink/__init__.py | 47 +++++++++++- homeassistant/components/tplink/light.py | 10 ++- tests/components/tplink/__init__.py | 29 +++++++- tests/components/tplink/test_init.py | 81 ++++++++++++++++++++- 4 files changed, 163 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/tplink/__init__.py b/homeassistant/components/tplink/__init__.py index ff0526490f5..d17815d2344 100644 --- a/homeassistant/components/tplink/__init__.py +++ b/homeassistant/components/tplink/__init__.py @@ -11,6 +11,7 @@ import voluptuous as vol from homeassistant import config_entries from homeassistant.components import network +from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN from homeassistant.config_entries import ConfigEntry, ConfigEntryNotReady from homeassistant.const import ( CONF_HOST, @@ -19,7 +20,11 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_STARTED, ) from homeassistant.core import HomeAssistant, callback -from homeassistant.helpers import config_validation as cv, device_registry as dr +from homeassistant.helpers import ( + config_validation as cv, + device_registry as dr, + entity_registry as er, +) from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.typing import ConfigType @@ -158,12 +163,52 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: except SmartDeviceException as ex: raise ConfigEntryNotReady from ex + if device.is_dimmer: + async_fix_dimmer_unique_id(hass, entry, device) + hass.data[DOMAIN][entry.entry_id] = TPLinkDataUpdateCoordinator(hass, device) hass.config_entries.async_setup_platforms(entry, PLATFORMS) return True +@callback +def async_fix_dimmer_unique_id( + hass: HomeAssistant, entry: ConfigEntry, device: SmartDevice +) -> None: + """Migrate the unique id of dimmers back to the legacy one. + + Dimmers used to use the switch format since pyHS100 treated them as SmartPlug but + the old code created them as lights + + https://github.com/home-assistant/core/blob/2021.9.7/homeassistant/components/tplink/common.py#L86 + """ + + # This is the unique id before 2021.0/2021.1 + original_unique_id = legacy_device_id(device) + + # This is the unique id that was used in 2021.0/2021.1 rollout + rollout_unique_id = device.mac.replace(":", "").upper() + + entity_registry = er.async_get(hass) + + rollout_entity_id = entity_registry.async_get_entity_id( + LIGHT_DOMAIN, DOMAIN, rollout_unique_id + ) + original_entry_id = entity_registry.async_get_entity_id( + LIGHT_DOMAIN, DOMAIN, original_unique_id + ) + + # If they are now using the 2021.0/2021.1 rollout entity id + # and have deleted the original entity id, we want to update that entity id + # so they don't end up with another _2 entity, but only if they deleted + # the original + if rollout_entity_id and not original_entry_id: + entity_registry.async_update_entity( + rollout_entity_id, new_unique_id=original_unique_id + ) + + async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" hass_data: dict[str, Any] = hass.data[DOMAIN] diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 3f4b130a5cc..ad423e84fa5 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -26,6 +26,7 @@ from homeassistant.util.color import ( color_temperature_mired_to_kelvin as mired_to_kelvin, ) +from . import legacy_device_id from .const import DOMAIN from .coordinator import TPLinkDataUpdateCoordinator from .entity import CoordinatedTPLinkEntity, async_refresh_after @@ -58,7 +59,14 @@ class TPLinkSmartBulb(CoordinatedTPLinkEntity, LightEntity): """Initialize the switch.""" super().__init__(device, coordinator) # For backwards compat with pyHS100 - self._attr_unique_id = self.device.mac.replace(":", "").upper() + if self.device.is_dimmer: + # Dimmers used to use the switch format since + # pyHS100 treated them as SmartPlug but the old code + # created them as lights + # https://github.com/home-assistant/core/blob/2021.9.7/homeassistant/components/tplink/common.py#L86 + self._attr_unique_id = legacy_device_id(device) + else: + self._attr_unique_id = self.device.mac.replace(":", "").upper() @async_refresh_after async def async_turn_on(self, **kwargs: Any) -> None: diff --git a/tests/components/tplink/__init__.py b/tests/components/tplink/__init__.py index f25fc13784a..4e6dbb9dae7 100644 --- a/tests/components/tplink/__init__.py +++ b/tests/components/tplink/__init__.py @@ -2,7 +2,7 @@ from unittest.mock import AsyncMock, MagicMock, patch -from kasa import SmartBulb, SmartPlug, SmartStrip +from kasa import SmartBulb, SmartDimmer, SmartPlug, SmartStrip from kasa.exceptions import SmartDeviceException from kasa.protocol import TPLinkSmartHomeProtocol @@ -48,6 +48,33 @@ def _mocked_bulb() -> SmartBulb: return bulb +def _mocked_dimmer() -> SmartDimmer: + dimmer = MagicMock(auto_spec=SmartDimmer) + dimmer.update = AsyncMock() + dimmer.mac = MAC_ADDRESS + dimmer.alias = ALIAS + dimmer.model = MODEL + dimmer.host = IP_ADDRESS + dimmer.brightness = 50 + dimmer.color_temp = 4000 + dimmer.is_color = True + dimmer.is_strip = False + dimmer.is_plug = False + dimmer.is_dimmer = True + dimmer.hsv = (10, 30, 5) + dimmer.device_id = MAC_ADDRESS + dimmer.valid_temperature_range.min = 4000 + dimmer.valid_temperature_range.max = 9000 + dimmer.hw_info = {"sw_ver": "1.0.0"} + dimmer.turn_off = AsyncMock() + dimmer.turn_on = AsyncMock() + dimmer.set_brightness = AsyncMock() + dimmer.set_hsv = AsyncMock() + dimmer.set_color_temp = AsyncMock() + dimmer.protocol = _mock_protocol() + return dimmer + + def _mocked_plug() -> SmartPlug: plug = MagicMock(auto_spec=SmartPlug) plug.update = AsyncMock() diff --git a/tests/components/tplink/test_init.py b/tests/components/tplink/test_init.py index c166fccc9b5..73edc63e28c 100644 --- a/tests/components/tplink/test_init.py +++ b/tests/components/tplink/test_init.py @@ -4,14 +4,23 @@ from __future__ import annotations from datetime import timedelta from unittest.mock import MagicMock, patch +from homeassistant import setup from homeassistant.components import tplink from homeassistant.components.tplink.const import DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STARTED +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_registry import EntityRegistry from homeassistant.setup import async_setup_component from homeassistant.util import dt as dt_util -from . import IP_ADDRESS, MAC_ADDRESS, _patch_discovery, _patch_single_discovery +from . import ( + IP_ADDRESS, + MAC_ADDRESS, + _mocked_dimmer, + _patch_discovery, + _patch_single_discovery, +) from tests.common import MockConfigEntry, async_fire_time_changed @@ -63,3 +72,73 @@ async def test_config_entry_retry(hass): await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}}) await hass.async_block_till_done() assert already_migrated_config_entry.state == ConfigEntryState.SETUP_RETRY + + +async def test_dimmer_switch_unique_id_fix_original_entity_was_deleted( + hass: HomeAssistant, entity_reg: EntityRegistry +): + """Test that roll out unique id entity id changed to the original unique id.""" + config_entry = MockConfigEntry(domain=DOMAIN, data={}, unique_id=MAC_ADDRESS) + config_entry.add_to_hass(hass) + dimmer = _mocked_dimmer() + rollout_unique_id = MAC_ADDRESS.replace(":", "").upper() + original_unique_id = tplink.legacy_device_id(dimmer) + rollout_dimmer_entity_reg = entity_reg.async_get_or_create( + config_entry=config_entry, + platform=DOMAIN, + domain="light", + unique_id=rollout_unique_id, + original_name="Rollout dimmer", + ) + + with _patch_discovery(device=dimmer), _patch_single_discovery(device=dimmer): + await setup.async_setup_component(hass, DOMAIN, {}) + await hass.async_block_till_done() + + migrated_dimmer_entity_reg = entity_reg.async_get_or_create( + config_entry=config_entry, + platform=DOMAIN, + domain="light", + unique_id=original_unique_id, + original_name="Migrated dimmer", + ) + assert migrated_dimmer_entity_reg.entity_id == rollout_dimmer_entity_reg.entity_id + + +async def test_dimmer_switch_unique_id_fix_original_entity_still_exists( + hass: HomeAssistant, entity_reg: EntityRegistry +): + """Test no migration happens if the original entity id still exists.""" + config_entry = MockConfigEntry(domain=DOMAIN, data={}, unique_id=MAC_ADDRESS) + config_entry.add_to_hass(hass) + dimmer = _mocked_dimmer() + rollout_unique_id = MAC_ADDRESS.replace(":", "").upper() + original_unique_id = tplink.legacy_device_id(dimmer) + original_dimmer_entity_reg = entity_reg.async_get_or_create( + config_entry=config_entry, + platform=DOMAIN, + domain="light", + unique_id=original_unique_id, + original_name="Original dimmer", + ) + rollout_dimmer_entity_reg = entity_reg.async_get_or_create( + config_entry=config_entry, + platform=DOMAIN, + domain="light", + unique_id=rollout_unique_id, + original_name="Rollout dimmer", + ) + + with _patch_discovery(device=dimmer), _patch_single_discovery(device=dimmer): + await setup.async_setup_component(hass, DOMAIN, {}) + await hass.async_block_till_done() + + migrated_dimmer_entity_reg = entity_reg.async_get_or_create( + config_entry=config_entry, + platform=DOMAIN, + domain="light", + unique_id=original_unique_id, + original_name="Migrated dimmer", + ) + assert migrated_dimmer_entity_reg.entity_id == original_dimmer_entity_reg.entity_id + assert migrated_dimmer_entity_reg.entity_id != rollout_dimmer_entity_reg.entity_id From 1e48bef74eac1f10eb34a1873ffcd5467372dc64 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Sat, 9 Oct 2021 02:22:14 +0300 Subject: [PATCH 119/162] Fix Shelly RGB/W supported color mode detection (#57359) --- homeassistant/components/shelly/const.py | 5 +++++ homeassistant/components/shelly/light.py | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/shelly/const.py b/homeassistant/components/shelly/const.py index 3c9c24b1f7f..a6f3ab12c6b 100644 --- a/homeassistant/components/shelly/const.py +++ b/homeassistant/components/shelly/const.py @@ -21,6 +21,11 @@ LIGHT_TRANSITION_MIN_FIRMWARE_DATE: Final = 20210226 # max light transition time in milliseconds MAX_TRANSITION_TIME: Final = 5000 +RGBW_MODELS: Final = ( + "SHBLB-1", + "SHRGBW2", +) + MODELS_SUPPORTING_LIGHT_TRANSITION: Final = ( "SHBDUO-1", "SHCB-1", diff --git a/homeassistant/components/shelly/light.py b/homeassistant/components/shelly/light.py index cd034c1e7e5..3e0fce43681 100644 --- a/homeassistant/components/shelly/light.py +++ b/homeassistant/components/shelly/light.py @@ -46,6 +46,7 @@ from .const import ( LIGHT_TRANSITION_MIN_FIRMWARE_DATE, MAX_TRANSITION_TIME, MODELS_SUPPORTING_LIGHT_TRANSITION, + RGBW_MODELS, RPC, SHBLB_1_RGB_EFFECTS, STANDARD_RGB_EFFECTS, @@ -143,7 +144,7 @@ class BlockShellyLight(ShellyBlockEntity, LightEntity): if hasattr(block, "red") and hasattr(block, "green") and hasattr(block, "blue"): self._min_kelvin = KELVIN_MIN_VALUE_COLOR - if hasattr(block, "white"): + if wrapper.model in RGBW_MODELS: self._supported_color_modes.add(COLOR_MODE_RGBW) else: self._supported_color_modes.add(COLOR_MODE_RGB) From 0f2b9a6d77b8d69585a277c21dc8361773094ce5 Mon Sep 17 00:00:00 2001 From: MatthewFlamm <39341281+MatthewFlamm@users.noreply.github.com> Date: Sat, 9 Oct 2021 17:38:45 -0400 Subject: [PATCH 120/162] Bump pynws to 1.3.2 (#57361) --- homeassistant/components/nws/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/nws/manifest.json b/homeassistant/components/nws/manifest.json index 30b00fde15a..2e6f58028e0 100644 --- a/homeassistant/components/nws/manifest.json +++ b/homeassistant/components/nws/manifest.json @@ -3,7 +3,7 @@ "name": "National Weather Service (NWS)", "documentation": "https://www.home-assistant.io/integrations/nws", "codeowners": ["@MatthewFlamm"], - "requirements": ["pynws==1.3.1"], + "requirements": ["pynws==1.3.2"], "quality_scale": "platinum", "config_flow": true, "iot_class": "cloud_polling" diff --git a/requirements_all.txt b/requirements_all.txt index d708ec1497e..92cc47ca88c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1670,7 +1670,7 @@ pynuki==1.4.1 pynut2==2.1.2 # homeassistant.components.nws -pynws==1.3.1 +pynws==1.3.2 # homeassistant.components.nx584 pynx584==0.5 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f7f5c0328a6..eab1f7230bd 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -986,7 +986,7 @@ pynuki==1.4.1 pynut2==2.1.2 # homeassistant.components.nws -pynws==1.3.1 +pynws==1.3.2 # homeassistant.components.nx584 pynx584==0.5 From 307a07611e10c47c819655be2e9731431d131654 Mon Sep 17 00:00:00 2001 From: RenierM26 <66512715+RenierM26@users.noreply.github.com> Date: Sat, 9 Oct 2021 10:02:35 +0200 Subject: [PATCH 121/162] Bump Switchbot library (#57367) * Bump dependency to fix SB password problem. * Bump API version. --- homeassistant/components/switchbot/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/switchbot/manifest.json b/homeassistant/components/switchbot/manifest.json index 38743981ed5..6dd23e2eec5 100644 --- a/homeassistant/components/switchbot/manifest.json +++ b/homeassistant/components/switchbot/manifest.json @@ -2,7 +2,7 @@ "domain": "switchbot", "name": "SwitchBot", "documentation": "https://www.home-assistant.io/integrations/switchbot", - "requirements": ["PySwitchbot==0.11.0"], + "requirements": ["PySwitchbot==0.12.0"], "config_flow": true, "codeowners": ["@danielhiversen", "@RenierM26"], "iot_class": "local_polling" diff --git a/requirements_all.txt b/requirements_all.txt index 92cc47ca88c..cdc68d77d4d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -49,7 +49,7 @@ PyRMVtransport==0.3.2 PySocks==1.7.1 # homeassistant.components.switchbot -# PySwitchbot==0.11.0 +# PySwitchbot==0.12.0 # homeassistant.components.transport_nsw PyTransportNSW==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index eab1f7230bd..d9d0eb600c0 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -24,7 +24,7 @@ PyQRCode==1.2.1 PyRMVtransport==0.3.2 # homeassistant.components.switchbot -# PySwitchbot==0.11.0 +# PySwitchbot==0.12.0 # homeassistant.components.transport_nsw PyTransportNSW==0.1.1 From a4b6b74997ccc245dcfbd7dbc7f8fbb51d782596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Sat, 9 Oct 2021 23:46:25 +0200 Subject: [PATCH 122/162] Bump pyhaversion to 21.10.0 (#57377) --- homeassistant/components/version/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/version/manifest.json b/homeassistant/components/version/manifest.json index de43a47d505..aa8a2659dcd 100644 --- a/homeassistant/components/version/manifest.json +++ b/homeassistant/components/version/manifest.json @@ -3,7 +3,7 @@ "name": "Version", "documentation": "https://www.home-assistant.io/integrations/version", "requirements": [ - "pyhaversion==21.7.0" + "pyhaversion==21.10.0" ], "codeowners": [ "@fabaff", diff --git a/requirements_all.txt b/requirements_all.txt index cdc68d77d4d..7eb828f4ea0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1514,7 +1514,7 @@ pygtfs==0.1.6 pygti==0.9.2 # homeassistant.components.version -pyhaversion==21.7.0 +pyhaversion==21.10.0 # homeassistant.components.heos pyheos==0.7.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d9d0eb600c0..9007bd6b1db 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -881,7 +881,7 @@ pygatt[GATTTOOL]==4.0.5 pygti==0.9.2 # homeassistant.components.version -pyhaversion==21.7.0 +pyhaversion==21.10.0 # homeassistant.components.heos pyheos==0.7.2 From 2e9bbe52197da24225dbf0439b2da0dd500d1aeb Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 9 Oct 2021 22:57:13 +0200 Subject: [PATCH 123/162] Update frontend to 20211007.1 (#57385) --- homeassistant/components/frontend/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index f36d72a967c..5b908efb2df 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -3,7 +3,7 @@ "name": "Home Assistant Frontend", "documentation": "https://www.home-assistant.io/integrations/frontend", "requirements": [ - "home-assistant-frontend==20211007.0" + "home-assistant-frontend==20211007.1" ], "dependencies": [ "api", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 3c3645f5ece..d44f2536ea3 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -15,7 +15,7 @@ ciso8601==2.2.0 cryptography==3.4.8 emoji==1.5.0 hass-nabucasa==0.50.0 -home-assistant-frontend==20211007.0 +home-assistant-frontend==20211007.1 httpx==0.19.0 ifaddr==0.1.7 jinja2==3.0.1 diff --git a/requirements_all.txt b/requirements_all.txt index 7eb828f4ea0..0f269a7978c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -810,7 +810,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211007.0 +home-assistant-frontend==20211007.1 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9007bd6b1db..7330ff51f1a 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -485,7 +485,7 @@ hole==0.5.1 holidays==0.11.3.1 # homeassistant.components.frontend -home-assistant-frontend==20211007.0 +home-assistant-frontend==20211007.1 # homeassistant.components.zwave homeassistant-pyozw==0.1.10 From 8c44f9b501d629024ab6fc11e9b7412052bd801d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 9 Oct 2021 21:00:28 -1000 Subject: [PATCH 124/162] Do all of dhcp scapy startup in the executor (#57392) --- homeassistant/components/dhcp/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/dhcp/__init__.py b/homeassistant/components/dhcp/__init__.py index 61208ac6423..3e4fd8fec01 100644 --- a/homeassistant/components/dhcp/__init__.py +++ b/homeassistant/components/dhcp/__init__.py @@ -276,6 +276,10 @@ class DHCPWatcher(WatcherBase): self._sniffer.stop() async def async_start(self): + """Start watching for dhcp packets.""" + await self.hass.async_add_executor_job(self._start) + + def _start(self): """Start watching for dhcp packets.""" # Local import because importing from scapy has side effects such as opening # sockets @@ -319,7 +323,7 @@ class DHCPWatcher(WatcherBase): conf.sniff_promisc = 0 try: - await self.hass.async_add_executor_job(_verify_l2socket_setup, FILTER) + _verify_l2socket_setup(FILTER) except (Scapy_Exception, OSError) as ex: if os.geteuid() == 0: _LOGGER.error("Cannot watch for dhcp packets: %s", ex) @@ -330,7 +334,7 @@ class DHCPWatcher(WatcherBase): return try: - await self.hass.async_add_executor_job(_verify_working_pcap, FILTER) + _verify_working_pcap(FILTER) except (Scapy_Exception, ImportError) as ex: _LOGGER.error( "Cannot watch for dhcp packets without a functional packet filter: %s", From d929faaeffa5cc05cbc4e72b980b1cd715bb9a0e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 9 Oct 2021 21:01:18 -1000 Subject: [PATCH 125/162] Remove executor calls in isy994 as its fully async (#57394) --- homeassistant/components/isy994/__init__.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/isy994/__init__.py b/homeassistant/components/isy994/__init__.py index 02bbea29bdb..a5ceeaea1d8 100644 --- a/homeassistant/components/isy994/__init__.py +++ b/homeassistant/components/isy994/__init__.py @@ -205,21 +205,18 @@ async def async_setup_entry( # Load platforms for the devices in the ISY controller that we support. hass.config_entries.async_setup_platforms(entry, PLATFORMS) - def _start_auto_update() -> None: - """Start isy auto update.""" - _LOGGER.debug("ISY Starting Event Stream and automatic updates") - isy.websocket.start() - - def _stop_auto_update(event) -> None: + @callback + def _async_stop_auto_update(event) -> None: """Stop the isy auto update on Home Assistant Shutdown.""" _LOGGER.debug("ISY Stopping Event Stream and automatic updates") isy.websocket.stop() - await hass.async_add_executor_job(_start_auto_update) + _LOGGER.debug("ISY Starting Event Stream and automatic updates") + isy.websocket.start() entry.async_on_unload(entry.add_update_listener(_async_update_listener)) entry.async_on_unload( - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _stop_auto_update) + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_stop_auto_update) ) # Register Integration-wide Services: From e92adde417a30bde5716815fccc77759e7bc0504 Mon Sep 17 00:00:00 2001 From: mvn23 Date: Sun, 10 Oct 2021 00:15:21 +0200 Subject: [PATCH 126/162] Fix default parameter values for service opentherm_gw.set_clock (#57397) --- homeassistant/components/opentherm_gw/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/opentherm_gw/__init__.py b/homeassistant/components/opentherm_gw/__init__.py index e3ec9ddef13..f54a0e783cc 100644 --- a/homeassistant/components/opentherm_gw/__init__.py +++ b/homeassistant/components/opentherm_gw/__init__.py @@ -156,8 +156,9 @@ def register_services(hass): vol.Required(ATTR_GW_ID): vol.All( cv.string, vol.In(hass.data[DATA_OPENTHERM_GW][DATA_GATEWAYS]) ), - vol.Optional(ATTR_DATE, default=date.today()): cv.date, - vol.Optional(ATTR_TIME, default=datetime.now().time()): cv.time, + # pylint: disable=unnecessary-lambda + vol.Optional(ATTR_DATE, default=lambda: date.today()): cv.date, + vol.Optional(ATTR_TIME, default=lambda: datetime.now().time()): cv.time, } ) service_set_control_setpoint_schema = vol.Schema( From 975b48859ee349a9a925b46560744f009e144b24 Mon Sep 17 00:00:00 2001 From: mvn23 Date: Sun, 10 Oct 2021 00:09:01 +0200 Subject: [PATCH 127/162] Fix `opentherm_gw.set_clock` `time` parameter name (#57398) --- homeassistant/components/opentherm_gw/services.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/opentherm_gw/services.yaml b/homeassistant/components/opentherm_gw/services.yaml index 02f2e71053f..fc0b0011d7c 100644 --- a/homeassistant/components/opentherm_gw/services.yaml +++ b/homeassistant/components/opentherm_gw/services.yaml @@ -54,7 +54,7 @@ set_clock: selector: text: time: - name: Name + name: Time description: Optional time in 24h format which will be provided to the thermostat. Defaults to the current time. example: "19:34" selector: From 7ed50bb9e6086da94e3863d816dddea7b9397f63 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 9 Oct 2021 21:01:45 -1000 Subject: [PATCH 128/162] Restore yeelight workaround for failing to update state after on/off (#57400) --- homeassistant/components/yeelight/__init__.py | 4 +- homeassistant/components/yeelight/light.py | 43 ++++++++++- tests/components/yeelight/test_light.py | 74 ++++++++++++++++++- 3 files changed, 116 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index a1dce44893b..fb908775d1b 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -36,8 +36,8 @@ from homeassistant.helpers.typing import ConfigType _LOGGER = logging.getLogger(__name__) -STATE_CHANGE_TIME = 0.25 # seconds - +STATE_CHANGE_TIME = 0.40 # seconds +POWER_STATE_CHANGE_TIME = 1 # seconds DOMAIN = "yeelight" DATA_YEELIGHT = DOMAIN diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 69dde0e75b6..67c9dc2ba07 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -38,6 +38,7 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.event import async_call_later import homeassistant.util.color as color_util from homeassistant.util.color import ( color_temperature_kelvin_to_mired as kelvin_to_mired, @@ -62,6 +63,7 @@ from . import ( DATA_DEVICE, DATA_UPDATED, DOMAIN, + POWER_STATE_CHANGE_TIME, YEELIGHT_FLOW_TRANSITION_SCHEMA, YeelightEntity, ) @@ -247,7 +249,7 @@ def _async_cmd(func): except BULB_NETWORK_EXCEPTIONS as ex: # A network error happened, the bulb is likely offline now self.device.async_mark_unavailable() - self.async_write_ha_state() + self.async_state_changed() exc_message = str(ex) or type(ex) raise HomeAssistantError( f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" @@ -419,13 +421,22 @@ class YeelightGenericLight(YeelightEntity, LightEntity): else: self._custom_effects = {} + self._unexpected_state_check = None + + @callback + def async_state_changed(self): + """Call when the device changes state.""" + if not self._device.available: + self._async_cancel_pending_state_check() + self.async_write_ha_state() + async def async_added_to_hass(self): """Handle entity which will be added.""" self.async_on_remove( async_dispatcher_connect( self.hass, DATA_UPDATED.format(self._device.host), - self.async_write_ha_state, + self.async_state_changed, ) ) await super().async_added_to_hass() @@ -760,6 +771,33 @@ class YeelightGenericLight(YeelightEntity, LightEntity): if self.config[CONF_SAVE_ON_CHANGE] and (brightness or colortemp or rgb): await self.async_set_default() + self._async_schedule_state_check(True) + + @callback + def _async_cancel_pending_state_check(self): + """Cancel a pending state check.""" + if self._unexpected_state_check: + self._unexpected_state_check() + self._unexpected_state_check = None + + @callback + def _async_schedule_state_check(self, expected_power_state): + """Schedule a poll if the change failed to get pushed back to us. + + Some devices (mainly nightlights) will not send back the on state + so we need to force a refresh. + """ + self._async_cancel_pending_state_check() + + async def _async_update_if_state_unexpected(*_): + self._unexpected_state_check = None + if self.is_on != expected_power_state: + await self.device.async_update(True) + + self._unexpected_state_check = async_call_later( + self.hass, POWER_STATE_CHANGE_TIME, _async_update_if_state_unexpected + ) + @_async_cmd async def _async_turn_off(self, duration) -> None: """Turn off with a given transition duration wrapped with _async_cmd.""" @@ -775,6 +813,7 @@ class YeelightGenericLight(YeelightEntity, LightEntity): duration = int(kwargs.get(ATTR_TRANSITION) * 1000) # kwarg in s await self._async_turn_off(duration) + self._async_schedule_state_check(False) @_async_cmd async def async_set_mode(self, mode: str): diff --git a/tests/components/yeelight/test_light.py b/tests/components/yeelight/test_light.py index fd6e12f2635..9c5a76e4a4b 100644 --- a/tests/components/yeelight/test_light.py +++ b/tests/components/yeelight/test_light.py @@ -1,5 +1,6 @@ """Test the Yeelight light.""" import asyncio +from datetime import timedelta import logging import socket from unittest.mock import ANY, AsyncMock, MagicMock, call, patch @@ -98,6 +99,7 @@ from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import entity_registry as er from homeassistant.setup import async_setup_component +from homeassistant.util import dt as dt_util from homeassistant.util.color import ( color_hs_to_RGB, color_hs_to_xy, @@ -121,7 +123,7 @@ from . import ( _patch_discovery_interval, ) -from tests.common import MockConfigEntry +from tests.common import MockConfigEntry, async_fire_time_changed CONFIG_ENTRY_DATA = { CONF_HOST: IP_ADDRESS, @@ -1377,3 +1379,73 @@ async def test_ambilight_with_nightlight_disabled(hass: HomeAssistant): assert state.state == "on" # bg_power off should not set the brightness to 0 assert state.attributes[ATTR_BRIGHTNESS] == 128 + + +async def test_state_fails_to_update_triggers_update(hass: HomeAssistant): + """Ensure we call async_get_properties if the turn on/off fails to update the state.""" + mocked_bulb = _mocked_bulb() + properties = {**PROPERTIES} + properties.pop("active_mode") + properties["color_mode"] = "3" # HSV + mocked_bulb.last_properties = properties + mocked_bulb.bulb_type = BulbType.Color + config_entry = MockConfigEntry( + domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: False} + ) + config_entry.add_to_hass(hass) + with _patch_discovery(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=mocked_bulb + ): + assert await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + # We use asyncio.create_task now to avoid + # blocking starting so we need to block again + await hass.async_block_till_done() + + assert len(mocked_bulb.async_get_properties.mock_calls) == 1 + + mocked_bulb.last_properties["power"] = "off" + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + { + ATTR_ENTITY_ID: ENTITY_LIGHT, + }, + blocking=True, + ) + assert len(mocked_bulb.async_turn_on.mock_calls) == 1 + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=1)) + await hass.async_block_till_done() + assert len(mocked_bulb.async_get_properties.mock_calls) == 2 + + mocked_bulb.last_properties["power"] = "on" + for _ in range(5): + await hass.services.async_call( + "light", + SERVICE_TURN_OFF, + { + ATTR_ENTITY_ID: ENTITY_LIGHT, + }, + blocking=True, + ) + assert len(mocked_bulb.async_turn_off.mock_calls) == 5 + # Even with five calls we only do one state request + # since each successive call should cancel the unexpected + # state check + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=2)) + await hass.async_block_till_done() + assert len(mocked_bulb.async_get_properties.mock_calls) == 3 + + # But if the state is correct no calls + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + { + ATTR_ENTITY_ID: ENTITY_LIGHT, + }, + blocking=True, + ) + assert len(mocked_bulb.async_turn_on.mock_calls) == 1 + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=3)) + await hass.async_block_till_done() + assert len(mocked_bulb.async_get_properties.mock_calls) == 3 From c01549999ae59f37ae2d0a939a77d7467adf06be Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Sun, 10 Oct 2021 22:39:34 +0300 Subject: [PATCH 129/162] Fix Shelly button filter empty event (#57427) --- homeassistant/components/shelly/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/shelly/__init__.py b/homeassistant/components/shelly/__init__.py index b0df4d4cb7f..2f1a178721f 100644 --- a/homeassistant/components/shelly/__init__.py +++ b/homeassistant/components/shelly/__init__.py @@ -275,7 +275,7 @@ class BlockDeviceWrapper(update_coordinator.DataUpdateCoordinator): if block.type != "device": continue - if block.wakeupEvent[0] == "button": + if len(block.wakeupEvent) == 1 and block.wakeupEvent[0] == "button": self._last_input_events_count[1] = -1 break From fc5a2e3e064429d56ebad023af317fc010c2840b Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Sun, 10 Oct 2021 22:39:57 +0300 Subject: [PATCH 130/162] Fix Shelly button type in roller mode (#57429) --- homeassistant/components/shelly/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/homeassistant/components/shelly/utils.py b/homeassistant/components/shelly/utils.py index 6f24b4a64be..783153e2746 100644 --- a/homeassistant/components/shelly/utils.py +++ b/homeassistant/components/shelly/utils.py @@ -133,6 +133,10 @@ def is_block_momentary_input(settings: dict[str, Any], block: Block) -> bool: if settings["device"]["type"] in SHBTN_MODELS: return True + if settings.get("mode") == "roller": + button_type = settings["rollers"][0]["button_type"] + return button_type in ["momentary", "momentary_on_release"] + button = settings.get("relays") or settings.get("lights") or settings.get("inputs") if button is None: return False From b102a45bdfa7b3d24924d8b27fd5c5457c8ae549 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 10 Oct 2021 16:40:17 -1000 Subject: [PATCH 131/162] Bump zeroconf to 0.36.8 (#57451) - Changelog: https://github.com/jstasiak/python-zeroconf/releases/tag/0.36.8 --- homeassistant/components/zeroconf/manifest.json | 2 +- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/zeroconf/manifest.json b/homeassistant/components/zeroconf/manifest.json index e38a8d92a94..e89697f2131 100644 --- a/homeassistant/components/zeroconf/manifest.json +++ b/homeassistant/components/zeroconf/manifest.json @@ -2,7 +2,7 @@ "domain": "zeroconf", "name": "Zero-configuration networking (zeroconf)", "documentation": "https://www.home-assistant.io/integrations/zeroconf", - "requirements": ["zeroconf==0.36.7"], + "requirements": ["zeroconf==0.36.8"], "dependencies": ["network", "api"], "codeowners": ["@bdraco"], "quality_scale": "internal", diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index d44f2536ea3..d02ed121618 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -32,7 +32,7 @@ sqlalchemy==1.4.23 voluptuous-serialize==2.4.0 voluptuous==0.12.2 yarl==1.6.3 -zeroconf==0.36.7 +zeroconf==0.36.8 pycryptodome>=3.6.6 diff --git a/requirements_all.txt b/requirements_all.txt index 0f269a7978c..dabaa995c00 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2474,7 +2474,7 @@ youtube_dl==2021.04.26 zengge==0.2 # homeassistant.components.zeroconf -zeroconf==0.36.7 +zeroconf==0.36.8 # homeassistant.components.zha zha-quirks==0.0.62 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7330ff51f1a..84eba6ada81 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1409,7 +1409,7 @@ yeelight==0.7.7 youless-api==0.13 # homeassistant.components.zeroconf -zeroconf==0.36.7 +zeroconf==0.36.8 # homeassistant.components.zha zha-quirks==0.0.62 From 862527782e6cb772f988079d8459c9e71b4c195e Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Mon, 11 Oct 2021 06:30:16 +0300 Subject: [PATCH 132/162] Fix netgear renamed mdi icons (#57431) --- homeassistant/components/netgear/const.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/netgear/const.py b/homeassistant/components/netgear/const.py index 325d9e68cd8..bfcf76a6119 100644 --- a/homeassistant/components/netgear/const.py +++ b/homeassistant/components/netgear/const.py @@ -35,7 +35,7 @@ DEVICE_ICONS = { 0: "mdi:access-point-network", # Router (Orbi ...) 1: "mdi:book-open-variant", # Amazon Kindle 2: "mdi:android", # Android Device - 3: "mdi:cellphone-android", # Android Phone + 3: "mdi:cellphone", # Android Phone 4: "mdi:tablet-android", # Android Tablet 5: "mdi:router-wireless", # Apple Airport Express 6: "mdi:disc-player", # Blu-ray Player @@ -46,15 +46,15 @@ DEVICE_ICONS = { 11: "mdi:play-network", # DVR 12: "mdi:gamepad-variant", # Gaming Console 13: "mdi:desktop-mac", # iMac - 14: "mdi:tablet-ipad", # iPad - 15: "mdi:tablet-ipad", # iPad Mini - 16: "mdi:cellphone-iphone", # iPhone 5/5S/5C - 17: "mdi:cellphone-iphone", # iPhone + 14: "mdi:tablet", # iPad + 15: "mdi:tablet", # iPad Mini + 16: "mdi:cellphone", # iPhone 5/5S/5C + 17: "mdi:cellphone", # iPhone 18: "mdi:ipod", # iPod Touch 19: "mdi:linux", # Linux PC 20: "mdi:apple-finder", # Mac Mini 21: "mdi:desktop-tower", # Mac Pro - 22: "mdi:laptop-mac", # MacBook + 22: "mdi:laptop", # MacBook 23: "mdi:play-network", # Media Device 24: "mdi:network", # Network Device 25: "mdi:play-network", # Other STB @@ -71,7 +71,7 @@ DEVICE_ICONS = { 36: "mdi:tablet", # Tablet 37: "mdi:desktop-classic", # UNIX PC 38: "mdi:desktop-tower-monitor", # Windows PC - 39: "mdi:laptop-windows", # Surface + 39: "mdi:laptop", # Surface 40: "mdi:access-point-network", # Wifi Extender - 41: "mdi:apple-airplay", # Apple TV + 41: "mdi:cast-variant", # Apple TV } From ce75c11033fcb6a5d20f7e8629c4d76377204675 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 10 Oct 2021 20:34:53 -0700 Subject: [PATCH 133/162] Bumped version to 2021.10.3 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 1281d39fad4..17e7abfdf53 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "2" +PATCH_VERSION: Final = "3" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From cbd6e7aa1ddca53ee03f4388accb37e0dee39af2 Mon Sep 17 00:00:00 2001 From: gjong Date: Mon, 11 Oct 2021 11:30:23 +0200 Subject: [PATCH 134/162] Upgrade youless library to fix missing sensor LS110 (#57366) --- homeassistant/components/youless/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/youless/manifest.json b/homeassistant/components/youless/manifest.json index 04a66d507ef..514c73fbd2c 100644 --- a/homeassistant/components/youless/manifest.json +++ b/homeassistant/components/youless/manifest.json @@ -3,7 +3,7 @@ "name": "YouLess", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/youless", - "requirements": ["youless-api==0.13"], + "requirements": ["youless-api==0.14"], "codeowners": ["@gjong"], "iot_class": "local_polling" } diff --git a/requirements_all.txt b/requirements_all.txt index dabaa995c00..f1bd89b0a13 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2465,7 +2465,7 @@ yeelight==0.7.7 yeelightsunflower==0.0.10 # homeassistant.components.youless -youless-api==0.13 +youless-api==0.14 # homeassistant.components.media_extractor youtube_dl==2021.04.26 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 84eba6ada81..94d55140558 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1406,7 +1406,7 @@ yalexs==1.1.13 yeelight==0.7.7 # homeassistant.components.youless -youless-api==0.13 +youless-api==0.14 # homeassistant.components.zeroconf zeroconf==0.36.8 From ca21447b13f100edfad1a221561afeca88fc09f9 Mon Sep 17 00:00:00 2001 From: starkillerOG Date: Mon, 11 Oct 2021 11:35:29 +0200 Subject: [PATCH 135/162] Fix Netgear orbi port in ssdp discovery (#57432) --- homeassistant/components/netgear/config_flow.py | 15 ++++++++++++--- homeassistant/components/netgear/const.py | 1 + tests/components/netgear/test_config_flow.py | 4 ++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/netgear/config_flow.py b/homeassistant/components/netgear/config_flow.py index 62985c7104c..871cba5a95d 100644 --- a/homeassistant/components/netgear/config_flow.py +++ b/homeassistant/components/netgear/config_flow.py @@ -17,7 +17,14 @@ from homeassistant.const import ( from homeassistant.core import callback from homeassistant.data_entry_flow import FlowResult -from .const import CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME, DEFAULT_NAME, DOMAIN +from .const import ( + CONF_CONSIDER_HOME, + DEFAULT_CONSIDER_HOME, + DEFAULT_NAME, + DOMAIN, + MODELS_V2, + ORBI_PORT, +) from .errors import CannotLoginException from .router import get_api @@ -133,8 +140,10 @@ class NetgearFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): await self.async_set_unique_id(discovery_info[ssdp.ATTR_UPNP_SERIAL]) self._abort_if_unique_id_configured(updates=updated_data) - if device_url.port: - updated_data[CONF_PORT] = device_url.port + updated_data[CONF_PORT] = DEFAULT_PORT + for model in MODELS_V2: + if discovery_info.get(ssdp.ATTR_UPNP_MODEL_NUMBER, "").startswith(model): + updated_data[CONF_PORT] = ORBI_PORT self.placeholders.update(updated_data) self.discovered = True diff --git a/homeassistant/components/netgear/const.py b/homeassistant/components/netgear/const.py index bfcf76a6119..cba2d7ff875 100644 --- a/homeassistant/components/netgear/const.py +++ b/homeassistant/components/netgear/const.py @@ -29,6 +29,7 @@ MODELS_V2 = [ "SXR", "SXS", ] +ORBI_PORT = 80 # Icons DEVICE_ICONS = { diff --git a/tests/components/netgear/test_config_flow.py b/tests/components/netgear/test_config_flow.py index de4f4fba510..ad060b60d36 100644 --- a/tests/components/netgear/test_config_flow.py +++ b/tests/components/netgear/test_config_flow.py @@ -7,7 +7,7 @@ import pytest from homeassistant import data_entry_flow from homeassistant.components import ssdp -from homeassistant.components.netgear.const import CONF_CONSIDER_HOME, DOMAIN +from homeassistant.components.netgear.const import CONF_CONSIDER_HOME, DOMAIN, ORBI_PORT from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_SSDP, SOURCE_USER from homeassistant.const import ( CONF_HOST, @@ -247,7 +247,7 @@ async def test_ssdp(hass, service): assert result["result"].unique_id == SERIAL assert result["title"] == TITLE assert result["data"].get(CONF_HOST) == HOST - assert result["data"].get(CONF_PORT) == PORT + assert result["data"].get(CONF_PORT) == ORBI_PORT assert result["data"].get(CONF_SSL) == SSL assert result["data"].get(CONF_USERNAME) == DEFAULT_USER assert result["data"][CONF_PASSWORD] == PASSWORD From 7b8b0d815a981e5d46cdcf4265fc82659bd6e536 Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Mon, 11 Oct 2021 09:35:26 +0200 Subject: [PATCH 136/162] Fix upnp creating derived sensors (#57436) --- homeassistant/components/upnp/__init__.py | 4 +++- homeassistant/components/upnp/binary_sensor.py | 6 ++++-- homeassistant/components/upnp/sensor.py | 14 ++++++++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/upnp/__init__.py b/homeassistant/components/upnp/__init__.py index 6db8b087378..d2d59d78c0e 100644 --- a/homeassistant/components/upnp/__init__.py +++ b/homeassistant/components/upnp/__init__.py @@ -198,6 +198,7 @@ class UpnpBinarySensorEntityDescription(BinarySensorEntityDescription): """A class that describes UPnP entities.""" format: str = "s" + unique_id: str | None = None @dataclass @@ -205,6 +206,7 @@ class UpnpSensorEntityDescription(SensorEntityDescription): """A class that describes a sensor UPnP entities.""" format: str = "s" + unique_id: str | None = None class UpnpDataUpdateCoordinator(DataUpdateCoordinator): @@ -250,7 +252,7 @@ class UpnpEntity(CoordinatorEntity): self._device = coordinator.device self.entity_description = entity_description self._attr_name = f"{coordinator.device.name} {entity_description.name}" - self._attr_unique_id = f"{coordinator.device.udn}_{entity_description.key}" + self._attr_unique_id = f"{coordinator.device.udn}_{entity_description.unique_id or entity_description.key}" self._attr_device_info = { "connections": {(dr.CONNECTION_UPNP, coordinator.device.udn)}, "name": coordinator.device.name, diff --git a/homeassistant/components/upnp/binary_sensor.py b/homeassistant/components/upnp/binary_sensor.py index 3bf9635c78b..c4e7264c34b 100644 --- a/homeassistant/components/upnp/binary_sensor.py +++ b/homeassistant/components/upnp/binary_sensor.py @@ -30,14 +30,16 @@ async def async_setup_entry( LOGGER.debug("Adding binary sensor") - async_add_entities( + entities = [ UpnpStatusBinarySensor( coordinator=coordinator, entity_description=entity_description, ) for entity_description in BINARYSENSOR_ENTITY_DESCRIPTIONS if coordinator.data.get(entity_description.key) is not None - ) + ] + LOGGER.debug("Adding entities: %s", entities) + async_add_entities(entities) class UpnpStatusBinarySensor(UpnpEntity, BinarySensorEntity): diff --git a/homeassistant/components/upnp/sensor.py b/homeassistant/components/upnp/sensor.py index 8ad8677b647..334dc9e8c22 100644 --- a/homeassistant/components/upnp/sensor.py +++ b/homeassistant/components/upnp/sensor.py @@ -15,6 +15,7 @@ from .const import ( DATA_RATE_PACKETS_PER_SECOND, DOMAIN, KIBIBYTE, + LOGGER, PACKETS_RECEIVED, PACKETS_SENT, ROUTER_IP, @@ -74,28 +75,32 @@ RAW_SENSORS: tuple[UpnpSensorEntityDescription, ...] = ( DERIVED_SENSORS: tuple[UpnpSensorEntityDescription, ...] = ( UpnpSensorEntityDescription( - key="KiB/sec_received", + key=BYTES_RECEIVED, + unique_id="KiB/sec_received", name=f"{DATA_RATE_KIBIBYTES_PER_SECOND} received", icon="mdi:server-network", native_unit_of_measurement=DATA_RATE_KIBIBYTES_PER_SECOND, format=".1f", ), UpnpSensorEntityDescription( - key="KiB/sent", + key=BYTES_SENT, + unique_id="KiB/sent", name=f"{DATA_RATE_KIBIBYTES_PER_SECOND} sent", icon="mdi:server-network", native_unit_of_measurement=DATA_RATE_KIBIBYTES_PER_SECOND, format=".1f", ), UpnpSensorEntityDescription( - key="packets/sec_received", + key=PACKETS_RECEIVED, + unique_id="packets/sec_received", name=f"{DATA_RATE_PACKETS_PER_SECOND} received", icon="mdi:server-network", native_unit_of_measurement=DATA_RATE_PACKETS_PER_SECOND, format=".1f", ), UpnpSensorEntityDescription( - key="packets/sent", + key=PACKETS_SENT, + unique_id="packets/sent", name=f"{DATA_RATE_PACKETS_PER_SECOND} sent", icon="mdi:server-network", native_unit_of_measurement=DATA_RATE_PACKETS_PER_SECOND, @@ -131,6 +136,7 @@ async def async_setup_entry( ] ) + LOGGER.debug("Adding entities: %s", entities) async_add_entities(entities) From fd657e597952b74a6a5fba71e4c43ff0d8994e5c Mon Sep 17 00:00:00 2001 From: Robert Hillis Date: Mon, 11 Oct 2021 05:36:53 -0400 Subject: [PATCH 137/162] Fix referenced before assignment in modem_callerid (#57460) --- homeassistant/components/modem_callerid/config_flow.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/modem_callerid/config_flow.py b/homeassistant/components/modem_callerid/config_flow.py index fbb68381c41..fd90f46d94a 100644 --- a/homeassistant/components/modem_callerid/config_flow.py +++ b/homeassistant/components/modem_callerid/config_flow.py @@ -62,6 +62,7 @@ class PhoneModemFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): self, user_input: dict[str, Any] | None = None ) -> FlowResult: """Handle a flow initiated by the user.""" + errors: dict[str, str] | None = {} if self._async_in_progress(): return self.async_abort(reason="already_in_progress") ports = await self.hass.async_add_executor_job(serial.tools.list_ports.comports) @@ -88,7 +89,7 @@ class PhoneModemFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): dev_path = await self.hass.async_add_executor_job( usb.get_serial_by_id, port.device ) - errors: dict | None = await self.validate_device_errors( + errors = await self.validate_device_errors( dev_path=dev_path, unique_id=_generate_unique_id(port) ) if errors is None: @@ -98,9 +99,7 @@ class PhoneModemFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): ) user_input = user_input or {} schema = vol.Schema({vol.Required(CONF_DEVICE): vol.In(unused_ports)}) - return self.async_show_form( - step_id="user", data_schema=schema, errors=errors or {} - ) + return self.async_show_form(step_id="user", data_schema=schema, errors=errors) async def async_step_import(self, config: dict[str, Any]) -> FlowResult: """Import a config entry from configuration.yaml.""" From 60d9bc68d9cae318f75fac9b4f70e91ce8c99a99 Mon Sep 17 00:00:00 2001 From: micha91 Date: Mon, 11 Oct 2021 11:34:37 +0200 Subject: [PATCH 138/162] Upgrade aiomusiccast to tolererate not decodable characters (#57461) --- homeassistant/components/yamaha_musiccast/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/yamaha_musiccast/manifest.json b/homeassistant/components/yamaha_musiccast/manifest.json index be52b8a4558..f7751dfe859 100644 --- a/homeassistant/components/yamaha_musiccast/manifest.json +++ b/homeassistant/components/yamaha_musiccast/manifest.json @@ -4,7 +4,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/yamaha_musiccast", "requirements": [ - "aiomusiccast==0.9.2" + "aiomusiccast==0.10.0" ], "ssdp": [ { diff --git a/requirements_all.txt b/requirements_all.txt index f1bd89b0a13..3f44272bf2f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -216,7 +216,7 @@ aiolyric==1.0.7 aiomodernforms==0.1.8 # homeassistant.components.yamaha_musiccast -aiomusiccast==0.9.2 +aiomusiccast==0.10.0 # homeassistant.components.nanoleaf aionanoleaf==0.0.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 94d55140558..d6e24b75288 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -143,7 +143,7 @@ aiolyric==1.0.7 aiomodernforms==0.1.8 # homeassistant.components.yamaha_musiccast -aiomusiccast==0.9.2 +aiomusiccast==0.10.0 # homeassistant.components.nanoleaf aionanoleaf==0.0.3 From 6db010f4ab0b2e36f64add11ab7afc46b0fd5003 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 12 Oct 2021 06:17:18 +0200 Subject: [PATCH 139/162] Detect if mysql and sqlite support row_number (#57475) --- homeassistant/components/recorder/__init__.py | 2 + .../components/recorder/statistics.py | 103 +++++++++++++----- homeassistant/components/recorder/util.py | 28 ++++- tests/components/recorder/test_util.py | 80 +++++++++++--- tests/components/sensor/test_recorder.py | 13 ++- 5 files changed, 180 insertions(+), 46 deletions(-) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 1b090c331a7..7e9bab0ed4e 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -413,6 +413,7 @@ class Recorder(threading.Thread): self.async_migration_event = asyncio.Event() self.migration_in_progress = False self._queue_watcher = None + self._db_supports_row_number = True self.enabled = True @@ -972,6 +973,7 @@ class Recorder(threading.Thread): def setup_recorder_connection(dbapi_connection, connection_record): """Dbapi specific connection settings.""" setup_connection_for_dialect( + self, self.engine.dialect.name, dbapi_connection, not self._completed_first_database_setup, diff --git a/homeassistant/components/recorder/statistics.py b/homeassistant/components/recorder/statistics.py index d253d1e2275..200da8d192d 100644 --- a/homeassistant/components/recorder/statistics.py +++ b/homeassistant/components/recorder/statistics.py @@ -89,6 +89,13 @@ QUERY_STATISTICS_SUMMARY_SUM = [ .label("rownum"), ] +QUERY_STATISTICS_SUMMARY_SUM_LEGACY = [ + StatisticsShortTerm.metadata_id, + StatisticsShortTerm.last_reset, + StatisticsShortTerm.state, + StatisticsShortTerm.sum, +] + QUERY_STATISTIC_META = [ StatisticsMeta.id, StatisticsMeta.statistic_id, @@ -275,37 +282,81 @@ def compile_hourly_statistics( } # Get last hour's last sum - subquery = ( - session.query(*QUERY_STATISTICS_SUMMARY_SUM) - .filter(StatisticsShortTerm.start >= bindparam("start_time")) - .filter(StatisticsShortTerm.start < bindparam("end_time")) - .subquery() - ) - query = ( - session.query(subquery) - .filter(subquery.c.rownum == 1) - .order_by(subquery.c.metadata_id) - ) - stats = execute(query.params(start_time=start_time, end_time=end_time)) + if instance._db_supports_row_number: # pylint: disable=[protected-access] + subquery = ( + session.query(*QUERY_STATISTICS_SUMMARY_SUM) + .filter(StatisticsShortTerm.start >= bindparam("start_time")) + .filter(StatisticsShortTerm.start < bindparam("end_time")) + .subquery() + ) + query = ( + session.query(subquery) + .filter(subquery.c.rownum == 1) + .order_by(subquery.c.metadata_id) + ) + stats = execute(query.params(start_time=start_time, end_time=end_time)) - if stats: - for stat in stats: - metadata_id, start, last_reset, state, _sum, _ = stat - if metadata_id in summary: - summary[metadata_id].update( - { + if stats: + for stat in stats: + metadata_id, start, last_reset, state, _sum, _ = stat + if metadata_id in summary: + summary[metadata_id].update( + { + "last_reset": process_timestamp(last_reset), + "state": state, + "sum": _sum, + } + ) + else: + summary[metadata_id] = { + "start": start_time, + "last_reset": process_timestamp(last_reset), + "state": state, + "sum": _sum, + } + else: + baked_query = instance.hass.data[STATISTICS_SHORT_TERM_BAKERY]( + lambda session: session.query(*QUERY_STATISTICS_SUMMARY_SUM_LEGACY) + ) + + baked_query += lambda q: q.filter( + StatisticsShortTerm.start >= bindparam("start_time") + ) + baked_query += lambda q: q.filter( + StatisticsShortTerm.start < bindparam("end_time") + ) + baked_query += lambda q: q.order_by( + StatisticsShortTerm.metadata_id, StatisticsShortTerm.start.desc() + ) + + stats = execute( + baked_query(session).params(start_time=start_time, end_time=end_time) + ) + + if stats: + for metadata_id, group in groupby(stats, lambda stat: stat["metadata_id"]): # type: ignore + ( + metadata_id, + last_reset, + state, + _sum, + ) = next(group) + if metadata_id in summary: + summary[metadata_id].update( + { + "start": start_time, + "last_reset": process_timestamp(last_reset), + "state": state, + "sum": _sum, + } + ) + else: + summary[metadata_id] = { + "start": start_time, "last_reset": process_timestamp(last_reset), "state": state, "sum": _sum, } - ) - else: - summary[metadata_id] = { - "start": start_time, - "last_reset": process_timestamp(last_reset), - "state": state, - "sum": _sum, - } # Insert compiled hourly statistics in the database for metadata_id, stat in summary.items(): diff --git a/homeassistant/components/recorder/util.py b/homeassistant/components/recorder/util.py index 101915c7117..567164d4325 100644 --- a/homeassistant/components/recorder/util.py +++ b/homeassistant/components/recorder/util.py @@ -266,7 +266,18 @@ def execute_on_connection(dbapi_connection, statement): cursor.close() -def setup_connection_for_dialect(dialect_name, dbapi_connection, first_connection): +def query_on_connection(dbapi_connection, statement): + """Execute a single statement with a dbapi connection and return the result.""" + cursor = dbapi_connection.cursor() + cursor.execute(statement) + result = cursor.fetchall() + cursor.close() + return result + + +def setup_connection_for_dialect( + instance, dialect_name, dbapi_connection, first_connection +): """Execute statements needed for dialect connection.""" # Returns False if the the connection needs to be setup # on the next connection, returns True if the connection @@ -280,6 +291,13 @@ def setup_connection_for_dialect(dialect_name, dbapi_connection, first_connectio # WAL mode only needs to be setup once # instead of every time we open the sqlite connection # as its persistent and isn't free to call every time. + result = query_on_connection(dbapi_connection, "SELECT sqlite_version()") + version = result[0][0] + major, minor, _patch = version.split(".", 2) + if int(major) == 3 and int(minor) < 25: + instance._db_supports_row_number = ( # pylint: disable=[protected-access] + False + ) # approximately 8MiB of memory execute_on_connection(dbapi_connection, "PRAGMA cache_size = -8192") @@ -289,6 +307,14 @@ def setup_connection_for_dialect(dialect_name, dbapi_connection, first_connectio if dialect_name == "mysql": execute_on_connection(dbapi_connection, "SET session wait_timeout=28800") + if first_connection: + result = query_on_connection(dbapi_connection, "SELECT VERSION()") + version = result[0][0] + major, minor, _patch = version.split(".", 2) + if int(major) == 5 and int(minor) < 8: + instance._db_supports_row_number = ( # pylint: disable=[protected-access] + False + ) def end_incomplete_runs(session, start_time): diff --git a/tests/components/recorder/test_util.py b/tests/components/recorder/test_util.py index f193993ffe5..8b5de5cff16 100644 --- a/tests/components/recorder/test_util.py +++ b/tests/components/recorder/test_util.py @@ -122,44 +122,88 @@ async def test_last_run_was_recently_clean(hass): ) -def test_setup_connection_for_dialect_mysql(): +@pytest.mark.parametrize( + "mysql_version, db_supports_row_number", + [ + ("10.0.0", True), + ("5.8.0", True), + ("5.7.0", False), + ], +) +def test_setup_connection_for_dialect_mysql(mysql_version, db_supports_row_number): """Test setting up the connection for a mysql dialect.""" - execute_mock = MagicMock() + instance_mock = MagicMock(_db_supports_row_number=True) + execute_args = [] close_mock = MagicMock() + def execute_mock(statement): + nonlocal execute_args + execute_args.append(statement) + + def fetchall_mock(): + nonlocal execute_args + if execute_args[-1] == "SELECT VERSION()": + return [[mysql_version]] + return None + def _make_cursor_mock(*_): - return MagicMock(execute=execute_mock, close=close_mock) + return MagicMock(execute=execute_mock, close=close_mock, fetchall=fetchall_mock) dbapi_connection = MagicMock(cursor=_make_cursor_mock) - util.setup_connection_for_dialect("mysql", dbapi_connection, True) + util.setup_connection_for_dialect(instance_mock, "mysql", dbapi_connection, True) - assert execute_mock.call_args[0][0] == "SET session wait_timeout=28800" + assert len(execute_args) == 2 + assert execute_args[0] == "SET session wait_timeout=28800" + assert execute_args[1] == "SELECT VERSION()" + + assert instance_mock._db_supports_row_number == db_supports_row_number -def test_setup_connection_for_dialect_sqlite(): +@pytest.mark.parametrize( + "sqlite_version, db_supports_row_number", + [ + ("3.25.0", True), + ("3.24.0", False), + ], +) +def test_setup_connection_for_dialect_sqlite(sqlite_version, db_supports_row_number): """Test setting up the connection for a sqlite dialect.""" - execute_mock = MagicMock() + instance_mock = MagicMock(_db_supports_row_number=True) + execute_args = [] close_mock = MagicMock() + def execute_mock(statement): + nonlocal execute_args + execute_args.append(statement) + + def fetchall_mock(): + nonlocal execute_args + if execute_args[-1] == "SELECT sqlite_version()": + return [[sqlite_version]] + return None + def _make_cursor_mock(*_): - return MagicMock(execute=execute_mock, close=close_mock) + return MagicMock(execute=execute_mock, close=close_mock, fetchall=fetchall_mock) dbapi_connection = MagicMock(cursor=_make_cursor_mock) - util.setup_connection_for_dialect("sqlite", dbapi_connection, True) + util.setup_connection_for_dialect(instance_mock, "sqlite", dbapi_connection, True) - assert len(execute_mock.call_args_list) == 3 - assert execute_mock.call_args_list[0][0][0] == "PRAGMA journal_mode=WAL" - assert execute_mock.call_args_list[1][0][0] == "PRAGMA cache_size = -8192" - assert execute_mock.call_args_list[2][0][0] == "PRAGMA foreign_keys=ON" + assert len(execute_args) == 4 + assert execute_args[0] == "PRAGMA journal_mode=WAL" + assert execute_args[1] == "SELECT sqlite_version()" + assert execute_args[2] == "PRAGMA cache_size = -8192" + assert execute_args[3] == "PRAGMA foreign_keys=ON" - execute_mock.reset_mock() - util.setup_connection_for_dialect("sqlite", dbapi_connection, False) + execute_args = [] + util.setup_connection_for_dialect(instance_mock, "sqlite", dbapi_connection, False) - assert len(execute_mock.call_args_list) == 2 - assert execute_mock.call_args_list[0][0][0] == "PRAGMA cache_size = -8192" - assert execute_mock.call_args_list[1][0][0] == "PRAGMA foreign_keys=ON" + assert len(execute_args) == 2 + assert execute_args[0] == "PRAGMA cache_size = -8192" + assert execute_args[1] == "PRAGMA foreign_keys=ON" + + assert instance_mock._db_supports_row_number == db_supports_row_number def test_basic_sanity_check(hass_recorder): diff --git a/tests/components/sensor/test_recorder.py b/tests/components/sensor/test_recorder.py index 9ae4b467da5..8a0da39cde3 100644 --- a/tests/components/sensor/test_recorder.py +++ b/tests/components/sensor/test_recorder.py @@ -1806,7 +1806,13 @@ def test_compile_hourly_statistics_changing_statistics( assert "Error while processing event StatisticsTask" not in caplog.text -def test_compile_statistics_hourly_summary(hass_recorder, caplog): +@pytest.mark.parametrize( + "db_supports_row_number,in_log,not_in_log", + [(True, "row_number", None), (False, None, "row_number")], +) +def test_compile_statistics_hourly_summary( + hass_recorder, caplog, db_supports_row_number, in_log, not_in_log +): """Test compiling hourly statistics.""" zero = dt_util.utcnow() zero = zero.replace(minute=0, second=0, microsecond=0) @@ -1815,6 +1821,7 @@ def test_compile_statistics_hourly_summary(hass_recorder, caplog): zero += timedelta(hours=1) hass = hass_recorder() recorder = hass.data[DATA_INSTANCE] + recorder._db_supports_row_number = db_supports_row_number setup_component(hass, "sensor", {}) attributes = { "device_class": None, @@ -2052,6 +2059,10 @@ def test_compile_statistics_hourly_summary(hass_recorder, caplog): end += timedelta(hours=1) assert stats == expected_stats assert "Error while processing event StatisticsTask" not in caplog.text + if in_log: + assert in_log in caplog.text + if not_in_log: + assert not_in_log not in caplog.text def record_states(hass, zero, entity_id, attributes, seq=None): From 989807dc89b9c8a881a1e55810fc96054fc884c4 Mon Sep 17 00:00:00 2001 From: chpego <38792705+chpego@users.noreply.github.com> Date: Mon, 11 Oct 2021 20:07:23 +0200 Subject: [PATCH 140/162] Bump youtube-dl to 2021.06.06 (#57490) --- homeassistant/components/media_extractor/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/media_extractor/manifest.json b/homeassistant/components/media_extractor/manifest.json index d7dd665b9d9..69c4b3782c2 100644 --- a/homeassistant/components/media_extractor/manifest.json +++ b/homeassistant/components/media_extractor/manifest.json @@ -2,7 +2,7 @@ "domain": "media_extractor", "name": "Media Extractor", "documentation": "https://www.home-assistant.io/integrations/media_extractor", - "requirements": ["youtube_dl==2021.04.26"], + "requirements": ["youtube_dl==2021.06.06"], "dependencies": ["media_player"], "codeowners": [], "quality_scale": "internal", diff --git a/requirements_all.txt b/requirements_all.txt index 3f44272bf2f..bd074b3c2c0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2468,7 +2468,7 @@ yeelightsunflower==0.0.10 youless-api==0.14 # homeassistant.components.media_extractor -youtube_dl==2021.04.26 +youtube_dl==2021.06.06 # homeassistant.components.zengge zengge==0.2 From a07a2a1120b3da82f8d1969124bf90b274f64f3c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 11 Oct 2021 17:30:23 -1000 Subject: [PATCH 141/162] Simplify yeelight setup to improve reliability (#57500) --- homeassistant/components/yeelight/__init__.py | 167 +++++------------- tests/components/yeelight/test_init.py | 56 ++++-- 2 files changed, 86 insertions(+), 137 deletions(-) diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index fb908775d1b..64fa7b01f28 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -26,10 +26,7 @@ from homeassistant.const import ( ) from homeassistant.core import HomeAssistant, callback import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.dispatcher import ( - async_dispatcher_connect, - async_dispatcher_send, -) +from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.entity import DeviceInfo, Entity from homeassistant.helpers.event import async_call_later, async_track_time_interval from homeassistant.helpers.typing import ConfigType @@ -42,7 +39,6 @@ POWER_STATE_CHANGE_TIME = 1 # seconds DOMAIN = "yeelight" DATA_YEELIGHT = DOMAIN DATA_UPDATED = "yeelight_{}_data_updated" -DEVICE_INITIALIZED = "yeelight_{}_device_initialized" DEFAULT_NAME = "Yeelight" DEFAULT_TRANSITION = 350 @@ -203,24 +199,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def _async_initialize( hass: HomeAssistant, entry: ConfigEntry, - host: str, - device: YeelightDevice | None = None, + device: YeelightDevice, ) -> None: - entry_data = hass.data[DOMAIN][DATA_CONFIG_ENTRIES][entry.entry_id] = { - DATA_PLATFORMS_LOADED: False - } - - @callback - def _async_load_platforms(): - if entry_data[DATA_PLATFORMS_LOADED]: - return - entry_data[DATA_PLATFORMS_LOADED] = True - hass.config_entries.async_setup_platforms(entry, PLATFORMS) - - if not device: - # get device and start listening for local pushes - device = await _async_get_device(hass, host, entry) - + entry_data = hass.data[DOMAIN][DATA_CONFIG_ENTRIES][entry.entry_id] = {} await device.async_setup() entry_data[DATA_DEVICE] = device @@ -232,15 +213,9 @@ async def _async_initialize( entry, options={**entry.options, CONF_MODEL: device.capabilities["model"]} ) - entry.async_on_unload(entry.add_update_listener(_async_update_listener)) - entry.async_on_unload( - async_dispatcher_connect( - hass, DEVICE_INITIALIZED.format(host), _async_load_platforms - ) - ) - # fetch initial state - asyncio.create_task(device.async_update()) + await device.async_update() + entry.async_on_unload(entry.add_update_listener(_async_update_listener)) @callback @@ -256,7 +231,7 @@ def _async_normalize_config_entry(hass: HomeAssistant, entry: ConfigEntry) -> No entry, data={ CONF_HOST: entry.data.get(CONF_HOST), - CONF_ID: entry.data.get(CONF_ID, entry.unique_id), + CONF_ID: entry.data.get(CONF_ID) or entry.unique_id, }, options={ CONF_NAME: entry.data.get(CONF_NAME, ""), @@ -270,68 +245,44 @@ def _async_normalize_config_entry(hass: HomeAssistant, entry: ConfigEntry) -> No CONF_NIGHTLIGHT_SWITCH, DEFAULT_NIGHTLIGHT_SWITCH ), }, + unique_id=entry.unique_id or entry.data.get(CONF_ID), ) elif entry.unique_id and not entry.data.get(CONF_ID): hass.config_entries.async_update_entry( entry, data={CONF_HOST: entry.data.get(CONF_HOST), CONF_ID: entry.unique_id}, ) + elif entry.data.get(CONF_ID) and not entry.unique_id: + hass.config_entries.async_update_entry( + entry, + unique_id=entry.data[CONF_ID], + ) async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Yeelight from a config entry.""" _async_normalize_config_entry(hass, entry) - if entry.data.get(CONF_HOST): - try: - device = await _async_get_device(hass, entry.data[CONF_HOST], entry) - except BULB_EXCEPTIONS as ex: - # Always retry later since bulbs can stop responding to SSDP - # sometimes even though they are online. If it has changed - # IP we will update it via discovery to the config flow - raise ConfigEntryNotReady from ex - else: - # Since device is passed this cannot throw an exception anymore - await _async_initialize(hass, entry, entry.data[CONF_HOST], device=device) - return True + if not entry.data.get(CONF_HOST): + bulb_id = async_format_id(entry.data.get(CONF_ID, entry.unique_id)) + raise ConfigEntryNotReady(f"Waiting for {bulb_id} to be discovered") - async def _async_from_discovery(capabilities: dict[str, str]) -> None: - host = urlparse(capabilities["location"]).hostname - try: - await _async_initialize(hass, entry, host) - except BULB_EXCEPTIONS: - _LOGGER.exception("Failed to connect to bulb at %s", host) + try: + device = await _async_get_device(hass, entry.data[CONF_HOST], entry) + await _async_initialize(hass, entry, device) + except BULB_EXCEPTIONS as ex: + raise ConfigEntryNotReady from ex + + hass.config_entries.async_setup_platforms(entry, PLATFORMS) - scanner = YeelightScanner.async_get(hass) - await scanner.async_register_callback(entry.data[CONF_ID], _async_from_discovery) return True async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload a config entry.""" - if entry.data.get(CONF_ID): - # discovery - scanner = YeelightScanner.async_get(hass) - scanner.async_unregister_callback(entry.data[CONF_ID]) - data_config_entries = hass.data[DOMAIN][DATA_CONFIG_ENTRIES] - if entry.entry_id not in data_config_entries: - # Device not online - return True - - entry_data = data_config_entries[entry.entry_id] - unload_ok = True - if entry_data[DATA_PLATFORMS_LOADED]: - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - - if DATA_DEVICE in entry_data: - device = entry_data[DATA_DEVICE] - _LOGGER.debug("Shutting down Yeelight Listener") - await device.bulb.async_stop_listening() - _LOGGER.debug("Yeelight Listener stopped") - data_config_entries.pop(entry.entry_id) - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) @callback @@ -380,7 +331,6 @@ class YeelightScanner: def __init__(self, hass: HomeAssistant) -> None: """Initialize class.""" self._hass = hass - self._callbacks = {} self._host_discovered_events = {} self._unique_id_capabilities = {} self._host_capabilities = {} @@ -391,7 +341,7 @@ class YeelightScanner: async def async_setup(self): """Set up the scanner.""" if self._connected_events: - await asyncio.gather(*(event.wait() for event in self._connected_events)) + await self._async_wait_connected() return for idx, source_ip in enumerate(await self._async_build_source_set()): @@ -434,9 +384,16 @@ class YeelightScanner: for listener in failed_listeners: self._listeners.remove(listener) - await asyncio.gather(*(event.wait() for event in self._connected_events)) + await self._async_wait_connected() + self._track_interval = async_track_time_interval( + self._hass, self.async_scan, DISCOVERY_INTERVAL + ) self.async_scan() + async def _async_wait_connected(self): + """Wait for the listeners to be up and connected.""" + await asyncio.gather(*(event.wait() for event in self._connected_events)) + async def _async_build_source_set(self) -> set[IPv4Address]: """Build the list of ssdp sources.""" adapters = await network.async_get_adapters(self._hass) @@ -453,6 +410,7 @@ class YeelightScanner: async def async_discover(self): """Discover bulbs.""" + _LOGGER.debug("Yeelight discover with interval %s", DISCOVERY_SEARCH_INTERVAL) await self.async_setup() for _ in range(DISCOVERY_ATTEMPTS): self.async_scan() @@ -513,45 +471,6 @@ class YeelightScanner: self._unique_id_capabilities[unique_id] = response for event in self._host_discovered_events.get(host, []): event.set() - if unique_id in self._callbacks: - self._hass.async_create_task(self._callbacks[unique_id](response)) - self._callbacks.pop(unique_id) - if not self._callbacks: - self._async_stop_scan() - - async def _async_start_scan(self): - """Start scanning for Yeelight devices.""" - _LOGGER.debug("Start scanning") - await self.async_setup() - if not self._track_interval: - self._track_interval = async_track_time_interval( - self._hass, self.async_scan, DISCOVERY_INTERVAL - ) - self.async_scan() - - @callback - def _async_stop_scan(self): - """Stop scanning.""" - if self._track_interval is None: - return - _LOGGER.debug("Stop scanning interval") - self._track_interval() - self._track_interval = None - - async def async_register_callback(self, unique_id, callback_func): - """Register callback function.""" - if capabilities := self._unique_id_capabilities.get(unique_id): - self._hass.async_create_task(callback_func(capabilities)) - return - self._callbacks[unique_id] = callback_func - await self._async_start_scan() - - @callback - def async_unregister_callback(self, unique_id): - """Unregister callback function.""" - self._callbacks.pop(unique_id, None) - if not self._callbacks: - self._async_stop_scan() def update_needs_bg_power_workaround(data): @@ -675,7 +594,6 @@ class YeelightDevice: self._available = True if not self._initialized: self._initialized = True - async_dispatcher_send(self._hass, DEVICE_INITIALIZED.format(self._host)) except BULB_NETWORK_EXCEPTIONS as ex: if self._available: # just inform once _LOGGER.error( @@ -725,9 +643,6 @@ class YeelightDevice: ): # On reconnect the properties may be out of sync # - # We need to make sure the DEVICE_INITIALIZED dispatcher is setup - # before we can update on reconnect by checking self._did_first_update - # # If the device drops the connection right away, we do not want to # do a property resync via async_update since its about # to be called when async_setup_entry reaches the end of the @@ -743,10 +658,7 @@ class YeelightEntity(Entity): def __init__(self, device: YeelightDevice, entry: ConfigEntry) -> None: """Initialize the entity.""" self._device = device - self._unique_id = entry.entry_id - if entry.unique_id is not None: - # Use entry unique id (device id) whenever possible - self._unique_id = entry.unique_id + self._unique_id = entry.unique_id or entry.entry_id @property def unique_id(self) -> str: @@ -794,12 +706,19 @@ async def _async_get_device( # register stop callback to shutdown listening for local pushes async def async_stop_listen_task(event): - """Stop listen thread.""" - _LOGGER.debug("Shutting down Yeelight Listener") + """Stop listen task.""" + _LOGGER.debug("Shutting down Yeelight Listener (stop event)") await device.bulb.async_stop_listening() + @callback + def _async_stop_listen_on_unload(): + """Stop listen task.""" + _LOGGER.debug("Shutting down Yeelight Listener (unload)") + hass.async_create_task(device.bulb.async_stop_listening()) + entry.async_on_unload( hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, async_stop_listen_task) ) + entry.async_on_unload(_async_stop_listen_on_unload) return device diff --git a/tests/components/yeelight/test_init.py b/tests/components/yeelight/test_init.py index 3ad99fa34ac..7ddb2845ac8 100644 --- a/tests/components/yeelight/test_init.py +++ b/tests/components/yeelight/test_init.py @@ -111,7 +111,9 @@ async def test_ip_changes_id_missing_cannot_fallback(hass: HomeAssistant): async def test_setup_discovery(hass: HomeAssistant): """Test setting up Yeelight by discovery.""" - config_entry = MockConfigEntry(domain=DOMAIN, data=CONFIG_ENTRY_DATA) + config_entry = MockConfigEntry( + domain=DOMAIN, data={CONF_HOST: IP_ADDRESS, **CONFIG_ENTRY_DATA} + ) config_entry.add_to_hass(hass) mocked_bulb = _mocked_bulb() @@ -151,7 +153,9 @@ async def test_setup_discovery_with_manually_configured_network_adapter( hass: HomeAssistant, ): """Test setting up Yeelight by discovery with a manually configured network adapter.""" - config_entry = MockConfigEntry(domain=DOMAIN, data=CONFIG_ENTRY_DATA) + config_entry = MockConfigEntry( + domain=DOMAIN, data={CONF_HOST: IP_ADDRESS, **CONFIG_ENTRY_DATA} + ) config_entry.add_to_hass(hass) mocked_bulb = _mocked_bulb() @@ -205,7 +209,9 @@ async def test_setup_discovery_with_manually_configured_network_adapter_one_fail hass: HomeAssistant, caplog ): """Test setting up Yeelight by discovery with a manually configured network adapter with one that fails to bind.""" - config_entry = MockConfigEntry(domain=DOMAIN, data=CONFIG_ENTRY_DATA) + config_entry = MockConfigEntry( + domain=DOMAIN, data={CONF_HOST: IP_ADDRESS, **CONFIG_ENTRY_DATA} + ) config_entry.add_to_hass(hass) mocked_bulb = _mocked_bulb() @@ -268,7 +274,7 @@ async def test_unique_ids_device(hass: HomeAssistant): """Test Yeelight unique IDs from yeelight device IDs.""" config_entry = MockConfigEntry( domain=DOMAIN, - data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: True}, + data={CONF_HOST: IP_ADDRESS, **CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: True}, unique_id=ID, ) config_entry.add_to_hass(hass) @@ -292,7 +298,8 @@ async def test_unique_ids_device(hass: HomeAssistant): async def test_unique_ids_entry(hass: HomeAssistant): """Test Yeelight unique IDs from entry IDs.""" config_entry = MockConfigEntry( - domain=DOMAIN, data={**CONFIG_ENTRY_DATA, CONF_NIGHTLIGHT_SWITCH: True} + domain=DOMAIN, + data={CONF_HOST: IP_ADDRESS, CONF_NIGHTLIGHT_SWITCH: True}, ) config_entry.add_to_hass(hass) @@ -357,18 +364,16 @@ async def test_async_listen_error_late_discovery(hass, caplog): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert config_entry.state is ConfigEntryState.LOADED - assert "Failed to connect to bulb at" in caplog.text - await hass.config_entries.async_unload(config_entry.entry_id) + assert config_entry.state is ConfigEntryState.SETUP_RETRY await hass.async_block_till_done() - - caplog.clear() + assert "Waiting for 0x15243f to be discovered" in caplog.text with _patch_discovery(), patch(f"{MODULE}.AsyncBulb", return_value=_mocked_bulb()): - await hass.config_entries.async_setup(config_entry.entry_id) + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=5)) + await hass.async_block_till_done() + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=10)) await hass.async_block_till_done() - assert "Failed to connect to bulb at" not in caplog.text assert config_entry.state is ConfigEntryState.LOADED assert config_entry.options[CONF_MODEL] == MODEL @@ -386,7 +391,7 @@ async def test_unload_before_discovery(hass, caplog): await hass.config_entries.async_setup(config_entry.entry_id) await hass.async_block_till_done() - assert config_entry.state is ConfigEntryState.LOADED + assert config_entry.state is ConfigEntryState.SETUP_RETRY await hass.config_entries.async_unload(config_entry.entry_id) await hass.async_block_till_done() @@ -451,6 +456,31 @@ async def test_async_setup_with_missing_id(hass: HomeAssistant): assert config_entry.state is ConfigEntryState.LOADED +async def test_async_setup_with_missing_unique_id(hass: HomeAssistant): + """Test that setting adds the missing unique_id from CONF_ID.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_HOST: "127.0.0.1", CONF_ID: ID}, + options={CONF_NAME: "Test name"}, + ) + config_entry.add_to_hass(hass) + + with _patch_discovery(), _patch_discovery_timeout(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=_mocked_bulb(cannot_connect=True) + ): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + assert config_entry.state is ConfigEntryState.SETUP_RETRY + assert config_entry.unique_id == ID + + with _patch_discovery(), _patch_discovery_timeout(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=_mocked_bulb() + ): + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=2)) + await hass.async_block_till_done() + assert config_entry.state is ConfigEntryState.LOADED + + async def test_connection_dropped_resyncs_properties(hass: HomeAssistant): """Test handling a connection drop results in a property resync.""" config_entry = MockConfigEntry( From acb6c4ea1de10c6193b20f72712045202d726315 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 11 Oct 2021 22:37:03 -0700 Subject: [PATCH 142/162] Bumped version to 2021.10.4 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 17e7abfdf53..2bd8a2e7719 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "3" +PATCH_VERSION: Final = "4" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 6193b31072063daed41b62674d46e73a07ff27bb Mon Sep 17 00:00:00 2001 From: Michael Chisholm Date: Sat, 16 Oct 2021 04:24:04 +1100 Subject: [PATCH 143/162] Log reason for DLNA-DMR device becoming unavailable (#57516) --- homeassistant/components/dlna_dmr/media_player.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/dlna_dmr/media_player.py b/homeassistant/components/dlna_dmr/media_player.py index 8542464e41e..809ab71671b 100644 --- a/homeassistant/components/dlna_dmr/media_player.py +++ b/homeassistant/components/dlna_dmr/media_player.py @@ -404,8 +404,8 @@ class DlnaDmrEntity(MediaPlayerEntity): try: do_ping = self.poll_availability or self.check_available await self._device.async_update(do_ping=do_ping) - except UpnpError: - _LOGGER.debug("Device unavailable") + except UpnpError as err: + _LOGGER.debug("Device unavailable: %r", err) await self._device_disconnect() return finally: From 06844ee2debb4cb7caa054107863d1d63c7974e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hjelseth=20H=C3=B8yer?= Date: Tue, 12 Oct 2021 12:09:12 +0200 Subject: [PATCH 144/162] Bump Mill library to 0.6.2 (#57533) --- homeassistant/components/mill/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/mill/manifest.json b/homeassistant/components/mill/manifest.json index e5dbbdfc1e8..55aeec305fb 100644 --- a/homeassistant/components/mill/manifest.json +++ b/homeassistant/components/mill/manifest.json @@ -2,7 +2,7 @@ "domain": "mill", "name": "Mill", "documentation": "https://www.home-assistant.io/integrations/mill", - "requirements": ["millheater==0.6.1"], + "requirements": ["millheater==0.6.2"], "codeowners": ["@danielhiversen"], "config_flow": true, "iot_class": "cloud_polling" diff --git a/requirements_all.txt b/requirements_all.txt index bd074b3c2c0..c7895f43f9f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1005,7 +1005,7 @@ micloud==0.3 miflora==0.7.0 # homeassistant.components.mill -millheater==0.6.1 +millheater==0.6.2 # homeassistant.components.minio minio==4.0.9 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index d6e24b75288..17e75fcaa13 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -585,7 +585,7 @@ mficlient==0.3.0 micloud==0.3 # homeassistant.components.mill -millheater==0.6.1 +millheater==0.6.2 # homeassistant.components.minio minio==4.0.9 From 599a94fda6b756cb6fb3e58d81b3e5ea8e7fb7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mark=20M=C3=A4kinen?= Date: Tue, 12 Oct 2021 19:35:35 +0300 Subject: [PATCH 145/162] Fix Fast.com autoupdate (#57552) --- homeassistant/components/fastdotcom/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/fastdotcom/__init__.py b/homeassistant/components/fastdotcom/__init__.py index f2424332a01..34c8bda2c6c 100644 --- a/homeassistant/components/fastdotcom/__init__.py +++ b/homeassistant/components/fastdotcom/__init__.py @@ -1,7 +1,7 @@ """Support for testing internet speed via Fast.com.""" from __future__ import annotations -from datetime import timedelta +from datetime import datetime, timedelta import logging from typing import Any @@ -67,7 +67,7 @@ class SpeedtestData: self.data: dict[str, Any] | None = None self._hass = hass - def update(self) -> None: + def update(self, now: datetime | None = None) -> None: """Get the latest data from fast.com.""" _LOGGER.debug("Executing fast.com speedtest") From 1235493a0e2d8f7cff2a87e17dbfd2261e3224e3 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Tue, 12 Oct 2021 12:35:10 -0600 Subject: [PATCH 146/162] Bump simplisafe-python to 11.0.7 (#57573) --- homeassistant/components/simplisafe/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/simplisafe/manifest.json b/homeassistant/components/simplisafe/manifest.json index c6bc3ae61fa..8b610c6c28c 100644 --- a/homeassistant/components/simplisafe/manifest.json +++ b/homeassistant/components/simplisafe/manifest.json @@ -3,7 +3,7 @@ "name": "SimpliSafe", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/simplisafe", - "requirements": ["simplisafe-python==11.0.6"], + "requirements": ["simplisafe-python==11.0.7"], "codeowners": ["@bachya"], "iot_class": "cloud_polling" } diff --git a/requirements_all.txt b/requirements_all.txt index c7895f43f9f..53478299c71 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2149,7 +2149,7 @@ simplehound==0.3 simplepush==1.1.4 # homeassistant.components.simplisafe -simplisafe-python==11.0.6 +simplisafe-python==11.0.7 # homeassistant.components.sisyphus sisyphus-control==3.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 17e75fcaa13..c21268d5437 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1224,7 +1224,7 @@ sharkiqpy==0.1.8 simplehound==0.3 # homeassistant.components.simplisafe -simplisafe-python==11.0.6 +simplisafe-python==11.0.7 # homeassistant.components.slack slackclient==2.5.0 From 39091b01c67d5b4926950b7d681d79f82b2cb5da Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 14 Oct 2021 20:19:39 +0200 Subject: [PATCH 147/162] Correct detection of row_number support for MariaDB (#57663) --- homeassistant/components/recorder/util.py | 4 +++- tests/components/recorder/test_util.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/recorder/util.py b/homeassistant/components/recorder/util.py index 567164d4325..8277f86e9f9 100644 --- a/homeassistant/components/recorder/util.py +++ b/homeassistant/components/recorder/util.py @@ -311,7 +311,9 @@ def setup_connection_for_dialect( result = query_on_connection(dbapi_connection, "SELECT VERSION()") version = result[0][0] major, minor, _patch = version.split(".", 2) - if int(major) == 5 and int(minor) < 8: + if (int(major) == 5 and int(minor) < 8) or ( + int(major) == 10 and int(minor) < 2 + ): instance._db_supports_row_number = ( # pylint: disable=[protected-access] False ) diff --git a/tests/components/recorder/test_util.py b/tests/components/recorder/test_util.py index 8b5de5cff16..ff690e24279 100644 --- a/tests/components/recorder/test_util.py +++ b/tests/components/recorder/test_util.py @@ -125,7 +125,8 @@ async def test_last_run_was_recently_clean(hass): @pytest.mark.parametrize( "mysql_version, db_supports_row_number", [ - ("10.0.0", True), + ("10.2.0", True), + ("10.1.0", False), ("5.8.0", True), ("5.7.0", False), ], From 3d1cbe40ace80413be4b661e52faded0991e1f70 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Thu, 14 Oct 2021 12:21:44 -0600 Subject: [PATCH 148/162] Ensure Notion device name is stored as a string (#57670) --- homeassistant/components/notion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/notion/__init__.py b/homeassistant/components/notion/__init__.py index c9f4131be1a..2fb9339955a 100644 --- a/homeassistant/components/notion/__init__.py +++ b/homeassistant/components/notion/__init__.py @@ -151,7 +151,7 @@ class NotionEntity(CoordinatorEntity): "identifiers": {(DOMAIN, sensor["hardware_id"])}, "manufacturer": "Silicon Labs", "model": sensor["hardware_revision"], - "name": sensor["name"], + "name": str(sensor["name"]), "sw_version": sensor["firmware_version"], "via_device": (DOMAIN, bridge.get("hardware_id")), } From 51e204a55b02918a6a70d46ab1b5127a1c06324b Mon Sep 17 00:00:00 2001 From: Peter Nijssen Date: Thu, 14 Oct 2021 23:11:07 +0200 Subject: [PATCH 149/162] Bump spiderpy to 1.4.3 (#57675) --- homeassistant/components/spider/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/spider/manifest.json b/homeassistant/components/spider/manifest.json index ced19db39c7..d25d2c97901 100644 --- a/homeassistant/components/spider/manifest.json +++ b/homeassistant/components/spider/manifest.json @@ -2,7 +2,7 @@ "domain": "spider", "name": "Itho Daalderop Spider", "documentation": "https://www.home-assistant.io/integrations/spider", - "requirements": ["spiderpy==1.4.2"], + "requirements": ["spiderpy==1.4.3"], "codeowners": ["@peternijssen"], "config_flow": true, "iot_class": "cloud_polling" diff --git a/requirements_all.txt b/requirements_all.txt index 53478299c71..923ebd15422 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2214,7 +2214,7 @@ speak2mary==1.4.0 speedtest-cli==2.1.3 # homeassistant.components.spider -spiderpy==1.4.2 +spiderpy==1.4.3 # homeassistant.components.spotify spotipy==2.18.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c21268d5437..c4b80b8657d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1263,7 +1263,7 @@ speak2mary==1.4.0 speedtest-cli==2.1.3 # homeassistant.components.spider -spiderpy==1.4.2 +spiderpy==1.4.3 # homeassistant.components.spotify spotipy==2.18.0 From a6590549ff97749a79b1f184726f12e2bd1ea3d2 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Fri, 15 Oct 2021 03:48:28 +0300 Subject: [PATCH 150/162] Fix Shelly humidity sensor available condition (#57721) --- homeassistant/components/shelly/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/shelly/sensor.py b/homeassistant/components/shelly/sensor.py index 9ee0712aaef..684d20f6832 100644 --- a/homeassistant/components/shelly/sensor.py +++ b/homeassistant/components/shelly/sensor.py @@ -182,7 +182,7 @@ SENSORS: Final = { value=lambda value: round(value, 1), device_class=sensor.DEVICE_CLASS_HUMIDITY, state_class=sensor.STATE_CLASS_MEASUREMENT, - available=lambda block: cast(int, block.extTemp) != 999, + available=lambda block: cast(int, block.humidity) != 999, ), ("sensor", "luminosity"): BlockAttributeDescription( name="Luminosity", From 1e8030b53ec04adcaae82ccc3bbddd72cc0e7404 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 15 Oct 2021 06:37:13 -1000 Subject: [PATCH 151/162] Reconnect and retry yeelight commands after previous wifi drop out (#57741) --- homeassistant/components/yeelight/__init__.py | 17 ++++--- homeassistant/components/yeelight/light.py | 48 +++++++++++------- .../components/yeelight/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/yeelight/test_init.py | 50 +++++++++++++++++++ 6 files changed, 92 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index 64fa7b01f28..a1463daed12 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -6,7 +6,6 @@ import contextlib from datetime import timedelta from ipaddress import IPv4Address, IPv6Address import logging -import socket from urllib.parse import urlparse from async_upnp_client.search import SsdpSearchListener @@ -163,9 +162,6 @@ UPDATE_REQUEST_PROPERTIES = [ "active_mode", ] -BULB_NETWORK_EXCEPTIONS = (socket.error,) -BULB_EXCEPTIONS = (BulbException, asyncio.TimeoutError, *BULB_NETWORK_EXCEPTIONS) - PLATFORMS = ["binary_sensor", "light"] @@ -270,7 +266,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: try: device = await _async_get_device(hass, entry.data[CONF_HOST], entry) await _async_initialize(hass, entry, device) - except BULB_EXCEPTIONS as ex: + except (asyncio.TimeoutError, OSError, BulbException) as ex: raise ConfigEntryNotReady from ex hass.config_entries.async_setup_platforms(entry, PLATFORMS) @@ -594,13 +590,20 @@ class YeelightDevice: self._available = True if not self._initialized: self._initialized = True - except BULB_NETWORK_EXCEPTIONS as ex: + except OSError as ex: if self._available: # just inform once _LOGGER.error( "Unable to update device %s, %s: %s", self._host, self.name, ex ) self._available = False - except BULB_EXCEPTIONS as ex: + except asyncio.TimeoutError as ex: + _LOGGER.debug( + "timed out while trying to update device %s, %s: %s", + self._host, + self.name, + ex, + ) + except BulbException as ex: _LOGGER.debug( "Unable to update device %s, %s: %s", self._host, self.name, ex ) diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 67c9dc2ba07..e40fd2726b2 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -1,6 +1,7 @@ """Light platform support for yeelight.""" from __future__ import annotations +import asyncio import logging import math @@ -8,6 +9,7 @@ import voluptuous as vol import yeelight from yeelight import Bulb, Flow, RGBTransition, SleepTransition, flows from yeelight.enums import BulbType, LightType, PowerMode, SceneClass +from yeelight.main import BulbException from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -51,8 +53,6 @@ from . import ( ATTR_COUNT, ATTR_MODE_MUSIC, ATTR_TRANSITIONS, - BULB_EXCEPTIONS, - BULB_NETWORK_EXCEPTIONS, CONF_FLOW_PARAMS, CONF_MODE_MUSIC, CONF_NIGHTLIGHT_SWITCH, @@ -243,23 +243,33 @@ def _async_cmd(func): """Define a wrapper to catch exceptions from the bulb.""" async def _async_wrap(self, *args, **kwargs): - try: - _LOGGER.debug("Calling %s with %s %s", func, args, kwargs) - return await func(self, *args, **kwargs) - except BULB_NETWORK_EXCEPTIONS as ex: - # A network error happened, the bulb is likely offline now - self.device.async_mark_unavailable() - self.async_state_changed() - exc_message = str(ex) or type(ex) - raise HomeAssistantError( - f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" - ) from ex - except BULB_EXCEPTIONS as ex: - # The bulb likely responded but had an error - exc_message = str(ex) or type(ex) - raise HomeAssistantError( - f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" - ) from ex + for attempts in range(2): + try: + _LOGGER.debug("Calling %s with %s %s", func, args, kwargs) + return await func(self, *args, **kwargs) + except asyncio.TimeoutError as ex: + # The wifi likely dropped, so we want to retry once since + # python-yeelight will auto reconnect + exc_message = str(ex) or type(ex) + if attempts == 0: + continue + raise HomeAssistantError( + f"Timed out when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" + ) from ex + except OSError as ex: + # A network error happened, the bulb is likely offline now + self.device.async_mark_unavailable() + self.async_state_changed() + exc_message = str(ex) or type(ex) + raise HomeAssistantError( + f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" + ) from ex + except BulbException as ex: + # The bulb likely responded but had an error + exc_message = str(ex) or type(ex) + raise HomeAssistantError( + f"Error when calling {func.__name__} for bulb {self.device.name} at {self.device.host}: {exc_message}" + ) from ex return _async_wrap diff --git a/homeassistant/components/yeelight/manifest.json b/homeassistant/components/yeelight/manifest.json index 632fdf426f2..4682215092b 100644 --- a/homeassistant/components/yeelight/manifest.json +++ b/homeassistant/components/yeelight/manifest.json @@ -2,7 +2,7 @@ "domain": "yeelight", "name": "Yeelight", "documentation": "https://www.home-assistant.io/integrations/yeelight", - "requirements": ["yeelight==0.7.7", "async-upnp-client==0.22.8"], + "requirements": ["yeelight==0.7.8", "async-upnp-client==0.22.8"], "codeowners": ["@rytilahti", "@zewelor", "@shenxn", "@starkillerOG"], "config_flow": true, "dependencies": ["network"], diff --git a/requirements_all.txt b/requirements_all.txt index 923ebd15422..8a7eb79934d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2459,7 +2459,7 @@ yalesmartalarmclient==0.3.4 yalexs==1.1.13 # homeassistant.components.yeelight -yeelight==0.7.7 +yeelight==0.7.8 # homeassistant.components.yeelightsunflower yeelightsunflower==0.0.10 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c4b80b8657d..349912a5b25 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1403,7 +1403,7 @@ yalesmartalarmclient==0.3.4 yalexs==1.1.13 # homeassistant.components.yeelight -yeelight==0.7.7 +yeelight==0.7.8 # homeassistant.components.youless youless-api==0.14 diff --git a/tests/components/yeelight/test_init.py b/tests/components/yeelight/test_init.py index 7ddb2845ac8..73d2543f9d4 100644 --- a/tests/components/yeelight/test_init.py +++ b/tests/components/yeelight/test_init.py @@ -1,7 +1,9 @@ """Test Yeelight.""" +import asyncio from datetime import timedelta from unittest.mock import AsyncMock, patch +import pytest from yeelight import BulbException, BulbType from yeelight.aio import KEY_CONNECTED @@ -507,3 +509,51 @@ async def test_connection_dropped_resyncs_properties(hass: HomeAssistant): ) await hass.async_block_till_done() assert len(mocked_bulb.async_get_properties.mock_calls) == 2 + + +async def test_oserror_on_first_update_results_in_unavailable(hass: HomeAssistant): + """Test that an OSError on first update results in unavailable.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + unique_id=ID, + data={CONF_HOST: "127.0.0.1"}, + options={CONF_NAME: "Test name"}, + ) + config_entry.add_to_hass(hass) + mocked_bulb = _mocked_bulb() + mocked_bulb.async_get_properties = AsyncMock(side_effect=OSError) + + with _patch_discovery(), _patch_discovery_timeout(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=mocked_bulb + ): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + assert hass.states.get("light.test_name").state == STATE_UNAVAILABLE + + +@pytest.mark.parametrize("exception", [BulbException, asyncio.TimeoutError]) +async def test_non_oserror_exception_on_first_update( + hass: HomeAssistant, exception: Exception +): + """Test that an exceptions other than OSError on first update do not result in unavailable. + + The unavailable state will come as a push update in this case + """ + config_entry = MockConfigEntry( + domain=DOMAIN, + unique_id=ID, + data={CONF_HOST: "127.0.0.1"}, + options={CONF_NAME: "Test name"}, + ) + config_entry.add_to_hass(hass) + mocked_bulb = _mocked_bulb() + mocked_bulb.async_get_properties = AsyncMock(side_effect=exception) + + with _patch_discovery(), _patch_discovery_timeout(), _patch_discovery_interval(), patch( + f"{MODULE}.AsyncBulb", return_value=mocked_bulb + ): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + assert hass.states.get("light.test_name").state != STATE_UNAVAILABLE From aac798660f63a377562e2043da21ee08531f1d0d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 15 Oct 2021 06:37:23 -1000 Subject: [PATCH 152/162] Always send color/temp when switching from an effect in yeelight (#57745) --- homeassistant/components/yeelight/light.py | 18 +++++-- tests/components/yeelight/test_light.py | 59 ++++++++++++++++++++++ 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index e40fd2726b2..abe1285f609 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -631,7 +631,11 @@ class YeelightGenericLight(YeelightEntity, LightEntity): """Set bulb's color.""" if not hs_color or COLOR_MODE_HS not in self.supported_color_modes: return - if self.color_mode == COLOR_MODE_HS and self.hs_color == hs_color: + if ( + not self.device.is_color_flow_enabled + and self.color_mode == COLOR_MODE_HS + and self.hs_color == hs_color + ): _LOGGER.debug("HS already set to: %s", hs_color) # Already set, and since we get pushed updates # we avoid setting it again to ensure we do not @@ -648,7 +652,11 @@ class YeelightGenericLight(YeelightEntity, LightEntity): """Set bulb's color.""" if not rgb or COLOR_MODE_RGB not in self.supported_color_modes: return - if self.color_mode == COLOR_MODE_RGB and self.rgb_color == rgb: + if ( + not self.device.is_color_flow_enabled + and self.color_mode == COLOR_MODE_RGB + and self.rgb_color == rgb + ): _LOGGER.debug("RGB already set to: %s", rgb) # Already set, and since we get pushed updates # we avoid setting it again to ensure we do not @@ -667,7 +675,11 @@ class YeelightGenericLight(YeelightEntity, LightEntity): return temp_in_k = mired_to_kelvin(colortemp) - if self.color_mode == COLOR_MODE_COLOR_TEMP and self.color_temp == colortemp: + if ( + not self.device.is_color_flow_enabled + and self.color_mode == COLOR_MODE_COLOR_TEMP + and self.color_temp == colortemp + ): _LOGGER.debug("Color temp already set to: %s", temp_in_k) # Already set, and since we get pushed updates # we avoid setting it again to ensure we do not diff --git a/tests/components/yeelight/test_light.py b/tests/components/yeelight/test_light.py index 9c5a76e4a4b..42ac3675548 100644 --- a/tests/components/yeelight/test_light.py +++ b/tests/components/yeelight/test_light.py @@ -625,6 +625,22 @@ async def test_state_already_set_avoid_ratelimit(hass: HomeAssistant): assert mocked_bulb.async_set_brightness.mock_calls == [] mocked_bulb.async_set_rgb.reset_mock() + mocked_bulb.last_properties["flowing"] = "1" + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_RGB_COLOR: (red, green, blue)}, + blocking=True, + ) + assert mocked_bulb.async_set_hsv.mock_calls == [] + assert mocked_bulb.async_set_rgb.mock_calls == [ + call(255, 0, 0, duration=350, light_type=ANY) + ] + assert mocked_bulb.async_set_color_temp.mock_calls == [] + assert mocked_bulb.async_set_brightness.mock_calls == [] + mocked_bulb.async_set_rgb.reset_mock() + mocked_bulb.last_properties["flowing"] = "0" + await hass.services.async_call( "light", SERVICE_TURN_ON, @@ -666,6 +682,22 @@ async def test_state_already_set_avoid_ratelimit(hass: HomeAssistant): assert mocked_bulb.async_set_color_temp.mock_calls == [] assert mocked_bulb.async_set_brightness.mock_calls == [] + mocked_bulb.last_properties["flowing"] = "1" + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_COLOR_TEMP: 250}, + blocking=True, + ) + assert mocked_bulb.async_set_hsv.mock_calls == [] + assert mocked_bulb.async_set_rgb.mock_calls == [] + assert mocked_bulb.async_set_color_temp.mock_calls == [ + call(4000, duration=350, light_type=ANY) + ] + assert mocked_bulb.async_set_brightness.mock_calls == [] + mocked_bulb.async_set_color_temp.reset_mock() + mocked_bulb.last_properties["flowing"] = "0" + mocked_bulb.last_properties["color_mode"] = 3 # This last change should generate a call even though # the color mode is the same since the HSV has changed @@ -681,6 +713,33 @@ async def test_state_already_set_avoid_ratelimit(hass: HomeAssistant): assert mocked_bulb.async_set_rgb.mock_calls == [] assert mocked_bulb.async_set_color_temp.mock_calls == [] assert mocked_bulb.async_set_brightness.mock_calls == [] + mocked_bulb.async_set_hsv.reset_mock() + + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_HS_COLOR: (100, 35)}, + blocking=True, + ) + assert mocked_bulb.async_set_hsv.mock_calls == [] + assert mocked_bulb.async_set_rgb.mock_calls == [] + assert mocked_bulb.async_set_color_temp.mock_calls == [] + assert mocked_bulb.async_set_brightness.mock_calls == [] + + mocked_bulb.last_properties["flowing"] = "1" + await hass.services.async_call( + "light", + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_HS_COLOR: (100, 35)}, + blocking=True, + ) + assert mocked_bulb.async_set_hsv.mock_calls == [ + call(100.0, 35.0, duration=350, light_type=ANY) + ] + assert mocked_bulb.async_set_rgb.mock_calls == [] + assert mocked_bulb.async_set_color_temp.mock_calls == [] + assert mocked_bulb.async_set_brightness.mock_calls == [] + mocked_bulb.last_properties["flowing"] = "0" async def test_device_types(hass: HomeAssistant, caplog): From a2bc69003e8961aab90f4c24ae86fd0fef9ce0e4 Mon Sep 17 00:00:00 2001 From: gjong Date: Fri, 15 Oct 2021 12:24:51 +0200 Subject: [PATCH 153/162] Fix Youless state class for power total sensor (#57758) --- homeassistant/components/youless/sensor.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/youless/sensor.py b/homeassistant/components/youless/sensor.py index 24983bb567b..d4465bd0c09 100644 --- a/homeassistant/components/youless/sensor.py +++ b/homeassistant/components/youless/sensor.py @@ -5,6 +5,7 @@ from youless_api.youless_sensor import YoulessSensor from homeassistant.components.sensor import ( STATE_CLASS_MEASUREMENT, + STATE_CLASS_TOTAL, STATE_CLASS_TOTAL_INCREASING, SensorEntity, ) @@ -40,9 +41,9 @@ async def async_setup_entry( async_add_entities( [ GasSensor(coordinator, device), - PowerMeterSensor(coordinator, device, "low"), - PowerMeterSensor(coordinator, device, "high"), - PowerMeterSensor(coordinator, device, "total"), + PowerMeterSensor(coordinator, device, "low", STATE_CLASS_TOTAL_INCREASING), + PowerMeterSensor(coordinator, device, "high", STATE_CLASS_TOTAL_INCREASING), + PowerMeterSensor(coordinator, device, "total", STATE_CLASS_TOTAL), CurrentPowerSensor(coordinator, device), DeliveryMeterSensor(coordinator, device, "low"), DeliveryMeterSensor(coordinator, device, "high"), @@ -168,7 +169,11 @@ class PowerMeterSensor(YoulessBaseSensor): _attr_state_class = STATE_CLASS_TOTAL_INCREASING def __init__( - self, coordinator: DataUpdateCoordinator, device: str, dev_type: str + self, + coordinator: DataUpdateCoordinator, + device: str, + dev_type: str, + state_class: str, ) -> None: """Instantiate a power meter sensor.""" super().__init__( @@ -177,6 +182,7 @@ class PowerMeterSensor(YoulessBaseSensor): self._device = device self._type = dev_type self._attr_name = f"Power {dev_type}" + self._attr_state_class = state_class @property def get_sensor(self) -> YoulessSensor | None: From 0505891ab1a831dd4828dfe37f1e4c0ede93a9f7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 15 Oct 2021 10:27:39 -0700 Subject: [PATCH 154/162] Bumped version to 2021.10.5 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 2bd8a2e7719..02d3b6db432 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "4" +PATCH_VERSION: Final = "5" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0) From 31b1d170a121071b0b5dda4d3e919ee2636253bf Mon Sep 17 00:00:00 2001 From: Steven Looman Date: Fri, 15 Oct 2021 22:03:03 +0200 Subject: [PATCH 155/162] Fix broken upnp derived sensors reporting b/s instead of kb/s (#57681) --- homeassistant/components/upnp/__init__.py | 2 +- homeassistant/components/upnp/sensor.py | 5 +- tests/components/upnp/conftest.py | 30 +++++- tests/components/upnp/test_binary_sensor.py | 42 ++++++++ tests/components/upnp/test_config_flow.py | 3 +- tests/components/upnp/test_init.py | 5 - tests/components/upnp/test_sensor.py | 114 ++++++++++++++++++++ 7 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 tests/components/upnp/test_binary_sensor.py create mode 100644 tests/components/upnp/test_sensor.py diff --git a/homeassistant/components/upnp/__init__.py b/homeassistant/components/upnp/__init__.py index d2d59d78c0e..ef3bad6da47 100644 --- a/homeassistant/components/upnp/__init__.py +++ b/homeassistant/components/upnp/__init__.py @@ -264,5 +264,5 @@ class UpnpEntity(CoordinatorEntity): def available(self) -> bool: """Return if entity is available.""" return super().available and ( - self.coordinator.data.get(self.entity_description.key) or False + self.coordinator.data.get(self.entity_description.key) is not None ) diff --git a/homeassistant/components/upnp/sensor.py b/homeassistant/components/upnp/sensor.py index 334dc9e8c22..f7cc242f6f1 100644 --- a/homeassistant/components/upnp/sensor.py +++ b/homeassistant/components/upnp/sensor.py @@ -190,7 +190,10 @@ class DerivedUpnpSensor(UpnpSensor): # Calculate derivative. delta_value = current_value - self._last_value - if self.entity_description.native_unit_of_measurement == DATA_BYTES: + if ( + self.entity_description.native_unit_of_measurement + == DATA_RATE_KIBIBYTES_PER_SECOND + ): delta_value /= KIBIBYTE delta_time = current_timestamp - self._last_timestamp if delta_time.total_seconds() == 0: diff --git a/tests/components/upnp/conftest.py b/tests/components/upnp/conftest.py index 5af99e9ac2d..54a7fce44fb 100644 --- a/tests/components/upnp/conftest.py +++ b/tests/components/upnp/conftest.py @@ -9,6 +9,9 @@ from homeassistant.components import ssdp from homeassistant.components.upnp.const import ( BYTES_RECEIVED, BYTES_SENT, + CONFIG_ENTRY_ST, + CONFIG_ENTRY_UDN, + DOMAIN, PACKETS_RECEIVED, PACKETS_SENT, ROUTER_IP, @@ -19,6 +22,8 @@ from homeassistant.components.upnp.const import ( from homeassistant.core import HomeAssistant from homeassistant.util import dt +from tests.common import MockConfigEntry + TEST_UDN = "uuid:device" TEST_ST = "urn:schemas-upnp-org:device:InternetGatewayDevice:1" TEST_USN = f"{TEST_UDN}::{TEST_ST}" @@ -115,8 +120,8 @@ class MockDevice: self.status_times_polled += 1 return { WAN_STATUS: "Connected", - ROUTER_UPTIME: 0, - ROUTER_IP: "192.168.0.1", + ROUTER_UPTIME: 10, + ROUTER_IP: "8.9.10.11", } @@ -185,3 +190,24 @@ async def ssdp_no_discovery(): return_value=[], ) as mock_get_info: yield (mock_register, mock_get_info) + + +@pytest.fixture +async def setup_integration( + hass: HomeAssistant, mock_get_source_ip, ssdp_instant_discovery, mock_upnp_device +): + """Create an initialized integration.""" + entry = MockConfigEntry( + domain=DOMAIN, + data={ + CONFIG_ENTRY_UDN: TEST_UDN, + CONFIG_ENTRY_ST: TEST_ST, + }, + ) + + # Load config_entry. + entry.add_to_hass(hass) + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + yield entry diff --git a/tests/components/upnp/test_binary_sensor.py b/tests/components/upnp/test_binary_sensor.py new file mode 100644 index 00000000000..46f0021a07b --- /dev/null +++ b/tests/components/upnp/test_binary_sensor.py @@ -0,0 +1,42 @@ +"""Tests for UPnP/IGD binary_sensor.""" + +from datetime import timedelta +from unittest.mock import AsyncMock + +from homeassistant.components.upnp.const import ( + DOMAIN, + ROUTER_IP, + ROUTER_UPTIME, + WAN_STATUS, +) +from homeassistant.core import HomeAssistant +import homeassistant.util.dt as dt_util + +from .conftest import MockDevice + +from tests.common import MockConfigEntry, async_fire_time_changed + + +async def test_upnp_binary_sensors( + hass: HomeAssistant, setup_integration: MockConfigEntry +): + """Test normal sensors.""" + mock_device: MockDevice = hass.data[DOMAIN][setup_integration.entry_id].device + + # First poll. + wan_status_state = hass.states.get("binary_sensor.mock_name_wan_status") + assert wan_status_state.state == "on" + + # Second poll. + mock_device.async_get_status = AsyncMock( + return_value={ + WAN_STATUS: "Disconnected", + ROUTER_UPTIME: 100, + ROUTER_IP: "", + } + ) + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=31)) + await hass.async_block_till_done() + + wan_status_state = hass.states.get("binary_sensor.mock_name_wan_status") + assert wan_status_state.state == "off" diff --git a/tests/components/upnp/test_config_flow.py b/tests/components/upnp/test_config_flow.py index fa315804917..a704232ef84 100644 --- a/tests/components/upnp/test_config_flow.py +++ b/tests/components/upnp/test_config_flow.py @@ -25,6 +25,7 @@ from .conftest import ( TEST_ST, TEST_UDN, TEST_USN, + MockDevice, ) from tests.common import MockConfigEntry, async_fire_time_changed @@ -196,7 +197,7 @@ async def test_options_flow(hass: HomeAssistant): config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(config_entry.entry_id) is True await hass.async_block_till_done() - mock_device = hass.data[DOMAIN][config_entry.entry_id].device + mock_device: MockDevice = hass.data[DOMAIN][config_entry.entry_id].device # Reset. mock_device.traffic_times_polled = 0 diff --git a/tests/components/upnp/test_init.py b/tests/components/upnp/test_init.py index 6b3d2a5187f..7729068a2ed 100644 --- a/tests/components/upnp/test_init.py +++ b/tests/components/upnp/test_init.py @@ -9,7 +9,6 @@ from homeassistant.components.upnp.const import ( DOMAIN, ) from homeassistant.core import HomeAssistant -from homeassistant.setup import async_setup_component from .conftest import TEST_ST, TEST_UDN @@ -28,10 +27,6 @@ async def test_async_setup_entry_default(hass: HomeAssistant): }, ) - # Initialisation of component, no device discovered. - await async_setup_component(hass, DOMAIN, {}) - await hass.async_block_till_done() - # Load config_entry. entry.add_to_hass(hass) assert await hass.config_entries.async_setup(entry.entry_id) is True diff --git a/tests/components/upnp/test_sensor.py b/tests/components/upnp/test_sensor.py new file mode 100644 index 00000000000..068b5260d45 --- /dev/null +++ b/tests/components/upnp/test_sensor.py @@ -0,0 +1,114 @@ +"""Tests for UPnP/IGD sensor.""" + +from datetime import timedelta +from unittest.mock import AsyncMock + +from homeassistant.components.upnp.const import ( + BYTES_RECEIVED, + BYTES_SENT, + DOMAIN, + PACKETS_RECEIVED, + PACKETS_SENT, + ROUTER_IP, + ROUTER_UPTIME, + TIMESTAMP, + UPDATE_INTERVAL, + WAN_STATUS, +) +from homeassistant.core import HomeAssistant +import homeassistant.util.dt as dt_util + +from .conftest import MockDevice + +from tests.common import MockConfigEntry, async_fire_time_changed + + +async def test_upnp_sensors(hass: HomeAssistant, setup_integration: MockConfigEntry): + """Test normal sensors.""" + mock_device: MockDevice = hass.data[DOMAIN][setup_integration.entry_id].device + + # First poll. + b_received_state = hass.states.get("sensor.mock_name_b_received") + b_sent_state = hass.states.get("sensor.mock_name_b_sent") + packets_received_state = hass.states.get("sensor.mock_name_packets_received") + packets_sent_state = hass.states.get("sensor.mock_name_packets_sent") + external_ip_state = hass.states.get("sensor.mock_name_external_ip") + wan_status_state = hass.states.get("sensor.mock_name_wan_status") + assert b_received_state.state == "0" + assert b_sent_state.state == "0" + assert packets_received_state.state == "0" + assert packets_sent_state.state == "0" + assert external_ip_state.state == "8.9.10.11" + assert wan_status_state.state == "Connected" + + # Second poll. + mock_device.async_get_traffic_data = AsyncMock( + return_value={ + TIMESTAMP: dt_util.utcnow() + UPDATE_INTERVAL, + BYTES_RECEIVED: 10240, + BYTES_SENT: 20480, + PACKETS_RECEIVED: 30, + PACKETS_SENT: 40, + } + ) + mock_device.async_get_status = AsyncMock( + return_value={ + WAN_STATUS: "Disconnected", + ROUTER_UPTIME: 100, + ROUTER_IP: "", + } + ) + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=31)) + await hass.async_block_till_done() + + b_received_state = hass.states.get("sensor.mock_name_b_received") + b_sent_state = hass.states.get("sensor.mock_name_b_sent") + packets_received_state = hass.states.get("sensor.mock_name_packets_received") + packets_sent_state = hass.states.get("sensor.mock_name_packets_sent") + external_ip_state = hass.states.get("sensor.mock_name_external_ip") + wan_status_state = hass.states.get("sensor.mock_name_wan_status") + assert b_received_state.state == "10240" + assert b_sent_state.state == "20480" + assert packets_received_state.state == "30" + assert packets_sent_state.state == "40" + assert external_ip_state.state == "" + assert wan_status_state.state == "Disconnected" + + +async def test_derived_upnp_sensors( + hass: HomeAssistant, setup_integration: MockConfigEntry +): + """Test derived sensors.""" + mock_device: MockDevice = hass.data[DOMAIN][setup_integration.entry_id].device + + # First poll. + kib_s_received_state = hass.states.get("sensor.mock_name_kib_s_received") + kib_s_sent_state = hass.states.get("sensor.mock_name_kib_s_sent") + packets_s_received_state = hass.states.get("sensor.mock_name_packets_s_received") + packets_s_sent_state = hass.states.get("sensor.mock_name_packets_s_sent") + assert kib_s_received_state.state == "unknown" + assert kib_s_sent_state.state == "unknown" + assert packets_s_received_state.state == "unknown" + assert packets_s_sent_state.state == "unknown" + + # Second poll. + mock_device.async_get_traffic_data = AsyncMock( + return_value={ + TIMESTAMP: dt_util.utcnow() + UPDATE_INTERVAL, + BYTES_RECEIVED: int(10240 * UPDATE_INTERVAL.total_seconds()), + BYTES_SENT: int(20480 * UPDATE_INTERVAL.total_seconds()), + PACKETS_RECEIVED: int(30 * UPDATE_INTERVAL.total_seconds()), + PACKETS_SENT: int(40 * UPDATE_INTERVAL.total_seconds()), + } + ) + async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=31)) + await hass.async_block_till_done() + + kib_s_received_state = hass.states.get("sensor.mock_name_kib_s_received") + kib_s_sent_state = hass.states.get("sensor.mock_name_kib_s_sent") + packets_s_received_state = hass.states.get("sensor.mock_name_packets_s_received") + packets_s_sent_state = hass.states.get("sensor.mock_name_packets_s_sent") + assert kib_s_received_state.state == "10.0" + assert kib_s_sent_state.state == "20.0" + assert packets_s_received_state.state == "30.0" + assert packets_s_sent_state.state == "40.0" From 010daaf990e646dec84820e85f9172dc8ee60a10 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 17 Oct 2021 17:32:02 -1000 Subject: [PATCH 156/162] Avoid setting up harmony websocket from discovery (#57589) --- homeassistant/components/harmony/__init__.py | 13 ++------- .../components/harmony/config_flow.py | 25 ++++++++++------ homeassistant/components/harmony/data.py | 29 +++++++++++++------ .../components/harmony/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/harmony/test_config_flow.py | 29 ++++++++++++++++--- 7 files changed, 66 insertions(+), 36 deletions(-) diff --git a/homeassistant/components/harmony/__init__.py b/homeassistant/components/harmony/__init__.py index c541aa0e0e3..e2ac03e259c 100644 --- a/homeassistant/components/harmony/__init__.py +++ b/homeassistant/components/harmony/__init__.py @@ -1,12 +1,10 @@ """The Logitech Harmony Hub integration.""" -import asyncio import logging from homeassistant.components.remote import ATTR_ACTIVITY, ATTR_DELAY_SECS from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, CONF_NAME, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HomeAssistant, callback -from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import entity_registry from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -34,13 +32,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: address = entry.data[CONF_HOST] name = entry.data[CONF_NAME] data = HarmonyData(hass, address, name, entry.unique_id) - try: - connected_ok = await data.connect() - except (asyncio.TimeoutError, ValueError, AttributeError) as err: - raise ConfigEntryNotReady from err - - if not connected_ok: - raise ConfigEntryNotReady + await data.connect() await _migrate_old_unique_ids(hass, entry.entry_id, data) @@ -51,8 +43,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: cancel_stop = hass.bus.async_listen(EVENT_HOMEASSISTANT_STOP, _async_on_stop) - hass.data.setdefault(DOMAIN, {}) - hass.data[DOMAIN][entry.entry_id] = { + hass.data.setdefault(DOMAIN, {})[entry.entry_id] = { HARMONY_DATA: data, CANCEL_LISTENER: cancel_listener, CANCEL_STOP: cancel_stop, diff --git a/homeassistant/components/harmony/config_flow.py b/homeassistant/components/harmony/config_flow.py index b1e71ac2dab..1c735b0747d 100644 --- a/homeassistant/components/harmony/config_flow.py +++ b/homeassistant/components/harmony/config_flow.py @@ -1,7 +1,10 @@ """Config flow for Logitech Harmony Hub integration.""" +import asyncio import logging from urllib.parse import urlparse +from aioharmony.hubconnector_websocket import HubConnector +import aiohttp import voluptuous as vol from homeassistant import config_entries, exceptions @@ -94,16 +97,20 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): CONF_NAME: friendly_name, } - harmony = await get_harmony_client_if_available(parsed_url.hostname) - - if harmony: - unique_id = find_unique_id_for_remote(harmony) - await self.async_set_unique_id(unique_id) - self._abort_if_unique_id_configured( - updates={CONF_HOST: self.harmony_config[CONF_HOST]} - ) - self.harmony_config[UNIQUE_ID] = unique_id + connector = HubConnector(parsed_url.hostname, asyncio.Queue()) + try: + remote_id = await connector.get_remote_id() + except aiohttp.ClientError: + return self.async_abort(reason="cannot_connect") + finally: + await connector.async_close_session() + unique_id = str(remote_id) + await self.async_set_unique_id(str(unique_id)) + self._abort_if_unique_id_configured( + updates={CONF_HOST: self.harmony_config[CONF_HOST]} + ) + self.harmony_config[UNIQUE_ID] = unique_id return await self.async_step_link() async def async_step_link(self, user_input=None): diff --git a/homeassistant/components/harmony/data.py b/homeassistant/components/harmony/data.py index 6fdf18df612..78377265c07 100644 --- a/homeassistant/components/harmony/data.py +++ b/homeassistant/components/harmony/data.py @@ -1,6 +1,7 @@ """Harmony data object which contains the Harmony Client.""" from __future__ import annotations +import asyncio from collections.abc import Iterable import logging @@ -8,6 +9,8 @@ from aioharmony.const import ClientCallbackType, SendCommandDevice import aioharmony.exceptions as aioexc from aioharmony.harmonyapi import HarmonyAPI as HarmonyClient +from homeassistant.exceptions import ConfigEntryNotReady + from .const import ACTIVITY_POWER_OFF from .subscriber import HarmonySubscriberMixin @@ -109,16 +112,24 @@ class HarmonyData(HarmonySubscriberMixin): ip_address=self._address, callbacks=ClientCallbackType(**callbacks) ) + connected = False try: - if not await self._client.connect(): - _LOGGER.warning("%s: Unable to connect to HUB", self._name) - await self._client.close() - return False - except aioexc.TimeOut: - _LOGGER.warning("%s: Connection timed-out", self._name) - return False - - return True + connected = await self._client.connect() + except (asyncio.TimeoutError, aioexc.TimeOut) as err: + await self._client.close() + raise ConfigEntryNotReady( + f"{self._name}: Connection timed-out to {self._address}:8088" + ) from err + except (ValueError, AttributeError) as err: + await self._client.close() + raise ConfigEntryNotReady( + f"{self._name}: Error {err} while connected HUB at: {self._address}:8088" + ) from err + if not connected: + await self._client.close() + raise ConfigEntryNotReady( + f"{self._name}: Unable to connect to HUB at: {self._address}:8088" + ) async def shutdown(self): """Close connection on shutdown.""" diff --git a/homeassistant/components/harmony/manifest.json b/homeassistant/components/harmony/manifest.json index f35f4e99303..d1b1073ebad 100644 --- a/homeassistant/components/harmony/manifest.json +++ b/homeassistant/components/harmony/manifest.json @@ -2,7 +2,7 @@ "domain": "harmony", "name": "Logitech Harmony Hub", "documentation": "https://www.home-assistant.io/integrations/harmony", - "requirements": ["aioharmony==0.2.7"], + "requirements": ["aioharmony==0.2.8"], "codeowners": [ "@ehendrix23", "@bramkragten", diff --git a/requirements_all.txt b/requirements_all.txt index 8a7eb79934d..43c701a3c2c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -179,7 +179,7 @@ aiogithubapi==21.8.0 aioguardian==1.0.8 # homeassistant.components.harmony -aioharmony==0.2.7 +aioharmony==0.2.8 # homeassistant.components.homekit_controller aiohomekit==0.6.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 349912a5b25..ee01c962a5b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -118,7 +118,7 @@ aioflo==0.4.1 aioguardian==1.0.8 # homeassistant.components.harmony -aioharmony==0.2.7 +aioharmony==0.2.8 # homeassistant.components.homekit_controller aiohomekit==0.6.3 diff --git a/tests/components/harmony/test_config_flow.py b/tests/components/harmony/test_config_flow.py index d81adabb916..0e8b6dd67d9 100644 --- a/tests/components/harmony/test_config_flow.py +++ b/tests/components/harmony/test_config_flow.py @@ -1,6 +1,8 @@ """Test the Logitech Harmony Hub config flow.""" from unittest.mock import AsyncMock, MagicMock, patch +import aiohttp + from homeassistant import config_entries, data_entry_flow, setup from homeassistant.components.harmony.config_flow import CannotConnect from homeassistant.components.harmony.const import DOMAIN, PREVIOUS_ACTIVE_ACTIVITY @@ -50,11 +52,9 @@ async def test_form_ssdp(hass): """Test we get the form with ssdp source.""" await setup.async_setup_component(hass, "persistent_notification", {}) - harmonyapi = _get_mock_harmonyapi(connect=True) - with patch( - "homeassistant.components.harmony.util.HarmonyAPI", - return_value=harmonyapi, + "homeassistant.components.harmony.config_flow.HubConnector.get_remote_id", + return_value=1234, ): result = await hass.config_entries.flow.async_init( DOMAIN, @@ -76,6 +76,8 @@ async def test_form_ssdp(hass): assert progress[0]["flow_id"] == result["flow_id"] assert progress[0]["context"]["confirm_only"] is True + harmonyapi = _get_mock_harmonyapi(connect=True) + with patch( "homeassistant.components.harmony.util.HarmonyAPI", return_value=harmonyapi, @@ -95,6 +97,25 @@ async def test_form_ssdp(hass): assert len(mock_setup_entry.mock_calls) == 1 +async def test_form_ssdp_fails_to_get_remote_id(hass): + """Test we abort if we cannot get the remote id.""" + + with patch( + "homeassistant.components.harmony.config_flow.HubConnector.get_remote_id", + side_effect=aiohttp.ClientError, + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_SSDP}, + data={ + "friendlyName": "Harmony Hub", + "ssdp_location": "http://192.168.1.12:8088/description", + }, + ) + assert result["type"] == "abort" + assert result["reason"] == "cannot_connect" + + async def test_form_ssdp_aborts_before_checking_remoteid_if_host_known(hass): """Test we abort without connecting if the host is already known.""" await setup.async_setup_component(hass, "persistent_notification", {}) From 60eb47e1aef5be4a9bd6cb0b49351952c3fe1dc0 Mon Sep 17 00:00:00 2001 From: Johannes la Poutre Date: Sun, 17 Oct 2021 18:49:18 +0200 Subject: [PATCH 157/162] Fix device class for energy plugwise sensors (#57803) Co-authored-by: Franck Nijhof --- homeassistant/components/plugwise/sensor.py | 23 +++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/plugwise/sensor.py b/homeassistant/components/plugwise/sensor.py index 854c2e6676c..888f5bac5c2 100644 --- a/homeassistant/components/plugwise/sensor.py +++ b/homeassistant/components/plugwise/sensor.py @@ -5,6 +5,7 @@ import logging from homeassistant.components.sensor import SensorEntity from homeassistant.const import ( DEVICE_CLASS_BATTERY, + DEVICE_CLASS_ENERGY, DEVICE_CLASS_ILLUMINANCE, DEVICE_CLASS_POWER, DEVICE_CLASS_PRESSURE, @@ -68,32 +69,32 @@ ENERGY_SENSOR_MAP = { "electricity_consumed_interval": [ "Consumed Power Interval", ENERGY_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_consumed_peak_interval": [ "Consumed Power Interval", ENERGY_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_consumed_off_peak_interval": [ "Consumed Power Interval (off peak)", ENERGY_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_produced_interval": [ "Produced Power Interval", ENERGY_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_produced_peak_interval": [ "Produced Power Interval", ENERGY_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_produced_off_peak_interval": [ "Produced Power Interval (off peak)", ENERGY_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_consumed_off_peak_point": [ "Current Consumed Power (off peak)", @@ -108,12 +109,12 @@ ENERGY_SENSOR_MAP = { "electricity_consumed_off_peak_cumulative": [ "Cumulative Consumed Power (off peak)", ENERGY_KILO_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_consumed_peak_cumulative": [ "Cumulative Consumed Power", ENERGY_KILO_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_produced_off_peak_point": [ "Current Produced Power (off peak)", @@ -128,12 +129,12 @@ ENERGY_SENSOR_MAP = { "electricity_produced_off_peak_cumulative": [ "Cumulative Produced Power (off peak)", ENERGY_KILO_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "electricity_produced_peak_cumulative": [ "Cumulative Produced Power", ENERGY_KILO_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], "gas_consumed_interval": [ "Current Consumed Gas Interval", @@ -145,7 +146,7 @@ ENERGY_SENSOR_MAP = { "net_electricity_cumulative": [ "Cumulative net Power", ENERGY_KILO_WATT_HOUR, - DEVICE_CLASS_POWER, + DEVICE_CLASS_ENERGY, ], } From be3f32ef711780149aa8cc06adf7cb152bb05f3b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 17 Oct 2021 17:30:43 -1000 Subject: [PATCH 158/162] Prevent yeelight discovery from overloading the bulb (#57820) --- .../components/yeelight/config_flow.py | 28 ++++++++++++++----- tests/components/yeelight/test_config_flow.py | 12 ++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/yeelight/config_flow.py b/homeassistant/components/yeelight/config_flow.py index d59e03c965d..f4aab12a34a 100644 --- a/homeassistant/components/yeelight/config_flow.py +++ b/homeassistant/components/yeelight/config_flow.py @@ -8,6 +8,7 @@ from yeelight.aio import AsyncBulb from homeassistant import config_entries, exceptions from homeassistant.components.dhcp import IP_ADDRESS +from homeassistant.config_entries import ConfigEntryState from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_ID, CONF_NAME from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -66,18 +67,30 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): await self.async_set_unique_id( "{0:#0{1}x}".format(int(discovery_info["name"][-26:-18]), 18) ) - self._abort_if_unique_id_configured( - updates={CONF_HOST: self._discovered_ip}, reload_on_update=False - ) - return await self._async_handle_discovery() + return await self._async_handle_discovery_with_unique_id() async def async_step_ssdp(self, discovery_info): """Handle discovery from ssdp.""" self._discovered_ip = urlparse(discovery_info["location"]).hostname await self.async_set_unique_id(discovery_info["id"]) - self._abort_if_unique_id_configured( - updates={CONF_HOST: self._discovered_ip}, reload_on_update=False - ) + return await self._async_handle_discovery_with_unique_id() + + async def _async_handle_discovery_with_unique_id(self): + """Handle any discovery with a unique id.""" + for entry in self._async_current_entries(): + if entry.unique_id != self.unique_id: + continue + reload = entry.state == ConfigEntryState.SETUP_RETRY + if entry.data[CONF_HOST] != self._discovered_ip: + self.hass.config_entries.async_update_entry( + entry, data={**entry.data, CONF_HOST: self._discovered_ip} + ) + reload = True + if reload: + self.hass.async_create_task( + self.hass.config_entries.async_reload(entry.entry_id) + ) + return self.async_abort(reason="already_configured") return await self._async_handle_discovery() async def _async_handle_discovery(self): @@ -86,6 +99,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): for progress in self._async_in_progress(): if progress.get("context", {}).get(CONF_HOST) == self._discovered_ip: return self.async_abort(reason="already_in_progress") + self._async_abort_entries_match({CONF_HOST: self._discovered_ip}) try: self._discovered_model = await self._async_try_connect( diff --git a/tests/components/yeelight/test_config_flow.py b/tests/components/yeelight/test_config_flow.py index 8d4b7f48543..d03c6b90c11 100644 --- a/tests/components/yeelight/test_config_flow.py +++ b/tests/components/yeelight/test_config_flow.py @@ -502,6 +502,18 @@ async def test_discovered_by_dhcp_or_homekit(hass, source, data): assert mock_async_setup.called assert mock_async_setup_entry.called + with _patch_discovery( + no_device=True + ), _patch_discovery_timeout(), _patch_discovery_interval(), patch( + f"{MODULE_CONFIG_FLOW}.AsyncBulb", side_effect=CannotConnect + ): + result3 = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": source}, data=data + ) + await hass.async_block_till_done() + assert result3["type"] == RESULT_TYPE_ABORT + assert result3["reason"] == "already_configured" + @pytest.mark.parametrize( "source, data", From bb6a9a7e2e252550b34be7e292563b4cdacc9ecc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 16 Oct 2021 15:57:11 -1000 Subject: [PATCH 159/162] Bump bond-api to 0.1.14 (#57874) --- homeassistant/components/bond/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/bond/manifest.json b/homeassistant/components/bond/manifest.json index 7d1486b2e8f..6f11b8c66e3 100644 --- a/homeassistant/components/bond/manifest.json +++ b/homeassistant/components/bond/manifest.json @@ -3,7 +3,7 @@ "name": "Bond", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/bond", - "requirements": ["bond-api==0.1.13"], + "requirements": ["bond-api==0.1.14"], "zeroconf": ["_bond._tcp.local."], "codeowners": ["@prystupa", "@joshs85"], "quality_scale": "platinum", diff --git a/requirements_all.txt b/requirements_all.txt index 43c701a3c2c..421c30bcda8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -415,7 +415,7 @@ blockchain==1.4.4 # bme680==1.0.5 # homeassistant.components.bond -bond-api==0.1.13 +bond-api==0.1.14 # homeassistant.components.bosch_shc boschshcpy==0.2.19 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index ee01c962a5b..a66f4d2a565 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -254,7 +254,7 @@ blebox_uniapi==1.3.3 blinkpy==0.17.0 # homeassistant.components.bond -bond-api==0.1.13 +bond-api==0.1.14 # homeassistant.components.bosch_shc boschshcpy==0.2.19 From 589db0615f75a8d767c51132dc4af021f196fd4d Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Mon, 18 Oct 2021 01:21:56 +0200 Subject: [PATCH 160/162] Revert "Fix bmw_conntected_drive check_control_message short description" (#57928) This reverts commit acda3afe63fd051d035192a3983d2d48ff35289c. --- homeassistant/components/bmw_connected_drive/binary_sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/bmw_connected_drive/binary_sensor.py b/homeassistant/components/bmw_connected_drive/binary_sensor.py index 225ec5f7f99..a7fd72fc1a7 100644 --- a/homeassistant/components/bmw_connected_drive/binary_sensor.py +++ b/homeassistant/components/bmw_connected_drive/binary_sensor.py @@ -122,7 +122,7 @@ class BMWConnectedDriveSensor(BMWConnectedDriveBaseEntity, BinarySensorEntity): if has_check_control_messages: cbs_list = [] for message in check_control_messages: - cbs_list.append(message.description_short) + cbs_list.append(message["ccmDescriptionShort"]) result["check_control_messages"] = cbs_list else: result["check_control_messages"] = "OK" From b5f2bffc96c0903e747eb4d063eddd226ba6f617 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sun, 17 Oct 2021 21:32:18 -0600 Subject: [PATCH 161/162] Fix bug that prevents multiple instances of Tile (#57942) --- homeassistant/components/tile/__init__.py | 4 +++- homeassistant/components/tile/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/tile/__init__.py b/homeassistant/components/tile/__init__.py index 5b52e637c64..56073d7a63d 100644 --- a/homeassistant/components/tile/__init__.py +++ b/homeassistant/components/tile/__init__.py @@ -60,7 +60,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: await async_migrate_entries(hass, entry.entry_id, async_migrate_callback) - websession = aiohttp_client.async_get_clientsession(hass) + # Tile's API uses cookies to identify a consumer; in order to allow for multiple + # instances of this config entry, we use a new session each time: + websession = aiohttp_client.async_create_clientsession(hass) try: client = await async_login( diff --git a/homeassistant/components/tile/manifest.json b/homeassistant/components/tile/manifest.json index 39295eed646..4e9913615a9 100644 --- a/homeassistant/components/tile/manifest.json +++ b/homeassistant/components/tile/manifest.json @@ -3,7 +3,7 @@ "name": "Tile", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/tile", - "requirements": ["pytile==5.2.3"], + "requirements": ["pytile==5.2.4"], "codeowners": ["@bachya"], "iot_class": "cloud_polling" } diff --git a/requirements_all.txt b/requirements_all.txt index 421c30bcda8..32793e053b7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1964,7 +1964,7 @@ python_opendata_transport==0.2.1 pythonegardia==1.0.40 # homeassistant.components.tile -pytile==5.2.3 +pytile==5.2.4 # homeassistant.components.touchline pytouchline==0.7 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a66f4d2a565..13bb6f707ba 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1127,7 +1127,7 @@ python-twitch-client==0.6.0 python_awair==0.2.1 # homeassistant.components.tile -pytile==5.2.3 +pytile==5.2.4 # homeassistant.components.traccar pytraccar==0.9.0 From c3766a81367521d4a5ed1bff67c76151d11225a6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 17 Oct 2021 22:31:40 -0700 Subject: [PATCH 162/162] Bumped version to 2021.10.6 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 02d3b6db432..6895f18472a 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -5,7 +5,7 @@ from typing import Final MAJOR_VERSION: Final = 2021 MINOR_VERSION: Final = 10 -PATCH_VERSION: Final = "5" +PATCH_VERSION: Final = "6" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}" REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 8, 0)